--- /dev/null
+Ext.define('PVE.CephCreatePool', {
+ extend: 'PVE.window.Edit',
+ alias: ['widget.pveCephCreatePool'],
+
+ subject: 'Ceph Pool',
+
+ initComponent : function() {
+ /*jslint confusion: true */
+ var me = this;
+
+ if (!me.nodename) {
+ throw "no node name specified";
+ }
+
+ Ext.applyIf(me, {
+ create: true,
+ url: "/nodes/" + me.nodename + "/ceph/pools",
+ method: 'POST',
+ items: [
+ {
+ xtype: 'textfield',
+ fieldLabel: gettext('Name'),
+ name: 'name',
+ allowBlank: false
+ },
+ {
+ xtype: 'numberfield',
+ fieldLabel: gettext('Size'),
+ name: 'size',
+ value: 2,
+ minValue: 1,
+ maxValue: 3,
+ allowBlank: false
+ },
+ {
+ xtype: 'numberfield',
+ fieldLabel: gettext('Min. Size'),
+ name: 'min_size',
+ value: 1,
+ minValue: 1,
+ maxValue: 3,
+ allowBlank: false
+ },
+ {
+ xtype: 'numberfield',
+ fieldLabel: gettext('Crush RuleSet'),
+ name: 'crush_ruleset',
+ value: 0,
+ minValue: 0,
+ maxValue: 32768,
+ allowBlank: false
+ },
+ {
+ xtype: 'numberfield',
+ fieldLabel: 'pg_num',
+ name: 'pg_num',
+ value: 64,
+ minValue: 8,
+ maxValue: 32768,
+ allowBlank: false
+ }
+ ]
+ });
+
+ me.callParent();
+ }
+});
+
+Ext.define('PVE.node.CephPoolList', {
+ extend: 'Ext.grid.GridPanel',
+ alias: ['widget.pveNodeCephPoolList'],
+
+ initComponent: function() {
+ var me = this;
+
+ var nodename = me.pveSelNode.data.node;
+ if (!nodename) {
+ throw "no node name specified";
+ }
+
+ var sm = Ext.create('Ext.selection.RowModel', {});
+
+ var rstore = Ext.create('PVE.data.UpdateStore', {
+ interval: 3000,
+ storeid: 'ceph-pool-list',
+ model: 'ceph-pool-list',
+ proxy: {
+ type: 'pve',
+ url: "/api2/json/nodes/" + nodename + "/ceph/pools"
+ }
+ });
+
+ var store = Ext.create('PVE.data.DiffStore', { rstore: rstore });
+
+ PVE.Utils.monStoreErrors(me, rstore);
+
+ var create_btn = new Ext.Button({
+ text: gettext('Create'),
+ handler: function() {
+ var win = Ext.create('PVE.CephCreatePool', {
+ nodename: nodename
+ });
+ win.show();
+ }
+ });
+
+ var remove_btn = new PVE.button.Button({
+ text: gettext('Remove'),
+ selModel: sm,
+ disabled: true,
+ confirmMsg: function(rec) {
+ var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'),
+ "'" + rec.data.pool_name + "'");
+ msg += " " + gettext('This will permanently erase all image data.');
+
+ return msg;
+ },
+ handler: function() {
+ var rec = sm.getSelection()[0];
+
+ if (!rec.data.pool_name) {
+ return;
+ }
+
+ PVE.Utils.API2Request({
+ url: "/nodes/" + nodename + "/ceph/pools/" +
+ rec.data.pool_name,
+ method: 'DELETE',
+ failure: function(response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ }
+ });
+ }
+ });
+
+ Ext.apply(me, {
+ store: store,
+ selModel: sm,
+ stateful: false,
+ tbar: [ create_btn, remove_btn ],
+ features: [ { ftype: 'summary' } ],
+ columns: [
+ {
+ header: gettext('Name'),
+ width: 100,
+ sortable: true,
+ dataIndex: 'pool_name'
+ },
+ {
+ header: gettext('Size') + '/min',
+ width: 50,
+ sortable: false,
+ renderer: function(v, meta, rec) {
+ return v + '/' + rec.data.min_size;
+ },
+ dataIndex: 'size'
+ },
+ {
+ header: 'pg_num',
+ width: 100,
+ sortable: false,
+ dataIndex: 'pg_num'
+ },
+ {
+ header: 'ruleset',
+ width: 50,
+ sortable: false,
+ dataIndex: 'crush_ruleset'
+ },
+ {
+ header: gettext('Used'),
+ columns: [
+ {
+ header: '%',
+ width: 80,
+ sortable: true,
+ align: 'right',
+ renderer: Ext.util.Format.numberRenderer('0.00'),
+ dataIndex: 'percent_used',
+ summaryType: 'sum',
+ summaryRenderer: Ext.util.Format.numberRenderer('0.00')
+ },
+ {
+ header: gettext('Total'),
+ width: 100,
+ sortable: true,
+ renderer: PVE.Utils.render_size,
+ align: 'right',
+ dataIndex: 'bytes_used',
+ summaryType: 'sum',
+ summaryRenderer: PVE.Utils.render_size
+ }
+ ]
+ }
+ ],
+ listeners: {
+ show: rstore.startUpdate,
+ hide: rstore.stopUpdate,
+ destroy: rstore.stopUpdate
+ }
+ });
+
+ me.callParent();
+ }
+}, function() {
+
+ Ext.define('ceph-pool-list', {
+ extend: 'Ext.data.Model',
+ fields: [ 'pool_name',
+ { name: 'pool', type: 'integer'},
+ { name: 'size', type: 'integer'},
+ { name: 'min_size', type: 'integer'},
+ { name: 'pg_num', type: 'integer'},
+ { name: 'bytes_used', type: 'integer'},
+ { name: 'percent_used', type: 'number'},
+ { name: 'crush_ruleset', type: 'integer'}
+ ],
+ idProperty: 'pool_name'
+ });
+});