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