mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-05-05 12:57:50 +00:00
245 lines
5.1 KiB
JavaScript
245 lines
5.1 KiB
JavaScript
Ext.define('PVE.storage.Ceph.Model', {
|
|
extend: 'Ext.app.ViewModel',
|
|
alias: 'viewmodel.cephstorage',
|
|
|
|
data: {
|
|
pveceph: true,
|
|
pvecephPossible: true,
|
|
namespacePresent: false,
|
|
},
|
|
});
|
|
|
|
Ext.define('PVE.storage.Ceph.Controller', {
|
|
extend: 'PVE.controller.StorageEdit',
|
|
alias: 'controller.cephstorage',
|
|
|
|
control: {
|
|
'#': {
|
|
afterrender: 'queryMonitors',
|
|
},
|
|
'textfield[name=username]': {
|
|
disable: 'resetField',
|
|
},
|
|
'displayfield[name=monhost]': {
|
|
enable: 'queryMonitors',
|
|
},
|
|
'textfield[name=monhost]': {
|
|
disable: 'resetField',
|
|
enable: 'resetField',
|
|
},
|
|
'textfield[name=namespace]': {
|
|
change: 'updateNamespaceHint',
|
|
},
|
|
},
|
|
resetField: function(field) {
|
|
field.reset();
|
|
},
|
|
updateNamespaceHint: function(field, newVal, oldVal) {
|
|
this.getViewModel().set('namespacePresent', newVal);
|
|
},
|
|
queryMonitors: function(field, newVal, oldVal) {
|
|
// we get called with two signatures, the above one for a field
|
|
// change event and the afterrender from the view, this check only
|
|
// can be true for the field change one and omit the API request if
|
|
// pveceph got unchecked - as it's not needed there.
|
|
if (field && !newVal && oldVal) {
|
|
return;
|
|
}
|
|
var view = this.getView();
|
|
var vm = this.getViewModel();
|
|
if (!(view.isCreate || vm.get('pveceph'))) {
|
|
return; // only query on create or if editing a pveceph store
|
|
}
|
|
|
|
var monhostField = this.lookupReference('monhost');
|
|
|
|
Proxmox.Utils.API2Request({
|
|
url: '/api2/json/nodes/localhost/ceph/mon',
|
|
method: 'GET',
|
|
scope: this,
|
|
callback: function(options, success, response) {
|
|
var data = response.result.data;
|
|
if (response.status === 200) {
|
|
if (data.length > 0) {
|
|
var monhost = Ext.Array.pluck(data, 'name').sort().join(',');
|
|
monhostField.setValue(monhost);
|
|
monhostField.resetOriginalValue();
|
|
if (view.isCreate) {
|
|
vm.set('pvecephPossible', true);
|
|
}
|
|
} else {
|
|
vm.set('pveceph', false);
|
|
}
|
|
} else {
|
|
vm.set('pveceph', false);
|
|
vm.set('pvecephPossible', false);
|
|
}
|
|
},
|
|
});
|
|
},
|
|
});
|
|
|
|
Ext.define('PVE.storage.RBDInputPanel', {
|
|
extend: 'PVE.panel.StorageBase',
|
|
controller: 'cephstorage',
|
|
|
|
onlineHelp: 'ceph_rados_block_devices',
|
|
|
|
viewModel: {
|
|
type: 'cephstorage',
|
|
},
|
|
|
|
setValues: function(values) {
|
|
if (values.monhost) {
|
|
this.viewModel.set('pveceph', false);
|
|
this.lookupReference('pvecephRef').setValue(false);
|
|
this.lookupReference('pvecephRef').resetOriginalValue();
|
|
}
|
|
if (values.namespace) {
|
|
this.getViewModel().set('namespacePresent', true);
|
|
}
|
|
this.callParent([values]);
|
|
},
|
|
|
|
initComponent: function() {
|
|
var me = this;
|
|
|
|
if (!me.nodename) {
|
|
me.nodename = 'localhost';
|
|
}
|
|
me.type = 'rbd';
|
|
|
|
me.column1 = [];
|
|
|
|
if (me.isCreate) {
|
|
me.column1.push({
|
|
xtype: 'pveCephPoolSelector',
|
|
nodename: me.nodename,
|
|
name: 'pool',
|
|
bind: {
|
|
disabled: '{!pveceph}',
|
|
submitValue: '{pveceph}',
|
|
hidden: '{!pveceph}',
|
|
},
|
|
fieldLabel: gettext('Pool'),
|
|
allowBlank: false,
|
|
}, {
|
|
xtype: 'textfield',
|
|
name: 'pool',
|
|
value: 'rbd',
|
|
bind: {
|
|
disabled: '{pveceph}',
|
|
submitValue: '{!pveceph}',
|
|
hidden: '{pveceph}',
|
|
},
|
|
fieldLabel: gettext('Pool'),
|
|
allowBlank: false,
|
|
});
|
|
} else {
|
|
me.column1.push({
|
|
xtype: 'displayfield',
|
|
nodename: me.nodename,
|
|
name: 'pool',
|
|
fieldLabel: gettext('Pool'),
|
|
allowBlank: false,
|
|
});
|
|
}
|
|
|
|
me.column1.push(
|
|
{
|
|
xtype: 'textfield',
|
|
name: 'monhost',
|
|
vtype: 'HostList',
|
|
bind: {
|
|
disabled: '{pveceph}',
|
|
submitValue: '{!pveceph}',
|
|
hidden: '{pveceph}',
|
|
},
|
|
value: '',
|
|
fieldLabel: 'Monitor(s)',
|
|
allowBlank: false,
|
|
},
|
|
{
|
|
xtype: 'displayfield',
|
|
reference: 'monhost',
|
|
bind: {
|
|
disabled: '{!pveceph}',
|
|
hidden: '{!pveceph}',
|
|
},
|
|
value: '',
|
|
fieldLabel: 'Monitor(s)',
|
|
},
|
|
{
|
|
xtype: me.isCreate ? 'textfield' : 'displayfield',
|
|
name: 'username',
|
|
bind: {
|
|
disabled: '{pveceph}',
|
|
submitValue: '{!pveceph}',
|
|
},
|
|
value: 'admin',
|
|
fieldLabel: gettext('User name'),
|
|
allowBlank: true,
|
|
},
|
|
);
|
|
|
|
me.column2 = [
|
|
{
|
|
xtype: 'pveContentTypeSelector',
|
|
cts: ['images', 'rootdir'],
|
|
fieldLabel: gettext('Content'),
|
|
name: 'content',
|
|
value: ['images'],
|
|
multiSelect: true,
|
|
allowBlank: false,
|
|
},
|
|
{
|
|
xtype: 'proxmoxcheckbox',
|
|
name: 'krbd',
|
|
uncheckedValue: 0,
|
|
fieldLabel: 'KRBD',
|
|
},
|
|
];
|
|
|
|
me.columnB = [
|
|
{
|
|
xtype: 'proxmoxcheckbox',
|
|
name: 'pveceph',
|
|
reference: 'pvecephRef',
|
|
bind: {
|
|
disabled: '{!pvecephPossible}',
|
|
value: '{pveceph}',
|
|
},
|
|
checked: true,
|
|
uncheckedValue: 0,
|
|
submitValue: false,
|
|
hidden: !me.isCreate,
|
|
boxLabel: gettext('Use Proxmox VE managed hyper-converged ceph pool'),
|
|
},
|
|
];
|
|
|
|
me.advancedColumn1 = [
|
|
{
|
|
xtype: 'pmxDisplayEditField',
|
|
editable: me.isCreate,
|
|
name: 'namespace',
|
|
value: '',
|
|
fieldLabel: gettext('Namespace'),
|
|
allowBlank: true,
|
|
},
|
|
];
|
|
me.advancedColumn2 = [
|
|
{
|
|
xtype: 'displayfield',
|
|
name: 'namespace-hint',
|
|
userCls: 'pmx-hint',
|
|
value: gettext('RBD namespaces must be created manually!'),
|
|
bind: {
|
|
hidden: '{!namespacePresent}',
|
|
},
|
|
},
|
|
];
|
|
|
|
me.callParent();
|
|
},
|
|
});
|