]>
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', {
140 storeid
: 'ceph-' + view
.type
+ '-list' + view
.nodename
,
141 model
: 'ceph-service-list',
144 url
: "/api2/json/nodes/" + view
.nodename
+ "/ceph/" + view
.type
148 view
.setStore(Ext
.create('Proxmox.data.DiffStore', {
150 sorters
: [{ property
: 'name' }]
153 if (view
.storeLoadCallback
) {
154 view
.rstore
.on('load', view
.storeLoadCallback
, this);
156 view
.on('destroy', view
.rstore
.stopUpdate
);
158 if (view
.showCephInstallMask
) {
159 var regex
= new RegExp("not (installed|initialized)", "i");
160 PVE
.Utils
.handleStoreErrorOrMask(view
, view
.rstore
, regex
, function(me
, error
) {
161 view
.rstore
.stopUpdate();
162 PVE
.Utils
.showCephInstallOrMask(view
.ownerCt
, error
.statusText
, view
.nodename
,
164 me
.mon(win
, 'cephInstallWindowClosed', function(){
165 view
.rstore
.startUpdate();
173 service_cmd: function(rec
, cmd
) {
174 var view
= this.getView();
175 if (!rec
.data
.host
) {
176 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
179 Proxmox
.Utils
.API2Request({
180 url
: "/nodes/" + rec
.data
.host
+ "/ceph/" + cmd
,
182 params
: { service
: view
.type
+ '.' + rec
.data
.name
},
183 success: function(response
, options
) {
184 var upid
= response
.result
.data
;
185 var win
= Ext
.create('Proxmox.window.TaskProgress', {
187 taskDone: function() {
193 failure: function(response
, opts
) {
194 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
198 onChangeService: function(btn
) {
200 var view
= this.getView();
201 var cmd
= btn
.action
;
202 var rec
= view
.getSelection()[0];
203 me
.service_cmd(rec
, cmd
);
206 showSyslog: function() {
207 var view
= this.getView();
208 var rec
= view
.getSelection()[0];
209 var servicename
= 'ceph-' + view
.type
+ '@' + rec
.data
.name
;
210 var url
= "/api2/extjs/nodes/" + rec
.data
.host
+ "/syslog?service=" + encodeURIComponent(servicename
);
211 var win
= Ext
.create('Ext.window.Window', {
212 title
: gettext('Syslog') + ': ' + servicename
,
218 xtype
: 'proxmoxLogView',
220 log_select_timespan
: 1
226 onCreate: function() {
227 var view
= this.getView();
228 var win
= Ext
.create('PVE.CephCreateService', {
230 nodename
: view
.nodename
,
231 subject
: view
.getTitle(),
233 taskDone: function() {
242 xtype
: 'proxmoxButton',
243 text
: gettext('Start'),
244 iconCls
: 'fa fa-play',
247 enableFn: function(rec
) {
248 return rec
.data
.state
=== 'stopped' ||
249 rec
.data
.state
=== 'unknown';
251 handler
: 'onChangeService'
254 xtype
: 'proxmoxButton',
255 text
: gettext('Stop'),
256 iconCls
: 'fa fa-stop',
258 enableFn: function(rec
) {
259 return rec
.data
.state
!== 'stopped';
262 handler
: 'onChangeService'
265 xtype
: 'proxmoxButton',
266 text
: gettext('Restart'),
267 iconCls
: 'fa fa-refresh',
270 enableFn: function(rec
) {
271 return rec
.data
.state
!== 'stopped';
273 handler
: 'onChangeService'
277 text
: gettext('Create'),
278 reference
: 'createButton',
282 text
: gettext('Destroy'),
283 xtype
: 'proxmoxStdRemoveButton',
284 getUrl: function(rec
) {
285 var view
= this.up('grid');
286 if (!rec
.data
.host
) {
287 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
290 return "/nodes/" + rec
.data
.host
+ "/ceph/" + view
.type
+ "/" + rec
.data
.name
;
292 callback: function(options
, success
, response
) {
293 var view
= this.up('grid');
295 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
298 var upid
= response
.result
.data
;
299 var win
= Ext
.create('Proxmox.window.TaskProgress', {
301 taskDone: function() {
310 xtype
: 'proxmoxButton',
311 text
: gettext('Syslog'),
313 handler
: 'showSyslog'
319 header
: gettext('Name'),
322 renderer: function(v
) {
323 return this.type
+ '.' + v
;
328 header
: gettext('Host'),
331 renderer: function(v
) {
332 return v
|| Proxmox
.Utils
.unknownText
;
337 header
: gettext('Status'),
343 header
: gettext('Address'),
346 renderer: function(v
) {
347 return v
|| Proxmox
.Utils
.unknownText
;
352 header
: gettext('Version'),
355 dataIndex
: 'version',
356 renderer
: 'render_version',
360 initComponent: function() {
363 if (me
.additionalColumns
) {
364 me
.columns
= me
.columns
.concat(me
.additionalColumns
);
372 Ext
.define('ceph-service-list', {
373 extend
: 'Ext.data.Model',
374 fields
: [ 'addr', 'name', 'rank', 'host', 'quorum', 'state',
375 'ceph_version', 'ceph_version_short',
376 { type
: 'string', name
: 'version', calculate: function(data
) {
377 return PVE
.Utils
.parse_ceph_version(data
);