},
compare_ceph_versions: function(a, b) {
+ let avers = [];
+ let bvers = [];
+
if (a === b) {
return 0;
}
- let avers = a.toString().split('.');
- let bvers = b.toString().split('.');
+
+ if (Ext.isArray(a)) {
+ avers = a.slice(); // copy array
+ } else {
+ avers = a.toString().split('.');
+ }
+
+ if (Ext.isArray(b)) {
+ bvers = b.slice(); // copy array
+ } else {
+ bvers = b.toString().split('.');
+ }
while (true) {
let av = avers.shift();
'snippets': gettext('Snippets')
},
+ volume_is_qemu_backup: function(volid, format) {
+ return format === 'pbs-vm' || volid.match(':backup/vzdump-qemu-');
+ },
+
+ volume_is_lxc_backup: function(volid, format) {
+ return format === 'pbs-ct' || volid.match(':backup/vzdump-(lxc|openvz)-');
+ },
+
+ authSchema: {
+ ad: {
+ name: gettext('Active Directory Server'),
+ ipanel: 'pveAuthADPanel',
+ syncipanel: 'pveAuthLDAPSyncPanel',
+ add: true,
+ },
+ ldap: {
+ name: gettext('LDAP Server'),
+ ipanel: 'pveAuthLDAPPanel',
+ syncipanel: 'pveAuthLDAPSyncPanel',
+ add: true,
+ },
+ pam: {
+ name: 'Linux PAM',
+ ipanel: 'pveAuthBasePanel',
+ add: false,
+ },
+ pve: {
+ name: 'Proxmox VE authentication server',
+ ipanel: 'pveAuthBasePanel',
+ add: false,
+ },
+ },
+
storageSchema: {
dir: {
name: Proxmox.Utils.directoryText,
ipanel: 'ZFSPoolInputPanel',
faIcon: 'folder'
},
+ pbs: {
+ name: 'Proxmox Backup Server',
+ //ipanel: '', // TODO
+ hideAdd: true,
+ faIcon: 'database',
+ },
drbd: {
name: 'DRBD',
- hideAdd: true
+ hideAdd: true,
+ },
+ },
+
+ sdnvnetSchema: {
+ vnet: {
+ name: 'vnet',
+ faIcon: 'folder'
+ },
+ },
+
+ sdnzoneSchema: {
+ zone: {
+ name: 'zone',
+ hideAdd: true
+ },
+ vlan: {
+ name: 'vlan',
+ ipanel: 'VlanInputPanel',
+ faIcon: 'folder'
+ },
+ qinq: {
+ name: 'qinq',
+ ipanel: 'QinQInputPanel',
+ faIcon: 'folder'
+ },
+ vxlan: {
+ name: 'vxlan',
+ ipanel: 'VxlanInputPanel',
+ faIcon: 'folder'
+ },
+ evpn: {
+ name: 'evpn',
+ ipanel: 'EvpnInputPanel',
+ faIcon: 'folder'
+ },
+ },
+
+ sdncontrollerSchema: {
+ controller: {
+ name: 'controller',
+ hideAdd: true
+ },
+ evpn: {
+ name: 'evpn',
+ ipanel: 'EvpnInputPanel',
+ faIcon: 'folder'
+ },
+ },
+
+ format_sdnvnet_type: function(value, md, record) {
+ var schema = PVE.Utils.sdnvnetSchema[value];
+ if (schema) {
+ return schema.name;
}
+ return Proxmox.Utils.unknownText;
+ },
+
+ format_sdnzone_type: function(value, md, record) {
+ var schema = PVE.Utils.sdnzoneSchema[value];
+ if (schema) {
+ return schema.name.toUpperCase();
+ }
+ return Proxmox.Utils.unknownText;
+ },
+
+ format_sdncontroller_type: function(value, md, record) {
+ var schema = PVE.Utils.sdncontrollerSchema[value];
+ if (schema) {
+ return schema.name;
+ }
+ return Proxmox.Utils.unknownText;
},
format_storage_type: function(value, md, record) {
Ext.String.leftPad(data.channel,2, '0') +
" ID " + data.id + " LUN " + data.lun;
}
- return data.volid.replace(/^.*:(.*\/)?/,'');
+ return data.volid.replace(/^.*?:(.*?\/)?/,'');
},
render_serverity: function (value) {
if (values[fieldname] === '' || values[fieldname] === default_val) {
if (!create) {
if (values['delete']) {
- values['delete'] += ',' + fieldname;
+ if (Ext.isArray(values['delete'])) {
+ values['delete'].push(fieldname);
+ } else {
+ values['delete'] += ',' + fieldname;
+ }
} else {
values['delete'] = fieldname;
}
diskControllerMaxIDs: {
ide: 4,
sata: 6,
- scsi: 14,
+ scsi: 31,
virtio: 16,
},
}
},
+ hardware_counts: { net: 32, usb: 5, hostpci: 16, audio: 1, efidisk: 1, serial: 4, rng: 1 },
+
cleanEmptyObjectKeys: function (obj) {
var propName;
for (propName in obj) {
}
},
+ acmedomain_count: 5,
+
+ add_domain_to_acme: function(acme, domain) {
+ if (acme.domains === undefined) {
+ acme.domains = [domain];
+ } else {
+ acme.domains.push(domain);
+ acme.domains = acme.domains.filter((value, index, self) => {
+ return self.indexOf(value) === index;
+ });
+ }
+ return acme;
+ },
+
+ remove_domain_from_acme: function(acme, domain) {
+ if (acme.domains !== undefined) {
+ acme.domains = acme.domains.filter((value, index, self) => {
+ return self.indexOf(value) === index && value !== domain;
+ });
+ }
+ return acme;
+ },
+
handleStoreErrorOrMask: function(me, store, regex, callback) {
me.mon(store, 'load', function (proxy, response, success, operation) {
container.updateLayout();
container.updateLayout();
},
+
+ forEachCorosyncLink: function(nodeinfo, cb) {
+ let re = /(?:ring|link)(\d+)_addr/;
+ Ext.iterate(nodeinfo, (prop, val) => {
+ let match = re.exec(prop);
+ if (match) {
+ cb(Number(match[1]), val);
+ }
+ });
+ },
},
singleton: true,
}
});
-