]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/ServiceList.js
9298974e8c46f1cbe21987b488892ad85394a9bd
1 Ext
.define('PVE.CephCreateService', {
2 extend
: 'Proxmox.window.Edit',
3 xtype
: 'pveCephCreateService',
7 setNode: function(nodename
) {
9 me
.nodename
= nodename
;
10 me
.url
= `/nodes/${nodename}/ceph/${me.type}/${nodename}`;
18 xtype
: 'pveNodeSelector',
20 fieldLabel
: gettext('Host'),
24 change: function(f
, value
) {
25 let view
= this.up('pveCephCreateService');
32 initComponent: function() {
36 throw "no node name specified";
39 throw "no type specified";
41 me
.setNode(me
.nodename
);
47 Ext
.define('PVE.node.CephServiceController', {
48 extend
: 'Ext.app.ViewController',
49 alias
: 'controller.CephServiceList',
51 render_status
: (value
, metadata
, rec
) => value
,
53 render_version: function(value
, metadata
, rec
) {
54 if (value
=== undefined) {
57 let view
= this.getView();
58 let host
= rec
.data
.host
, nodev
= [0];
59 if (view
.nodeversions
[host
] !== undefined) {
60 nodev
= view
.nodeversions
[host
].version
.parts
;
64 if (PVE
.Utils
.compare_ceph_versions(view
.maxversion
, nodev
) > 0) {
65 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_UPGRADE');
66 } else if (PVE
.Utils
.compare_ceph_versions(nodev
, value
) > 0) {
67 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OLD');
68 } else if (view
.mixedversions
) {
69 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OK');
74 getMaxVersions: function(store
, records
, success
) {
75 if (!success
|| records
.length
< 1) {
79 let view
= me
.getView();
81 view
.nodeversions
= records
[0].data
.node
;
83 view
.mixedversions
= false;
84 for (const [_nodename
, data
] of Object
.entries(view
.nodeversions
)) {
85 let res
= PVE
.Utils
.compare_ceph_versions(data
.version
.parts
, view
.maxversion
);
86 if (res
!== 0 && view
.maxversion
.length
> 0) {
87 view
.mixedversions
= true;
90 view
.maxversion
= data
.version
.parts
;
95 init: function(view
) {
96 if (view
.pveSelNode
) {
97 view
.nodename
= view
.pveSelNode
.data
.node
;
100 throw "no node name specified";
104 throw "no type specified";
107 view
.versionsstore
= Ext
.create('Proxmox.data.UpdateStore', {
110 storeid
: `ceph-versions-${view.type}-list${view.nodename}`,
113 url
: "/api2/json/cluster/ceph/metadata?scope=versions",
116 view
.versionsstore
.on('load', this.getMaxVersions
, this);
117 view
.on('destroy', view
.versionsstore
.stopUpdate
);
119 view
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
122 storeid
: `ceph-${view.type}-list${view.nodename}`,
123 model
: 'ceph-service-list',
126 url
: `/api2/json/nodes/${view.nodename}/ceph/${view.type}`,
130 view
.setStore(Ext
.create('Proxmox.data.DiffStore', {
132 sorters
: [{ property
: 'name' }],
135 if (view
.storeLoadCallback
) {
136 view
.rstore
.on('load', view
.storeLoadCallback
, this);
138 view
.on('destroy', view
.rstore
.stopUpdate
);
140 if (view
.showCephInstallMask
) {
141 PVE
.Utils
.monitor_ceph_installed(view
, view
.rstore
, view
.nodename
, true);
145 service_cmd: function(rec
, cmd
) {
146 let view
= this.getView();
147 if (!rec
.data
.host
) {
148 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
151 Proxmox
.Utils
.API2Request({
152 url
: `/nodes/${rec.data.host}/ceph/${cmd}`,
154 params
: { service
: view
.type
+ '.' + rec
.data
.name
},
155 success: function(response
, options
) {
156 Ext
.create('Proxmox.window.TaskProgress', {
158 upid
: response
.result
.data
,
159 taskDone
: () => view
.rstore
.load(),
162 failure
: (response
, _opts
) => Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
165 onChangeService: function(button
) {
167 let record
= me
.getView().getSelection()[0];
168 me
.service_cmd(record
, button
.action
);
171 showSyslog: function() {
172 let view
= this.getView();
173 let rec
= view
.getSelection()[0];
174 let service
= `ceph-${view.type}@${rec.data.name}`;
175 Ext
.create('Ext.window.Window', {
176 title
: `${gettext('Syslog')}: ${service}`,
183 xtype
: 'proxmoxLogView',
184 url
: `/api2/extjs/nodes/${rec.data.host}/syslog?service=${encodeURIComponent(service)}`,
185 log_select_timespan
: 1,
190 onCreate: function() {
191 let view
= this.getView();
192 Ext
.create('PVE.CephCreateService', {
194 nodename
: view
.nodename
,
195 subject
: view
.getTitle(),
197 taskDone
: () => view
.rstore
.load(),
202 Ext
.define('PVE.node.CephServiceList', {
203 extend
: 'Ext.grid.GridPanel',
204 xtype
: 'pveNodeCephServiceList',
206 onlineHelp
: 'chapter_pveceph',
207 emptyText
: gettext('No such service configured.'),
211 // will be called when the store loads
212 storeLoadCallback
: Ext
.emptyFn
,
214 // if set to true, does shows the ceph install mask if needed
215 showCephInstallMask
: false,
217 controller
: 'CephServiceList',
221 xtype
: 'proxmoxButton',
222 text
: gettext('Start'),
223 iconCls
: 'fa fa-play',
226 enableFn
: rec
=> rec
.data
.state
=== 'stopped' || rec
.data
.state
=== 'unknown',
227 handler
: 'onChangeService',
230 xtype
: 'proxmoxButton',
231 text
: gettext('Stop'),
232 iconCls
: 'fa fa-stop',
234 enableFn
: rec
=> rec
.data
.state
!== 'stopped',
236 handler
: 'onChangeService',
239 xtype
: 'proxmoxButton',
240 text
: gettext('Restart'),
241 iconCls
: 'fa fa-refresh',
244 enableFn
: rec
=> rec
.data
.state
!== 'stopped',
245 handler
: 'onChangeService',
249 text
: gettext('Create'),
250 reference
: 'createButton',
254 text
: gettext('Destroy'),
255 xtype
: 'proxmoxStdRemoveButton',
256 getUrl: function(rec
) {
257 let view
= this.up('grid');
258 if (!rec
.data
.host
) {
259 Ext
.Msg
.alert(gettext('Error'), "entry has no host, cannot build API url");
262 return `/nodes/${rec.data.host}/ceph/${view.type}/${rec.data.name}`;
264 callback: function(options
, success
, response
) {
265 let view
= this.up('grid');
267 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
270 Ext
.create('Proxmox.window.TaskProgress', {
272 upid
: response
.result
.data
,
273 taskDone
: () => view
.rstore
.load(),
279 xtype
: 'proxmoxButton',
280 text
: gettext('Syslog'),
282 handler
: 'showSyslog',
288 header
: gettext('Name'),
291 renderer: function(v
) {
292 return this.type
+ '.' + v
;
297 header
: gettext('Host'),
300 renderer: function(v
) {
301 return v
|| Proxmox
.Utils
.unknownText
;
306 header
: gettext('Status'),
309 renderer
: 'render_status',
313 header
: gettext('Address'),
316 renderer: function(v
) {
317 return v
|| Proxmox
.Utils
.unknownText
;
322 header
: gettext('Version'),
325 dataIndex
: 'version',
326 renderer
: 'render_version',
330 initComponent: function() {
333 if (me
.additionalColumns
) {
334 me
.columns
= me
.columns
.concat(me
.additionalColumns
);
341 Ext
.define('ceph-service-list', {
342 extend
: 'Ext.data.Model',
352 'ceph_version_short',
356 calculate
: data
=> PVE
.Utils
.parse_ceph_version(data
),
363 Ext
.define('PVE.node.CephMDSServiceController', {
364 extend
: 'PVE.node.CephServiceController',
365 alias
: 'controller.CephServiceMDSList',
367 render_status
: (value
, mD
, rec
) => rec
.data
.fs_name
? `${value} (${rec.data.fs_name})` : value
,
370 Ext
.define('PVE.node.CephMDSList', {
371 extend
: 'PVE.node.CephServiceList',
372 xtype
: 'pveNodeCephMDSList',
375 type
: 'CephServiceMDSList',