]>
Commit | Line | Data |
---|---|---|
563ed5ee TL |
1 | Ext.define('PVE.CephCreateFS', { |
2 | extend: 'Proxmox.window.Edit', | |
3 | alias: 'widget.pveCephCreateFS', | |
4 | ||
5 | showTaskViewer: true, | |
e8c0ec03 | 6 | onlineHelp: 'pveceph_fs_create', |
563ed5ee TL |
7 | |
8 | subject: 'Ceph FS', | |
9 | isCreate: true, | |
10 | method: 'POST', | |
11 | ||
12 | setFSName: function(fsName) { | |
13 | var me = this; | |
14 | ||
15 | if (fsName === '' || fsName === undefined) { | |
16 | fsName = 'cephfs'; | |
17 | } | |
18 | ||
19 | me.url = "/nodes/" + me.nodename + "/ceph/fs/" + fsName; | |
20 | }, | |
21 | ||
22 | items: [ | |
23 | { | |
24 | xtype: 'textfield', | |
25 | fieldLabel: gettext('Name'), | |
26 | name: 'name', | |
27 | value: 'cephfs', | |
28 | listeners: { | |
29 | change: function(f, value) { | |
30 | this.up('pveCephCreateFS').setFSName(value); | |
f6710aac | 31 | }, |
563ed5ee TL |
32 | }, |
33 | submitValue: false, // already encoded in apicall URL | |
f6710aac | 34 | emptyText: 'cephfs', |
563ed5ee TL |
35 | }, |
36 | { | |
37 | xtype: 'proxmoxintegerfield', | |
c5a0a1e4 | 38 | fieldLabel: 'Placement Groups', |
563ed5ee | 39 | name: 'pg_num', |
6ad70a2b TL |
40 | value: 128, |
41 | emptyText: 128, | |
563ed5ee TL |
42 | minValue: 8, |
43 | maxValue: 32768, | |
f6710aac | 44 | allowBlank: false, |
563ed5ee TL |
45 | }, |
46 | { | |
47 | xtype: 'proxmoxcheckbox', | |
2bf285d6 | 48 | fieldLabel: gettext('Add as Storage'), |
563ed5ee | 49 | value: true, |
2bf285d6 TL |
50 | name: 'add-storage', |
51 | autoEl: { | |
52 | tag: 'div', | |
53 | 'data-qtip': gettext('Add the new CephFS to the cluster storage configuration.'), | |
54 | }, | |
f6710aac | 55 | }, |
563ed5ee TL |
56 | ], |
57 | ||
8058410f | 58 | initComponent: function() { |
563ed5ee TL |
59 | var me = this; |
60 | ||
61 | if (!me.nodename) { | |
62 | throw "no node name specified"; | |
63 | } | |
64 | me.setFSName(); | |
65 | ||
66 | me.callParent(); | |
f6710aac | 67 | }, |
563ed5ee TL |
68 | }); |
69 | ||
563ed5ee TL |
70 | Ext.define('PVE.NodeCephFSPanel', { |
71 | extend: 'Ext.panel.Panel', | |
72 | xtype: 'pveNodeCephFSPanel', | |
73 | mixins: ['Proxmox.Mixin.CBind'], | |
74 | ||
a9d47b2b | 75 | title: gettext('CephFS'), |
e8c0ec03 | 76 | onlineHelp: 'pveceph_fs', |
563ed5ee TL |
77 | |
78 | border: false, | |
79 | defaults: { | |
80 | border: false, | |
81 | cbind: { | |
f6710aac TL |
82 | nodename: '{nodename}', |
83 | }, | |
563ed5ee TL |
84 | }, |
85 | ||
a9d47b2b TL |
86 | viewModel: { |
87 | parent: null, | |
88 | data: { | |
89 | cephfsConfigured: false, | |
f6710aac | 90 | mdsCount: 0, |
a9d47b2b TL |
91 | }, |
92 | formulas: { | |
93 | canCreateFS: function(get) { | |
94 | return (!get('cephfsConfigured') && get('mdsCount') > 0); | |
f6710aac TL |
95 | }, |
96 | }, | |
a9d47b2b TL |
97 | }, |
98 | ||
563ed5ee TL |
99 | items: [ |
100 | { | |
101 | xtype: 'grid', | |
a9d47b2b | 102 | emptyText: Ext.String.format(gettext('No {0} configured.'), 'CephFS'), |
563ed5ee TL |
103 | controller: { |
104 | xclass: 'Ext.app.ViewController', | |
105 | ||
106 | init: function(view) { | |
107 | view.rstore = Ext.create('Proxmox.data.UpdateStore', { | |
108 | autoLoad: true, | |
109 | xtype: 'update', | |
110 | interval: 5 * 1000, | |
111 | autoStart: true, | |
112 | storeid: 'pve-ceph-fs', | |
410f2cb0 TM |
113 | proxy: { |
114 | type: 'proxmox', | |
f6710aac | 115 | url: '/api2/json/nodes/' + view.nodename + '/ceph/fs', |
410f2cb0 | 116 | }, |
f6710aac | 117 | model: 'pve-ceph-fs', |
563ed5ee TL |
118 | }); |
119 | view.setStore(Ext.create('Proxmox.data.DiffStore', { | |
120 | rstore: view.rstore, | |
121 | sorters: { | |
122 | property: 'name', | |
f6710aac TL |
123 | order: 'DESC', |
124 | }, | |
563ed5ee | 125 | })); |
4616a55b | 126 | var regex = new RegExp("not (installed|initialized)", "i"); |
8058410f | 127 | PVE.Utils.handleStoreErrorOrMask(view, view.rstore, regex, function(me, error) { |
4616a55b TM |
128 | me.rstore.stopUpdate(); |
129 | PVE.Utils.showCephInstallOrMask(me.ownerCt, error.statusText, view.nodename, | |
8058410f TL |
130 | function(win) { |
131 | me.mon(win, 'cephInstallWindowClosed', function() { | |
4616a55b TM |
132 | me.rstore.startUpdate(); |
133 | }); | |
f6710aac | 134 | }, |
4616a55b TM |
135 | ); |
136 | }); | |
563ed5ee TL |
137 | view.rstore.on('load', this.onLoad, this); |
138 | view.on('destroy', view.rstore.stopUpdate); | |
139 | }, | |
140 | ||
141 | onCreate: function() { | |
142 | var view = this.getView(); | |
143 | view.rstore.stopUpdate(); | |
144 | var win = Ext.create('PVE.CephCreateFS', { | |
145 | autoShow: true, | |
146 | nodename: view.nodename, | |
147 | listeners: { | |
148 | destroy: function() { | |
149 | view.rstore.startUpdate(); | |
f6710aac TL |
150 | }, |
151 | }, | |
563ed5ee TL |
152 | }); |
153 | }, | |
154 | ||
155 | onLoad: function(store, records, success) { | |
156 | var vm = this.getViewModel(); | |
157 | if (!(success && records && records.length > 0)) { | |
158 | vm.set('cephfsConfigured', false); | |
159 | return; | |
160 | } | |
161 | vm.set('cephfsConfigured', true); | |
f6710aac | 162 | }, |
563ed5ee TL |
163 | }, |
164 | tbar: [ | |
165 | { | |
166 | text: gettext('Create CephFS'), | |
167 | reference: 'createButton', | |
168 | handler: 'onCreate', | |
169 | bind: { | |
170 | // only one CephFS per Ceph cluster makes sense for now | |
f6710aac TL |
171 | disabled: '{!canCreateFS}', |
172 | }, | |
173 | }, | |
563ed5ee TL |
174 | ], |
175 | columns: [ | |
176 | { | |
177 | header: gettext('Name'), | |
178 | flex: 1, | |
f6710aac | 179 | dataIndex: 'name', |
563ed5ee TL |
180 | }, |
181 | { | |
182 | header: 'Data Pool', | |
183 | flex: 1, | |
f6710aac | 184 | dataIndex: 'data_pool', |
563ed5ee TL |
185 | }, |
186 | { | |
187 | header: 'Metadata Pool', | |
188 | flex: 1, | |
f6710aac TL |
189 | dataIndex: 'metadata_pool', |
190 | }, | |
563ed5ee TL |
191 | ], |
192 | cbind: { | |
f6710aac TL |
193 | nodename: '{nodename}', |
194 | }, | |
563ed5ee TL |
195 | }, |
196 | { | |
7a1aa33b | 197 | xtype: 'pveNodeCephServiceList', |
563ed5ee | 198 | title: gettext('Metadata Servers'), |
7a1aa33b DC |
199 | stateId: 'grid-ceph-mds', |
200 | type: 'mds', | |
201 | storeLoadCallback: function(store, records, success) { | |
202 | var vm = this.getViewModel(); | |
203 | if (!success || !records) { | |
204 | vm.set('mdsCount', 0); | |
205 | return; | |
563ed5ee | 206 | } |
7a1aa33b | 207 | vm.set('mdsCount', records.length); |
563ed5ee | 208 | }, |
563ed5ee | 209 | cbind: { |
f6710aac TL |
210 | nodename: '{nodename}', |
211 | }, | |
212 | }, | |
213 | ], | |
563ed5ee | 214 | }, function() { |
563ed5ee TL |
215 | Ext.define('pve-ceph-fs', { |
216 | extend: 'Ext.data.Model', | |
8058410f | 217 | fields: ['name', 'data_pool', 'metadata_pool'], |
563ed5ee TL |
218 | proxy: { |
219 | type: 'proxmox', | |
f6710aac | 220 | url: "/api2/json/nodes/localhost/ceph/fs", |
563ed5ee | 221 | }, |
f6710aac | 222 | idProperty: 'name', |
563ed5ee TL |
223 | }); |
224 | }); |