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