Ext.define('PVE.window.Snapshot', {
extend: 'Proxmox.window.Edit',
+ viewModel: {
+ data: {
+ type: undefined,
+ isCreate: undefined,
+ running: false,
+ guestAgentEnabled: false,
+ },
+ formulas: {
+ runningWithoutGuestAgent: (get) => get('type') === 'qemu' && get('running') && !get('guestAgentEnabled'),
+ shouldWarnAboutFS: (get) => get('isCreate') && get('runningWithoutGuestAgent') && get('!vmstate.checked'),
+ },
+ },
+
onGetValues: function(values) {
let me = this;
return values;
},
- initComponent : function() {
+ initComponent: function() {
var me = this;
+ var vm = me.getViewModel();
if (!me.nodename) {
throw "no node name specified";
}
if (!me.type) {
- throw "no VM ID specified";
+ throw "no type specified";
+ }
+
+ vm.set('type', me.type);
+ vm.set('running', me.running);
+ vm.set('isCreate', me.isCreate);
+
+ if (me.type === 'qemu' && me.isCreate) {
+ Proxmox.Utils.API2Request({
+ url: `/nodes/${me.nodename}/${me.type}/${me.vmid}/config`,
+ params: { 'current': '1' },
+ method: 'GET',
+ success: function(response, options) {
+ let res = response.result.data;
+ let enabled = PVE.Parser.parsePropertyString(res.agent, 'enabled');
+ vm.set('guestAgentEnabled', !!PVE.Parser.parseBoolean(enabled.enabled));
+ },
+ });
}
me.items = [
{
- xtype: me.snapname ? 'displayfield' : 'textfield',
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
name: 'snapname',
value: me.snapname,
fieldLabel: gettext('Name'),
vtype: 'ConfigId',
- allowBlank: false
+ allowBlank: false,
},
{
xtype: 'displayfield',
- hidden: !me.snapname,
- disabled: !me.snapname,
+ hidden: me.isCreate,
+ disabled: me.isCreate,
name: 'snaptime',
renderer: PVE.Utils.render_timestamp_human_readable,
- fieldLabel: gettext('Timestamp')
+ fieldLabel: gettext('Timestamp'),
},
{
xtype: 'proxmoxcheckbox',
- hidden: me.type !== 'qemu' || me.snapname,
- disabled: me.type !== 'qemu' || me.snapname,
+ hidden: me.type !== 'qemu' || !me.isCreate || !me.running,
+ disabled: me.type !== 'qemu' || !me.isCreate || !me.running,
name: 'vmstate',
+ reference: 'vmstate',
uncheckedValue: 0,
defaultValue: 0,
checked: 1,
- fieldLabel: gettext('Include RAM')
+ fieldLabel: gettext('Include RAM'),
},
{
xtype: 'textareafield',
grow: true,
editable: !me.viewonly,
name: 'description',
- fieldLabel: gettext('Description')
+ fieldLabel: gettext('Description'),
+ },
+ {
+ xtype: 'displayfield',
+ userCls: 'pmx-hint',
+ name: 'fswarning',
+ hidden: true,
+ 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.'),
+ bind: {
+ hidden: '{!shouldWarnAboutFS}',
+ },
},
{
title: gettext('Settings'),
- hidden: !me.snapname,
+ hidden: me.isCreate,
xtype: 'grid',
itemId: 'summary',
border: true,
model: 'KeyValue',
sorters: [
{
- property : 'key',
- direction: 'ASC'
- }
- ]
+ property: 'key',
+ direction: 'ASC',
+ },
+ ],
},
columns: [
{
header: gettext('Value'),
flex: 1,
dataIndex: 'value',
- }
- ]
- }
+ },
+ ],
+ },
];
me.url = `/nodes/${me.nodename}/${me.type}/${me.vmid}/snapshot`;
let subject;
- if (me.snapname) {
- subject = `${gettext('Snapshot')} ${me.snapname}`;
- me.url += `/${me.snapname}/config`;
- } else {
+ if (me.isCreate) {
subject = (me.type === 'qemu' ? 'VM' : 'CT') + me.vmid + ' ' + gettext('Snapshot');
me.method = 'POST';
- me.showProgress = true;
+ me.showTaskViewer = true;
+ } else {
+ subject = `${gettext('Snapshot')} ${me.snapname}`;
+ me.url += `/${me.snapname}/config`;
}
Ext.apply(me, {
subject: subject,
- width: me.snapname ? 620 : 450,
- height: me.snapname ? 420 : undefined,
+ width: me.isCreate ? 450 : 620,
+ height: me.isCreate ? undefined : 420,
});
me.callParent();
summarystore.fireEvent('refresh', summarystore);
me.setValues(response.result.data);
- }
+ },
});
- }
+ },
});