]>
Commit | Line | Data |
---|---|---|
4e0e6b77 DC |
1 | Ext.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 | ||
8058410f | 27 | initComponent: function() { |
4e0e6b77 | 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)); | |
f6710aac | 56 | }, |
a6ebb96d FE |
57 | }); |
58 | } | |
59 | ||
4e0e6b77 DC |
60 | me.items = [ |
61 | { | |
85b4f3cc | 62 | xtype: me.isCreate ? 'textfield' : 'displayfield', |
4e0e6b77 DC |
63 | name: 'snapname', |
64 | value: me.snapname, | |
65 | fieldLabel: gettext('Name'), | |
66 | vtype: 'ConfigId', | |
f6710aac | 67 | allowBlank: false, |
4e0e6b77 DC |
68 | }, |
69 | { | |
70 | xtype: 'displayfield', | |
85b4f3cc FE |
71 | hidden: me.isCreate, |
72 | disabled: me.isCreate, | |
4e0e6b77 DC |
73 | name: 'snaptime', |
74 | renderer: PVE.Utils.render_timestamp_human_readable, | |
f6710aac | 75 | fieldLabel: gettext('Timestamp'), |
4e0e6b77 DC |
76 | }, |
77 | { | |
78 | xtype: 'proxmoxcheckbox', | |
7fb02366 FE |
79 | hidden: me.type !== 'qemu' || !me.isCreate || !me.running, |
80 | disabled: me.type !== 'qemu' || !me.isCreate || !me.running, | |
4e0e6b77 | 81 | name: 'vmstate', |
a6ebb96d | 82 | reference: 'vmstate', |
4e0e6b77 DC |
83 | uncheckedValue: 0, |
84 | defaultValue: 0, | |
85 | checked: 1, | |
f6710aac | 86 | fieldLabel: gettext('Include RAM'), |
4e0e6b77 DC |
87 | }, |
88 | { | |
89 | xtype: 'textareafield', | |
90 | grow: true, | |
91 | editable: !me.viewonly, | |
92 | name: 'description', | |
f6710aac | 93 | fieldLabel: gettext('Description'), |
4e0e6b77 | 94 | }, |
3892d1e6 TL |
95 | { |
96 | xtype: 'displayfield', | |
97 | userCls: 'pmx-hint', | |
98 | name: 'fswarning', | |
99 | hidden: true, | |
100 | value: gettext('It is recommended to either include the RAM or use the QEMU Guest Agent when taking a snapshot of a running VM to avoid inconsistencies.'), | |
101 | bind: { | |
102 | hidden: '{!shouldWarnAboutFS}', | |
103 | }, | |
104 | }, | |
4e0e6b77 DC |
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 | { | |
8058410f | 116 | property: 'key', |
f6710aac TL |
117 | direction: 'ASC', |
118 | }, | |
119 | ], | |
4e0e6b77 DC |
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', | |
f6710aac TL |
131 | }, |
132 | ], | |
133 | }, | |
4e0e6b77 DC |
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'; | |
73713991 | 142 | me.showTaskViewer = 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); | |
f6710aac | 178 | }, |
4e0e6b77 | 179 | }); |
f6710aac | 180 | }, |
4e0e6b77 | 181 | }); |