]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/ServiceList.js
1 Ext
.define('PVE.CephCreateService', {
2 extend
: 'Proxmox.window.Edit',
3 xtype
: 'pveCephCreateService',
7 setNode: function(nodename
) {
10 me
.nodename
= nodename
;
11 me
.url
= "/nodes/" + nodename
+ "/ceph/" + me
.type
+ "/" + nodename
;
19 xtype
: 'pveNodeSelector',
21 fieldLabel
: gettext('Host'),
25 change: function(f
, value
) {
26 var me
= this.up('pveCephCreateService');
33 initComponent : function() {
37 throw "no node name specified";
41 throw "no type specified";
44 me
.setNode(me
.nodename
);
50 Ext
.define('PVE.node.CephServiceList', {
51 extend
: 'Ext.grid.GridPanel',
52 xtype
: 'pveNodeCephServiceList',
54 onlineHelp
: 'chapter_pveceph',
55 emptyText
: gettext('No such service configured.'),
59 // will be called when the store loads
60 storeLoadCallback
: Ext
.emptyFn
,
62 // if set to true, does shows the ceph install mask if needed
63 showCephInstallMask
: false,
66 xclass
: 'Ext.app.ViewController',
68 render_version: function(value
, metadata
, rec
) {
69 let me
= this.getView();
70 let host
= rec
.data
.host
;
74 if (me
.nodeversions
[host
] !== undefined) {
75 nodev
= me
.nodeversions
[host
].version
.parts
;
77 let maxv
= me
.maxversion
;
79 if (PVE
.Utils
.compare_ceph_versions(maxv
, nodev
) > 0) {
80 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_UPGRADE');
81 } else if (PVE
.Utils
.compare_ceph_versions(nodev
, v
) > 0) {
82 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OLD');
83 } else if (me
.mixedversions
) {
84 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OK');
90 getMaxVersions: function(store
, records
, success
) {
91 if (!success
|| records
.length
< 1) {
95 let view
= me
.getView();
97 view
.nodeversions
= records
[0].data
.node
;
99 view
.mixedversions
= false;
100 for (const [nodename
, data
] of Object
.entries(view
.nodeversions
)) {
101 let res
= PVE
.Utils
.compare_ceph_versions(data
.version
.parts
, view
.maxversion
);
102 if (res
!== 0 && view
.maxversion
.length
> 0) {
103 view
.mixedversions
= true;
106 view
.maxversion
= data
.version
.parts
;
111 init: function(view
) {
112 if (view
.pveSelNode
) {
113 view
.nodename
= view
.pveSelNode
.data
.node
;
115 if (!view
.nodename
) {
116 throw "no node name specified";
120 throw "no type specified";
123 view
.versionsstore
= Ext
.create('Proxmox.data.UpdateStore', {
126 storeid
: 'ceph-versions-' + view
.type
+ '-list' + view
.nodename
,
129 url
: "/api2/json/cluster/ceph/metadata?scope=versions",
133 view
.versionsstore
.on('load', this.getMaxVersions
, this);
134 view
.on('destroy', view
.versionsstore
.stopUpdate
);
136 view
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
139 storeid
: 'ceph-' + view
.type
+ '-list' + view
.nodename
,
140 model
: 'ceph-service-list',
143 url
: "/api2/json/nodes/" + view
.nodename
+ "/ceph/" + view
.type
,
147 view
.setStore(Ext
.create('Proxmox.data.DiffStore', {
149 sorters
: [{ property
: 'name' }],
152 if (view
.storeLoadCallback
) {
153 view
.rstore
.on('load', view
.storeLoadCallback
, this);
155 view
.on('destroy', view
.rstore
.stopUpdate
);
157 if (view
.showCephInstallMask
) {
158 var regex
= new RegExp("not (installed|initialized)", "i");
159 PVE
.Utils
.handleStoreErrorOrMask(view
, view
.rstore
, regex
, function(me
, error
) {
160 view
.rstore
.stopUpdate();
161 PVE
.Utils
.showCephInstallOrMask(view
.ownerCt
, error
.statusText
, view
.nodename
,
163 me
.mon(win
, 'cephInstallWindowClosed', function(){
164 view
.rstore
.startUpdate();
172 service_cmd: function(rec
, cmd
) {
173 var view
= this.getView();
174 if (!rec
.data
.host
) {
175 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
178 Proxmox
.Utils
.API2Request({
179 url
: "/nodes/" + rec
.data
.host
+ "/ceph/" + cmd
,
181 params
: { service
: view
.type
+ '.' + rec
.data
.name
},
182 success: function(response
, options
) {
183 var upid
= response
.result
.data
;
184 var win
= Ext
.create('Proxmox.window.TaskProgress', {
186 taskDone: function() {
192 failure: function(response
, opts
) {
193 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
197 onChangeService: function(btn
) {
199 var view
= this.getView();
200 var cmd
= btn
.action
;
201 var rec
= view
.getSelection()[0];
202 me
.service_cmd(rec
, cmd
);
205 showSyslog: function() {
206 var view
= this.getView();
207 var rec
= view
.getSelection()[0];
208 var servicename
= 'ceph-' + view
.type
+ '@' + rec
.data
.name
;
209 var url
= "/api2/extjs/nodes/" + rec
.data
.host
+ "/syslog?service=" + encodeURIComponent(servicename
);
210 var win
= Ext
.create('Ext.window.Window', {
211 title
: gettext('Syslog') + ': ' + servicename
,
217 xtype
: 'proxmoxLogView',
219 log_select_timespan
: 1,
225 onCreate: function() {
226 var view
= this.getView();
227 var win
= Ext
.create('PVE.CephCreateService', {
229 nodename
: view
.nodename
,
230 subject
: view
.getTitle(),
232 taskDone: function() {
241 xtype
: 'proxmoxButton',
242 text
: gettext('Start'),
243 iconCls
: 'fa fa-play',
246 enableFn: function(rec
) {
247 return rec
.data
.state
=== 'stopped' ||
248 rec
.data
.state
=== 'unknown';
250 handler
: 'onChangeService',
253 xtype
: 'proxmoxButton',
254 text
: gettext('Stop'),
255 iconCls
: 'fa fa-stop',
257 enableFn: function(rec
) {
258 return rec
.data
.state
!== 'stopped';
261 handler
: 'onChangeService',
264 xtype
: 'proxmoxButton',
265 text
: gettext('Restart'),
266 iconCls
: 'fa fa-refresh',
269 enableFn: function(rec
) {
270 return rec
.data
.state
!== 'stopped';
272 handler
: 'onChangeService',
276 text
: gettext('Create'),
277 reference
: 'createButton',
281 text
: gettext('Destroy'),
282 xtype
: 'proxmoxStdRemoveButton',
283 getUrl: function(rec
) {
284 var view
= this.up('grid');
285 if (!rec
.data
.host
) {
286 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
289 return "/nodes/" + rec
.data
.host
+ "/ceph/" + view
.type
+ "/" + rec
.data
.name
;
291 callback: function(options
, success
, response
) {
292 var view
= this.up('grid');
294 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
297 var upid
= response
.result
.data
;
298 var win
= Ext
.create('Proxmox.window.TaskProgress', {
300 taskDone: function() {
309 xtype
: 'proxmoxButton',
310 text
: gettext('Syslog'),
312 handler
: 'showSyslog',
318 header
: gettext('Name'),
321 renderer: function(v
) {
322 return this.type
+ '.' + v
;
327 header
: gettext('Host'),
330 renderer: function(v
) {
331 return v
|| Proxmox
.Utils
.unknownText
;
336 header
: gettext('Status'),
342 header
: gettext('Address'),
345 renderer: function(v
) {
346 return v
|| Proxmox
.Utils
.unknownText
;
351 header
: gettext('Version'),
354 dataIndex
: 'version',
355 renderer
: 'render_version',
359 initComponent: function() {
362 if (me
.additionalColumns
) {
363 me
.columns
= me
.columns
.concat(me
.additionalColumns
);
371 Ext
.define('ceph-service-list', {
372 extend
: 'Ext.data.Model',
373 fields
: [ 'addr', 'name', 'rank', 'host', 'quorum', 'state',
374 'ceph_version', 'ceph_version_short',
375 { type
: 'string', name
: 'version', calculate: function(data
) {
376 return PVE
.Utils
.parse_ceph_version(data
);