]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/ceph/Pool.js
ceph/pool: change default replica to 3/2
[pve-manager.git] / www / manager6 / ceph / Pool.js
CommitLineData
024be9c7
DM
1Ext.define('PVE.CephCreatePool', {
2 extend: 'PVE.window.Edit',
3 alias: ['widget.pveCephCreatePool'],
4
5 subject: 'Ceph Pool',
d5e771ce 6 isCreate: true,
c449c89a
DC
7 method: 'POST',
8 items: [
9 {
10 xtype: 'textfield',
11 fieldLabel: gettext('Name'),
12 name: 'name',
13 allowBlank: false
14 },
15 {
8a7e5598 16 xtype: 'pveIntegerField',
c449c89a
DC
17 fieldLabel: gettext('Size'),
18 name: 'size',
f441a266 19 value: 3,
c449c89a
DC
20 minValue: 1,
21 maxValue: 3,
22 allowBlank: false
23 },
24 {
8a7e5598 25 xtype: 'pveIntegerField',
c449c89a
DC
26 fieldLabel: gettext('Min. Size'),
27 name: 'min_size',
f441a266 28 value: 2,
c449c89a
DC
29 minValue: 1,
30 maxValue: 3,
31 allowBlank: false
32 },
33 {
8a7e5598 34 xtype: 'pveIntegerField',
2ce6111f 35 fieldLabel: 'Crush RuleSet', // do not localize
c449c89a
DC
36 name: 'crush_ruleset',
37 value: 0,
38 minValue: 0,
39 maxValue: 32768,
40 allowBlank: false
41 },
42 {
8a7e5598 43 xtype: 'pveIntegerField',
c449c89a
DC
44 fieldLabel: 'pg_num',
45 name: 'pg_num',
46 value: 64,
47 minValue: 8,
48 maxValue: 32768,
49 allowBlank: false
50 }
51 ],
c474314e 52 initComponent : function() {
024be9c7
DM
53 /*jslint confusion: true */
54 var me = this;
55
56 if (!me.nodename) {
57 throw "no node name specified";
58 }
59
60 Ext.applyIf(me, {
22f2f9d6 61 url: "/nodes/" + me.nodename + "/ceph/pools"
024be9c7
DM
62 });
63
64 me.callParent();
65 }
66});
67
68Ext.define('PVE.node.CephPoolList', {
69 extend: 'Ext.grid.GridPanel',
70 alias: ['widget.pveNodeCephPoolList'],
71
ba93a9c6 72 onlineHelp: 'chapter_pveceph',
361aafd0
DC
73 stateful: true,
74 stateId: 'grid-ceph-pools',
c449c89a
DC
75 bufferedRenderer: false,
76 features: [ { ftype: 'summary'} ],
77 columns: [
78 {
79 header: gettext('Name'),
80 width: 100,
81 sortable: true,
82 dataIndex: 'pool_name'
83 },
84 {
85 header: gettext('Size') + '/min',
86 width: 80,
87 sortable: false,
88 renderer: function(v, meta, rec) {
89 return v + '/' + rec.data.min_size;
90 },
91 dataIndex: 'size'
92 },
93 {
94 header: 'pg_num',
95 width: 100,
96 sortable: false,
97 dataIndex: 'pg_num'
98 },
99 {
100 header: 'ruleset',
101 width: 50,
102 sortable: false,
103 dataIndex: 'crush_ruleset'
104 },
105 {
106 header: gettext('Used'),
107 columns: [
108 {
109 header: '%',
110 width: 80,
111 sortable: true,
112 align: 'right',
113 renderer: Ext.util.Format.numberRenderer('0.00'),
114 dataIndex: 'percent_used',
115 summaryType: 'sum',
116 summaryRenderer: Ext.util.Format.numberRenderer('0.00')
117 },
118 {
119 header: gettext('Total'),
120 width: 100,
121 sortable: true,
122 renderer: PVE.Utils.render_size,
123 align: 'right',
124 dataIndex: 'bytes_used',
125 summaryType: 'sum',
126 summaryRenderer: PVE.Utils.render_size
127 }
128 ]
129 }
130 ],
024be9c7
DM
131 initComponent: function() {
132 var me = this;
133
134 var nodename = me.pveSelNode.data.node;
135 if (!nodename) {
136 throw "no node name specified";
137 }
138
139 var sm = Ext.create('Ext.selection.RowModel', {});
140
141 var rstore = Ext.create('PVE.data.UpdateStore', {
142 interval: 3000,
d5066d84 143 storeid: 'ceph-pool-list' + nodename,
024be9c7
DM
144 model: 'ceph-pool-list',
145 proxy: {
146 type: 'pve',
147 url: "/api2/json/nodes/" + nodename + "/ceph/pools"
148 }
149 });
150
151 var store = Ext.create('PVE.data.DiffStore', { rstore: rstore });
152
153 PVE.Utils.monStoreErrors(me, rstore);
154
155 var create_btn = new Ext.Button({
156 text: gettext('Create'),
157 handler: function() {
158 var win = Ext.create('PVE.CephCreatePool', {
159 nodename: nodename
160 });
161 win.show();
162 }
163 });
164
165 var remove_btn = new PVE.button.Button({
166 text: gettext('Remove'),
167 selModel: sm,
168 disabled: true,
169 confirmMsg: function(rec) {
170 var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'),
171 "'" + rec.data.pool_name + "'");
16152937 172 msg += " " + gettext('This will permanently erase all data.');
024be9c7
DM
173
174 return msg;
175 },
176 handler: function() {
177 var rec = sm.getSelection()[0];
178
179 if (!rec.data.pool_name) {
180 return;
181 }
182
183 PVE.Utils.API2Request({
c474314e 184 url: "/nodes/" + nodename + "/ceph/pools/" +
024be9c7
DM
185 rec.data.pool_name,
186 method: 'DELETE',
187 failure: function(response, opts) {
188 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
189 }
190 });
191 }
192 });
193
194 Ext.apply(me, {
195 store: store,
196 selModel: sm,
024be9c7 197 tbar: [ create_btn, remove_btn ],
024be9c7 198 listeners: {
c449c89a 199 activate: rstore.startUpdate,
024be9c7
DM
200 destroy: rstore.stopUpdate
201 }
202 });
203
204 me.callParent();
205 }
206}, function() {
207
208 Ext.define('ceph-pool-list', {
209 extend: 'Ext.data.Model',
c474314e
DC
210 fields: [ 'pool_name',
211 { name: 'pool', type: 'integer'},
212 { name: 'size', type: 'integer'},
213 { name: 'min_size', type: 'integer'},
214 { name: 'pg_num', type: 'integer'},
215 { name: 'bytes_used', type: 'integer'},
216 { name: 'percent_used', type: 'number'},
024be9c7
DM
217 { name: 'crush_ruleset', type: 'integer'}
218 ],
219 idProperty: 'pool_name'
220 });
221});