]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/Monitor.js
added basic ability to install ceph via gui
[pve-manager.git] / www / manager6 / ceph / Monitor.js
1 Ext.define('PVE.CephCreateMon', {
2 extend: 'Proxmox.window.Edit',
3 alias: ['widget.pveCephCreateMon'],
4
5 subject: 'Ceph Monitor/Manager',
6 onlineHelp: 'pve_ceph_monitors',
7
8 showProgress: true,
9
10 setNode: function(nodename) {
11 var me = this;
12
13 me.nodename = nodename;
14 me.url = "/nodes/" + nodename + "/ceph/mon";
15 },
16
17 initComponent : function() {
18
19 var me = this;
20
21 if (!me.nodename) {
22 throw "no node name specified";
23 }
24
25 me.setNode(me.nodename);
26
27 me.isCreate = true;
28
29 Ext.applyIf(me, {
30 method: 'POST',
31 items: [
32 {
33 xtype: 'pveNodeSelector',
34 submitValue: false,
35 fieldLabel: gettext('Host'),
36 selectCurNode: true,
37 allowBlank: false,
38 listeners: {
39 change: function(f, value) {
40 me.setNode(value);
41 }
42 }
43 }
44 ]
45 });
46
47 me.callParent();
48 }
49 });
50
51 Ext.define('PVE.node.CephMonList', {
52 extend: 'Ext.grid.GridPanel',
53 alias: ['widget.pveNodeCephMonList'],
54
55 onlineHelp: 'chapter_pveceph',
56
57 stateful: true,
58 stateId: 'grid-ceph-monitor',
59
60 initComponent: function() {
61 var me = this;
62
63 var nodename = me.pveSelNode.data.node;
64 if (!nodename) {
65 throw "no node name specified";
66 }
67
68 var sm = Ext.create('Ext.selection.RowModel', {});
69
70 var rstore = Ext.create('Proxmox.data.UpdateStore', {
71 interval: 3000,
72 storeid: 'ceph-mon-list' + nodename,
73 model: 'ceph-mon-list',
74 proxy: {
75 type: 'proxmox',
76 url: "/api2/json/nodes/" + nodename + "/ceph/mon"
77 }
78 });
79
80 var store = Ext.create('Proxmox.data.DiffStore', {
81 rstore: rstore,
82 sorters: [{ property: 'name'}]
83 });
84
85
86 var service_cmd = function(cmd) {
87 var rec = sm.getSelection()[0];
88 if (!rec.data.host) {
89 Ext.Msg.alert(gettext('Error'), "entry has no host");
90 return;
91 }
92 Proxmox.Utils.API2Request({
93 url: "/nodes/" + rec.data.host + "/ceph/" + cmd,
94 method: 'POST',
95 params: { service: "mon." + rec.data.name },
96 success: function(response, options) {
97 var upid = response.result.data;
98 var win = Ext.create('Proxmox.window.TaskProgress', { upid: upid });
99 win.show();
100 },
101 failure: function(response, opts) {
102 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
103 }
104 });
105 };
106
107 var start_btn = new Proxmox.button.Button({
108 text: gettext('Start'),
109 selModel: sm,
110 disabled: true,
111 handler: function(){
112 service_cmd("start");
113 }
114 });
115
116 var stop_btn = new Proxmox.button.Button({
117 text: gettext('Stop'),
118 selModel: sm,
119 disabled: true,
120 handler: function(){
121 service_cmd("stop");
122 }
123 });
124
125 var restart_btn = new Proxmox.button.Button({
126 text: gettext('Restart'),
127 selModel: sm,
128 disabled: true,
129 handler: function(){
130 service_cmd("restart");
131 }
132 });
133
134 var create_btn = new Ext.Button({
135 text: gettext('Create'),
136 handler: function(){
137 var win = Ext.create('PVE.CephCreateMon', {
138 nodename: nodename
139 });
140 win.show();
141 }
142 });
143
144 var remove_btn = new Proxmox.button.Button({
145 text: gettext('Remove'),
146 selModel: sm,
147 disabled: true,
148 handler: function() {
149 var rec = sm.getSelection()[0];
150
151 if (!rec.data.host) {
152 Ext.Msg.alert(gettext('Error'), "entry has no host");
153 return;
154 }
155
156 Proxmox.Utils.API2Request({
157 url: "/nodes/" + rec.data.host + "/ceph/mon/" +
158 rec.data.name,
159 method: 'DELETE',
160 success: function(response, options) {
161 var upid = response.result.data;
162 var win = Ext.create('Proxmox.window.TaskProgress', { upid: upid });
163 win.show();
164 },
165 failure: function(response, opts) {
166 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
167 }
168 });
169 }
170 });
171
172 Ext.apply(me, {
173 store: store,
174 selModel: sm,
175 tbar: [ start_btn, stop_btn, restart_btn, '-', create_btn, remove_btn ],
176 columns: [
177 {
178 header: gettext('Name'),
179 width: 100,
180 sortable: true,
181 renderer: function(v) { return "mon." + v; },
182 dataIndex: 'name'
183 },
184 {
185 header: gettext('Host'),
186 width: 100,
187 sortable: true,
188 renderer: function(v) {
189 return v || 'unknown';
190 },
191 dataIndex: 'host'
192 },
193 {
194 header: gettext('Quorum'),
195 width: 70,
196 sortable: false,
197 renderer: Proxmox.Utils.format_boolean,
198 dataIndex: 'quorum'
199 },
200 {
201 header: gettext('Address'),
202 flex: 1,
203 sortable: true,
204 dataIndex: 'addr'
205 }
206 ],
207 listeners: {
208 activate: rstore.startUpdate,
209 destroy: rstore.stopUpdate
210 }
211 });
212
213 var regex = new RegExp("not (installed|initialized)", "i");
214 PVE.Utils.handleStoreErrorOrMask(me, rstore, regex, function(me, error){
215 me.store.rstore.stopUpdate();
216 PVE.Utils.showCephInstallOrMask(me, error.statusText, nodename,
217 function(win){
218 me.mon(win, 'cephInstallWindowClosed', function(){
219 me.store.rstore.startUpdate();
220 });
221 }
222 );
223 });
224
225 me.callParent();
226 }
227 }, function() {
228
229 Ext.define('ceph-mon-list', {
230 extend: 'Ext.data.Model',
231 fields: [ 'addr', 'name', 'rank', 'host', 'quorum' ],
232 idProperty: 'name'
233 });
234 });