break;
case "raidz2":
devicesField.minSelections = 4;
+ break;
case "raidz3":
devicesField.minSelections = 5;
break;
ptype: "fieldinfo",
text: _("Optional mountpoint for the pool. Default is to use pool name.")
}]
+ },{
+ xtype: "checkbox",
+ name: "diskpath",
+ fieldLabel: _("Disk-by-path"),
+ plugins: [{
+ ptype: "fieldinfo",
+ text: _("Use /dev/disk/by-path when creating the pool. Recommended.")
+ }]
},{
xtype: "checkbox",
name: "force",
getFormItems: function() {
var me = this;
+
+ var store = new Ext.data.ArrayStore({
+ autoDestroy: true,
+ storeId: 'my_store',
+ fields: [
+ {name: 'value', type: 'string'},
+ {name: 'display', type: 'string'}
+ ]
+ });
+
+ var combodata;
+ if (me.parenttype === "Snapshot") {
+ combodata = [["clone","Clone"]];
+ } else if (me.parenttype === "Volume") {
+ combodata = [["snapshot", "Snapshot"]];
+ } else {
+ combodata = [["filesystem","Filesystem"],
+ ["volume","Volume"],
+ ["snapshot","Snapshot"]];
+ }
+ store.loadData(combodata,false);
+
return [{
xtype: "combo",
name: "type",
fieldLabel: _("Object Type"),
queryMode: "local",
- store: [
- [ "filesystem", "Filesystem" ],
- [ "snapshot", "Snapshot" ],
- [ "volume", "Volume" ]
- ],
+ store: store,
allowBlank: true,
editable: false,
triggerAction: "all",
- value: "filesystem",
+ valueField: "value",
+ displayField: "display",
+ value: combodata[0][0],
listeners: {
scope: me,
change: function(combo, value) {
var sizeField = this.findField("size");
+ var cloneField = this.findField("clonename");
+ var nameField = this.findField("name");
+ var mountField = this.findField("mountpoint");
switch(value) {
+ case "filesystem":
+ sizeField.hide();
+ sizeField.allowBlank = true;
+ cloneField.hide();
+ nameField.show();
+ mountField.show();
case "volume":
sizeField.show();
- sizeField.allowBlank = false;
+ sizeField.allowBlank = false;
+ cloneField.hide();
+ nameField.show();
+ mountField.hide();
break;
+ case "clone":
+ sizeField.hide();
+ sizeField.allowBlank = true;
+ cloneField.show();
+ nameField.hide();
+ mountField.hide();
default:
sizeField.hide();
- sizeField.allowBlank = true;
+ sizeField.allowBlank = true;
+ cloneField.hide();
+ nameField.show();
+ mountField.hide();
break;
}
sizeField.validate();
name: "path",
fieldLabel: _("Prefix"),
allowBlank: false,
- readOnly: true
+ readOnly: true,
+ value: me.path,
+ listeners: {
+ scope: me,
+ beforerender: function(e, eOpts) {
+ var pathField = this.findField("path");
+ if (me.parenttype === "Snapshot") {
+ pathField.fieldLabel = _("Snapshot to clone");
+ } else {
+ pathField.fieldLabel = _("Prefix");
+ }
+ }
+ }
},{
xtype: "textfield",
name: "name",
+ id: "name",
fieldLabel: _("Name"),
allowBlank: false,
plugins: [{
ptype: "fieldinfo",
text: _("Name of the new object. Prefix will prepend the name. Please omit leading /")
- }]
+ }],
+ listeners: {
+ scope: me,
+ beforerender: function(e, eOpts) {
+ var nameField = this.findField("name");
+ if (me.parenttype === "Snapshot") {
+ nameField.hide();
+ nameField.allowBlank = true;
+ } else {
+ nameField.show();
+ nameField.allowBlank = false;
+ }
+ }
+ }
+ },{
+ xtype: "textfield",
+ name: "mountpoint",
+ fieldLabel: _("Mountpoint"),
+ allowBlank: true,
+ plugins: [{
+ ptype: "fieldinfo",
+ text: _("Optional mountpoint of the filesystem. If left blank parent mountpoint will be prepended to name of the filesystem.")
+ }],
+ listeners: {
+ scope: me,
+ beforerender: function(e, eOpts) {
+ var mountField = this.findField("mountpoint");
+ if (combodata[0][0] === "filesystem") {
+ mountField.show();
+ } else {
+ mountField.hide();
+ }
+ }
+ }
+ },{
+ xtype: "textfield",
+ name: "clonename",
+ id: "clonename",
+ fieldLabel: _("Clone name"),
+ allowBlank: false,
+ plugins: [{
+ ptype: "fieldinfo",
+ text: _("Name of the new Clone. It can be placed anywhere within the ZFS hierarchy.")
+ }],
+ listeners: {
+ scope: me,
+ beforerender: function(e, eOpts) {
+ var cloneField = this.findField("clonename");
+ if (me.parenttype === "Snapshot") {
+ cloneField.show();
+ cloneField.allowBlank = false;
+ } else {
+ cloneField.hide();
+ cloneField.allowBlank = true;
+ }
+ }
+ }
},{
xtype: "textfield",
name: "size",
+ id: "size",
hidden: true,
fieldLabel: _("Size"),
allowBlank: true,
}
});
+Ext.define("OMV.module.admin.storage.zfs.ExpandPool", {
+ extend: "OMV.workspace.window.Form",
+ uses: [
+ "OMV.data.Store",
+ "OMV.data.Model",
+ "OMV.data.proxy.Rpc",
+ "OMV.data.reader.RpcArray"
+ ],
+
+ rpcService: "ZFS",
+ rpcSetMethod: "expandPool",
+ width: 550,
+ height: 350,
+ autoLoadData: true,
+
+ getFormItems: function() {
+ var me = this;
+ return [{
+ xtype: "textfield",
+ name: "name",
+ fieldLabel: _("Name"),
+ allowBlank: false,
+ readOnly: true,
+ value: me.name
+ },{
+ xtype: "combo",
+ name: "vdevtype",
+ fieldLabel: _("Vdev type"),
+ queryMode: "local",
+ store: Ext.create("Ext.data.ArrayStore", {
+ fields: [ "value", "text" ],
+ data: [
+ [ "basic", _("Basic") ],
+ [ "mirror", _("Mirror") ],
+ [ "raidz1", _("RAID-Z1") ],
+ [ "raidz2", _("RAID-Z2") ],
+ [ "raidz3", _("RAID-Z3") ]
+ ]
+ }),
+ displayField: "text",
+ valueField: "value",
+ allowBlank: false,
+ editable: false,
+ triggerAction: "all",
+ value: "raidz1",
+ listeners: {
+ scope: me,
+ change: function(combo, value) {
+ var devicesField = this.findField("devices");
+ switch(value) {
+ case "basic":
+ devicesField.minSelections = 1;
+ break;
+ case "mirror":
+ devicesField.minSelections = 2;
+ break;
+ case "raidz1":
+ devicesField.minSelections = 3;
+ break;
+ case "raidz2":
+ devicesField.minSelections = 4;
+ break;
+ case "raidz3":
+ devicesField.minSelections = 5;
+ break;
+ default:
+ devicesField.minSelections = 2;
+ break;
+ }
+ devicesField.validate();
+ }
+ }
+ },{
+ xtype: "checkboxgridfield",
+ name: "devices",
+ fieldLabel: _("Devices"),
+ valueField: "devicefile",
+ minSelections: 3, // Min. number of devices for RAIDZ-1
+ useStringValue: true,
+ height: 130,
+ store: Ext.create("OMV.data.Store", {
+ autoLoad: true,
+ model: OMV.data.Model.createImplicit({
+ idProperty: "devicefile",
+ fields: [
+ { name: "devicefile", type: "string" },
+ { name: "size", type: "string" },
+ { name: "vendor", type: "string" },
+ { name: "serialnumber", type: "string" }
+ ]
+ }),
+ proxy: {
+ type: "rpc",
+ appendSortParams: false,
+ rpcData: {
+ service: "RaidMgmt",
+ method: "getCandidates"
+ }
+ },
+ sorters: [{
+ direction: "ASC",
+ property: "devicefile"
+ }]
+ }),
+ gridConfig: {
+ stateful: true,
+ stateId: "05c60750-5074-11e4-916c-0800200c9a66",
+ columns: [{
+ text: _("Device"),
+ sortable: true,
+ dataIndex: "devicefile",
+ stateId: "devicefile",
+ flex: 1
+ },{
+ xtype: "binaryunitcolumn",
+ text: _("Capacity"),
+ sortable: true,
+ dataIndex: "size",
+ stateId: "size",
+ width: 50,
+ flex: 1
+ },{
+ text: _("Vendor"),
+ sortable: true,
+ dataIndex: "vendor",
+ stateId: "vendor",
+ flex: 1
+ },{
+ text: _("Serial Number"),
+ sortable: true,
+ dataIndex: "serialnumber",
+ stateId: "serialnumber",
+ flex: 1
+ }]
+ }
+ },{
+ xtype: "checkbox",
+ name: "diskpath",
+ fieldLabel: _("Disk-by-path"),
+ plugins: [{
+ ptype: "fieldinfo",
+ text: _("Use /dev/disk/by-path when creating the vdev. Recommended.")
+ }]
+ },{
+ xtype: "checkbox",
+ name: "force",
+ fieldLabel: _("Force creation"),
+ checked: false,
+ plugins: [{
+ ptype: "fieldinfo",
+ text: _("Forces the creation of the Vdev even if errors are reported. Use with extreme caution!")
+ }]
+ }];
+ }
+});
Ext.define("OMV.module.admin.storage.zfs.EditProperties", {
dataIndex: 'name',
sortable: true,
flex: 2,
- stateId: 'name'
+ stateId: 'name',
+ renderer: function(value, p, r){
+ if (r.data['origin'] === "n/a") {
+ return r.data['name'];
+ } else {
+ return r.data['name'] + ' (' + r.data['origin'] + ')';
+ }
+ }
},{
text: _("Type"),
dataIndex: 'type',
sortable: true,
flex: 1,
- stateId: 'type'
+ stateId: 'type',
+ renderer: function(value, p, r){
+ if (r.data['origin'] === "n/a") {
+ return r.data['type'];
+ } else {
+ return 'Clone';
+ }
+ }
},{
text: _("Size"),
dataIndex: 'size',
{ name: "id", type: "string" },
{ name: "path", type: "string" },
{ name: "origin", type: "string", defaultValue: "none" },
- { name: "shared", type: "string", defaultValue: "false" }
+ { name: "shared", type: "string", defaultValue: "false" },
+ { name: "pool_type", type: "string"},
+ { name: "nr_disks", type: "string"}
]
}),
proxy: {
var record = records[0];
Ext.create("OMV.module.admin.storage.zfs.AddObject", {
title: _("Add Object"),
- rpcGetMethod: "passParam",
- rpcGetParams: {
- key: "path",
- value: record.get('path')
- },
+ path: record.get("path"),
+ parenttype: record.get("type"),
listeners: {
scope: me,
submit: function() {
type: record.get("type")
}).show();
},
+
+ onExpandPoolButton: function() {
+ var me = this;
+ var sm = me.getSelectionModel();
+ var records = sm.getSelection();
+ var record = records[0];
+ Ext.create("OMV.module.admin.storage.zfs.ExpandPool", {
+ title: _("Expand Pool"),
+ name: record.get("path"),
+ listeners: {
+ scope: me,
+ submit: function() {
+ this.doReload();
+ }
+ }
+ }).show();
+ },
doDeletion: function(record) {
var me = this;