]>
Commit | Line | Data |
---|---|---|
024be9c7 DM |
1 | Ext.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 | ||
76 | Ext.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 | |
239 | Ext.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 | }); |