]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/Snapshot.js
Warn about file system state when a freeze would be needed, but isn't possible
[pve-manager.git] / www / manager6 / window / Snapshot.js
CommitLineData
4e0e6b77
DC
1Ext.define('PVE.window.Snapshot', {
2 extend: 'Proxmox.window.Edit',
3
a6ebb96d
FE
4 viewModel: {
5 data: {
6 type: undefined,
7 isCreate: undefined,
8 running: false,
9 guestAgentEnabled: false,
10 },
11 formulas: {
12 runningWithoutGuestAgent: (get) => get('type') === 'qemu' && get('running') && !get('guestAgentEnabled'),
13 shouldWarnAboutFS: (get) => get('isCreate') && get('runningWithoutGuestAgent') && get('!vmstate.checked'),
14 },
15 },
16
4e0e6b77
DC
17 onGetValues: function(values) {
18 let me = this;
19
20 if (me.type === 'lxc') {
21 delete values.vmstate;
22 }
23
24 return values;
25 },
26
27 initComponent : function() {
28 var me = this;
a6ebb96d 29 var vm = me.getViewModel();
4e0e6b77
DC
30
31 if (!me.nodename) {
32 throw "no node name specified";
33 }
34
35 if (!me.vmid) {
36 throw "no VM ID specified";
37 }
38
39 if (!me.type) {
1952d3d9 40 throw "no type specified";
4e0e6b77
DC
41 }
42
a6ebb96d
FE
43 vm.set('type', me.type);
44 vm.set('running', me.running);
45 vm.set('isCreate', me.isCreate);
46
47 if (me.type === 'qemu' && me.isCreate) {
48 Proxmox.Utils.API2Request({
49 url: `/nodes/${me.nodename}/${me.type}/${me.vmid}/config`,
50 params: { 'current': '1' },
51 method: 'GET',
52 success: function(response, options) {
53 let res = response.result.data;
54 let enabled = PVE.Parser.parsePropertyString(res.agent, 'enabled');
55 vm.set('guestAgentEnabled', !!PVE.Parser.parseBoolean(enabled.enabled));
56 }
57 });
58 }
59
4e0e6b77 60 me.items = [
a6ebb96d
FE
61 {
62 xtype: 'displayfield',
63 userCls: 'pmx-hint',
64 name: 'fswarning',
65 hidden: true,
66 value: gettext('It is recommended to either include the RAM or enable the QEMU Guest Agent when taking a snapshot of a running VM. Otherwise the file system might be in an inconsistent state when the snapshot is taken.'),
67 bind: {
68 hidden: '{!shouldWarnAboutFS}',
69 },
70 },
4e0e6b77 71 {
85b4f3cc 72 xtype: me.isCreate ? 'textfield' : 'displayfield',
4e0e6b77
DC
73 name: 'snapname',
74 value: me.snapname,
75 fieldLabel: gettext('Name'),
76 vtype: 'ConfigId',
77 allowBlank: false
78 },
79 {
80 xtype: 'displayfield',
85b4f3cc
FE
81 hidden: me.isCreate,
82 disabled: me.isCreate,
4e0e6b77
DC
83 name: 'snaptime',
84 renderer: PVE.Utils.render_timestamp_human_readable,
85 fieldLabel: gettext('Timestamp')
86 },
87 {
88 xtype: 'proxmoxcheckbox',
7fb02366
FE
89 hidden: me.type !== 'qemu' || !me.isCreate || !me.running,
90 disabled: me.type !== 'qemu' || !me.isCreate || !me.running,
4e0e6b77 91 name: 'vmstate',
a6ebb96d 92 reference: 'vmstate',
4e0e6b77
DC
93 uncheckedValue: 0,
94 defaultValue: 0,
95 checked: 1,
96 fieldLabel: gettext('Include RAM')
97 },
98 {
99 xtype: 'textareafield',
100 grow: true,
101 editable: !me.viewonly,
102 name: 'description',
103 fieldLabel: gettext('Description')
104 },
105 {
106 title: gettext('Settings'),
85b4f3cc 107 hidden: me.isCreate,
4e0e6b77
DC
108 xtype: 'grid',
109 itemId: 'summary',
110 border: true,
111 height: 200,
112 store: {
113 model: 'KeyValue',
114 sorters: [
115 {
116 property : 'key',
117 direction: 'ASC'
118 }
119 ]
120 },
121 columns: [
9a6b894f
TL
122 {
123 header: gettext('Key'),
124 width: 150,
125 dataIndex: 'key',
126 },
127 {
128 header: gettext('Value'),
129 flex: 1,
130 dataIndex: 'value',
131 }
4e0e6b77
DC
132 ]
133 }
134 ];
135
136 me.url = `/nodes/${me.nodename}/${me.type}/${me.vmid}/snapshot`;
137
138 let subject;
85b4f3cc 139 if (me.isCreate) {
4e0e6b77
DC
140 subject = (me.type === 'qemu' ? 'VM' : 'CT') + me.vmid + ' ' + gettext('Snapshot');
141 me.method = 'POST';
142 me.showProgress = true;
85b4f3cc
FE
143 } else {
144 subject = `${gettext('Snapshot')} ${me.snapname}`;
145 me.url += `/${me.snapname}/config`;
4e0e6b77
DC
146 }
147
148 Ext.apply(me, {
149 subject: subject,
85b4f3cc
FE
150 width: me.isCreate ? 450 : 620,
151 height: me.isCreate ? undefined : 420,
4e0e6b77
DC
152 });
153
154 me.callParent();
155
156 if (!me.snapname) {
157 return;
158 }
159
160 me.load({
161 success: function(response) {
162 let kvarray = [];
163 Ext.Object.each(response.result.data, function(key, value) {
164 if (key === 'description' || key === 'snaptime') {
165 return;
166 }
167 kvarray.push({ key: key, value: value });
168 });
169
170 let summarystore = me.down('#summary').getStore();
171 summarystore.suspendEvents();
172 summarystore.add(kvarray);
173 summarystore.sort();
174 summarystore.resumeEvents();
175 summarystore.fireEvent('refresh', summarystore);
176
177 me.setValues(response.result.data);
178 }
179 });
180 }
181});