]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/ceph/Pool.js
use Proxmox.Utils instead of PVE.Utils
[pve-manager.git] / www / manager6 / ceph / Pool.js
CommitLineData
024be9c7
DM
1Ext.define('PVE.CephCreatePool', {
2 extend: 'PVE.window.Edit',
9ad28182 3 alias: 'widget.pveCephCreatePool',
024be9c7 4
7244f4bf 5 showProgress: true,
35085f4a 6 onlineHelp: 'pve_ceph_pools',
7244f4bf 7
024be9c7 8 subject: 'Ceph Pool',
d5e771ce 9 isCreate: true,
c449c89a
DC
10 method: 'POST',
11 items: [
12 {
13 xtype: 'textfield',
14 fieldLabel: gettext('Name'),
15 name: 'name',
16 allowBlank: false
17 },
18 {
bf96f60d 19 xtype: 'proxmoxintegerfield',
c449c89a
DC
20 fieldLabel: gettext('Size'),
21 name: 'size',
f441a266 22 value: 3,
c449c89a 23 minValue: 1,
eef1979c 24 maxValue: 7,
c449c89a
DC
25 allowBlank: false
26 },
27 {
bf96f60d 28 xtype: 'proxmoxintegerfield',
c449c89a
DC
29 fieldLabel: gettext('Min. Size'),
30 name: 'min_size',
f441a266 31 value: 2,
c449c89a 32 minValue: 1,
eef1979c 33 maxValue: 7,
c449c89a
DC
34 allowBlank: false
35 },
36 {
d2692b86
DC
37 xtype: 'pveCephRuleSelector',
38 fieldLabel: 'Crush Rule', // do not localize
39 name: 'crush_rule',
c449c89a
DC
40 allowBlank: false
41 },
42 {
bf96f60d 43 xtype: 'proxmoxintegerfield',
c449c89a
DC
44 fieldLabel: 'pg_num',
45 name: 'pg_num',
46 value: 64,
47 minValue: 8,
48 maxValue: 32768,
49 allowBlank: false
5947248f
DC
50 },
51 {
52 xtype: 'pvecheckbox',
53 fieldLabel: gettext('Add Storages'),
54 name: 'add_storages'
c449c89a
DC
55 }
56 ],
c474314e 57 initComponent : function() {
024be9c7
DM
58 /*jslint confusion: true */
59 var me = this;
60
61 if (!me.nodename) {
62 throw "no node name specified";
63 }
64
d2692b86
DC
65 Ext.apply(me, {
66 url: "/nodes/" + me.nodename + "/ceph/pools",
67 defaults: {
68 nodename: me.nodename
69 }
024be9c7
DM
70 });
71
72 me.callParent();
73 }
74});
75
76Ext.define('PVE.node.CephPoolList', {
77 extend: 'Ext.grid.GridPanel',
9ad28182 78 alias: 'widget.pveNodeCephPoolList',
024be9c7 79
ba93a9c6 80 onlineHelp: 'chapter_pveceph',
361aafd0
DC
81 stateful: true,
82 stateId: 'grid-ceph-pools',
c449c89a
DC
83 bufferedRenderer: false,
84 features: [ { ftype: 'summary'} ],
85 columns: [
86 {
87 header: gettext('Name'),
88 width: 100,
89 sortable: true,
90 dataIndex: 'pool_name'
91 },
92 {
93 header: gettext('Size') + '/min',
94 width: 80,
95 sortable: false,
96 renderer: function(v, meta, rec) {
97 return v + '/' + rec.data.min_size;
98 },
99 dataIndex: 'size'
100 },
101 {
102 header: 'pg_num',
103 width: 100,
104 sortable: false,
105 dataIndex: 'pg_num'
106 },
107 {
2db28c03 108 header: 'rule',
c449c89a
DC
109 width: 50,
110 sortable: false,
2db28c03 111 dataIndex: 'crush_rule'
c449c89a 112 },
c9508b5d
DC
113 {
114 header: 'rule_name',
115 width: 50,
116 sortable: false,
117 dataIndex: 'crush_rule_name'
118 },
c449c89a
DC
119 {
120 header: gettext('Used'),
121 columns: [
122 {
123 header: '%',
124 width: 80,
125 sortable: true,
126 align: 'right',
127 renderer: Ext.util.Format.numberRenderer('0.00'),
128 dataIndex: 'percent_used',
129 summaryType: 'sum',
130 summaryRenderer: Ext.util.Format.numberRenderer('0.00')
131 },
132 {
133 header: gettext('Total'),
134 width: 100,
135 sortable: true,
136 renderer: PVE.Utils.render_size,
137 align: 'right',
138 dataIndex: 'bytes_used',
139 summaryType: 'sum',
140 summaryRenderer: PVE.Utils.render_size
141 }
142 ]
143 }
144 ],
024be9c7
DM
145 initComponent: function() {
146 var me = this;
147
148 var nodename = me.pveSelNode.data.node;
149 if (!nodename) {
150 throw "no node name specified";
151 }
152
153 var sm = Ext.create('Ext.selection.RowModel', {});
154
0c7c0d6b 155 var rstore = Ext.create('Proxmox.data.UpdateStore', {
024be9c7 156 interval: 3000,
d5066d84 157 storeid: 'ceph-pool-list' + nodename,
024be9c7
DM
158 model: 'ceph-pool-list',
159 proxy: {
160 type: 'pve',
161 url: "/api2/json/nodes/" + nodename + "/ceph/pools"
162 }
163 });
164
165 var store = Ext.create('PVE.data.DiffStore', { rstore: rstore });
166
e7ade592 167 Proxmox.Utils.monStoreErrors(me, rstore);
024be9c7
DM
168
169 var create_btn = new Ext.Button({
170 text: gettext('Create'),
171 handler: function() {
172 var win = Ext.create('PVE.CephCreatePool', {
173 nodename: nodename
174 });
175 win.show();
0e9a34c6
DC
176 win.on('destroy', function() {
177 rstore.load();
178 });
024be9c7
DM
179 }
180 });
181
5720fafa 182 var destroy_btn = Ext.create('Proxmox.button.Button', {
4358abfd 183 text: gettext('Destroy'),
024be9c7
DM
184 selModel: sm,
185 disabled: true,
024be9c7
DM
186 handler: function() {
187 var rec = sm.getSelection()[0];
188
189 if (!rec.data.pool_name) {
190 return;
191 }
c9a8015d
EK
192 var base_url = '/nodes/' + nodename + '/ceph/pools/' +
193 rec.data.pool_name;
024be9c7 194
0e9a34c6 195 var win = Ext.create('PVE.window.SafeDestroy', {
7244f4bf 196 showProgress: true,
c9a8015d 197 url: base_url,
cb852a4d
DC
198 params: {
199 remove_storages: 1
200 },
c9a8015d
EK
201 item: { type: 'CephPool', id: rec.data.pool_name }
202 }).show();
0e9a34c6
DC
203 win.on('destroy', function() {
204 rstore.load();
205 });
024be9c7
DM
206 }
207 });
208
209 Ext.apply(me, {
210 store: store,
211 selModel: sm,
4358abfd 212 tbar: [ create_btn, destroy_btn ],
024be9c7 213 listeners: {
c449c89a 214 activate: rstore.startUpdate,
024be9c7
DM
215 destroy: rstore.stopUpdate
216 }
217 });
218
219 me.callParent();
220 }
221}, function() {
222
223 Ext.define('ceph-pool-list', {
224 extend: 'Ext.data.Model',
c474314e
DC
225 fields: [ 'pool_name',
226 { name: 'pool', type: 'integer'},
227 { name: 'size', type: 'integer'},
228 { name: 'min_size', type: 'integer'},
229 { name: 'pg_num', type: 'integer'},
230 { name: 'bytes_used', type: 'integer'},
231 { name: 'percent_used', type: 'number'},
d2692b86 232 { name: 'crush_rule', type: 'integer'},
c9508b5d 233 { name: 'crush_rule_name', type: 'string'}
024be9c7
DM
234 ],
235 idProperty: 'pool_name'
236 });
237});
d2692b86
DC
238
239Ext.define('PVE.form.CephRuleSelector', {
240 extend: 'Ext.form.field.ComboBox',
241 alias: 'widget.pveCephRuleSelector',
242
243 allowBlank: false,
244 valueField: 'name',
245 displayField: 'name',
246 editable: false,
247 queryMode: 'local',
248
249 initComponent: function() {
250 var me = this;
251
252 if (!me.nodename) {
253 throw "no nodename given";
254 }
255
256 var store = Ext.create('Ext.data.Store', {
257 fields: ['name'],
258 sorters: 'name',
259 proxy: {
260 type: 'pve',
261 url: '/api2/json/nodes/' + me.nodename + '/ceph/rules'
262 }
263 });
264
265 Ext.apply(me, {
45ea97f2 266 store: store
d2692b86
DC
267 });
268
269 me.callParent();
270
271 store.load({
272 callback: function(rec, op, success){
273 if (success && rec.length > 0) {
274 me.select(rec[0]);
275 }
276 }
277 });
278 }
279
280});