]>
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
) {
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.CephServiceList', {
48 extend
: 'Ext.grid.GridPanel',
49 xtype
: 'pveNodeCephServiceList',
51 onlineHelp
: 'chapter_pveceph',
52 emptyText
: gettext('No such service configured.'),
56 // will be called when the store loads
57 storeLoadCallback
: Ext
.emptyFn
,
59 // if set to true, does shows the ceph install mask if needed
60 showCephInstallMask
: false,
63 xclass
: 'Ext.app.ViewController',
65 render_version: function(value
, metadata
, rec
) {
66 if (value
=== undefined) {
69 let view
= this.getView();
70 let host
= rec
.data
.host
, nodev
= [0];
71 if (view
.nodeversions
[host
] !== undefined) {
72 nodev
= view
.nodeversions
[host
].version
.parts
;
76 if (PVE
.Utils
.compare_ceph_versions(view
.maxversion
, nodev
) > 0) {
77 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_UPGRADE');
78 } else if (PVE
.Utils
.compare_ceph_versions(nodev
, value
) > 0) {
79 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OLD');
80 } else if (view
.mixedversions
) {
81 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OK');
86 getMaxVersions: function(store
, records
, success
) {
87 if (!success
|| records
.length
< 1) {
91 let view
= me
.getView();
93 view
.nodeversions
= records
[0].data
.node
;
95 view
.mixedversions
= false;
96 for (const [_nodename
, data
] of Object
.entries(view
.nodeversions
)) {
97 let res
= PVE
.Utils
.compare_ceph_versions(data
.version
.parts
, view
.maxversion
);
98 if (res
!== 0 && view
.maxversion
.length
> 0) {
99 view
.mixedversions
= true;
102 view
.maxversion
= data
.version
.parts
;
107 init: function(view
) {
108 if (view
.pveSelNode
) {
109 view
.nodename
= view
.pveSelNode
.data
.node
;
111 if (!view
.nodename
) {
112 throw "no node name specified";
116 throw "no type specified";
119 view
.versionsstore
= Ext
.create('Proxmox.data.UpdateStore', {
122 storeid
: `ceph-versions-${view.type}-list${view.nodename}`,
125 url
: "/api2/json/cluster/ceph/metadata?scope=versions",
128 view
.versionsstore
.on('load', this.getMaxVersions
, this);
129 view
.on('destroy', view
.versionsstore
.stopUpdate
);
131 view
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
134 storeid
: `ceph-${view.type}-list${view.nodename}`,
135 model
: 'ceph-service-list',
138 url
: `/api2/json/nodes/${view.nodename}/ceph/${view.type}`,
142 view
.setStore(Ext
.create('Proxmox.data.DiffStore', {
144 sorters
: [{ property
: 'name' }],
147 if (view
.storeLoadCallback
) {
148 view
.rstore
.on('load', view
.storeLoadCallback
, this);
150 view
.on('destroy', view
.rstore
.stopUpdate
);
152 if (view
.showCephInstallMask
) {
153 PVE
.Utils
.monitor_ceph_installed(view
, view
.rstore
, view
.nodename
, true);
157 service_cmd: function(rec
, cmd
) {
158 let view
= this.getView();
159 if (!rec
.data
.host
) {
160 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
163 Proxmox
.Utils
.API2Request({
164 url
: `/nodes/${rec.data.host}/ceph/${cmd}`,
166 params
: { service
: view
.type
+ '.' + rec
.data
.name
},
167 success: function(response
, options
) {
168 Ext
.create('Proxmox.window.TaskProgress', {
170 upid
: response
.result
.data
,
171 taskDone
: () => view
.rstore
.load(),
174 failure
: (response
, _opts
) => Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
177 onChangeService: function(button
) {
179 let record
= me
.getView().getSelection()[0];
180 me
.service_cmd(record
, button
.action
);
183 showSyslog: function() {
184 let view
= this.getView();
185 let rec
= view
.getSelection()[0];
186 let service
= `ceph-${view.type}@${rec.data.name}`;
187 Ext
.create('Ext.window.Window', {
188 title
: `${gettext('Syslog')}: ${service}`,
195 xtype
: 'proxmoxLogView',
196 url
: `/api2/extjs/nodes/${rec.data.host}/syslog?service=${encodeURIComponent(service)}`,
197 log_select_timespan
: 1,
202 onCreate: function() {
203 let view
= this.getView();
204 Ext
.create('PVE.CephCreateService', {
206 nodename
: view
.nodename
,
207 subject
: view
.getTitle(),
209 taskDone
: () => view
.rstore
.load(),
216 xtype
: 'proxmoxButton',
217 text
: gettext('Start'),
218 iconCls
: 'fa fa-play',
221 enableFn
: rec
=> rec
.data
.state
=== 'stopped' || rec
.data
.state
=== 'unknown',
222 handler
: 'onChangeService',
225 xtype
: 'proxmoxButton',
226 text
: gettext('Stop'),
227 iconCls
: 'fa fa-stop',
229 enableFn
: rec
=> rec
.data
.state
!== 'stopped',
231 handler
: 'onChangeService',
234 xtype
: 'proxmoxButton',
235 text
: gettext('Restart'),
236 iconCls
: 'fa fa-refresh',
239 enableFn
: rec
=> rec
.data
.state
!== 'stopped',
240 handler
: 'onChangeService',
244 text
: gettext('Create'),
245 reference
: 'createButton',
249 text
: gettext('Destroy'),
250 xtype
: 'proxmoxStdRemoveButton',
251 getUrl: function(rec
) {
252 let view
= this.up('grid');
253 if (!rec
.data
.host
) {
254 Ext
.Msg
.alert(gettext('Error'), "entry has no host, cannot build API url");
257 return `/nodes/${rec.data.host}/ceph/${view.type}/${rec.data.name}`;
259 callback: function(options
, success
, response
) {
260 let view
= this.up('grid');
262 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
265 Ext
.create('Proxmox.window.TaskProgress', {
267 upid
: response
.result
.data
,
268 taskDone
: () => view
.rstore
.load(),
274 xtype
: 'proxmoxButton',
275 text
: gettext('Syslog'),
277 handler
: 'showSyslog',
283 header
: gettext('Name'),
286 renderer: function(v
) {
287 return this.type
+ '.' + v
;
292 header
: gettext('Host'),
295 renderer: function(v
) {
296 return v
|| Proxmox
.Utils
.unknownText
;
301 header
: gettext('Status'),
307 header
: gettext('Address'),
310 renderer: function(v
) {
311 return v
|| Proxmox
.Utils
.unknownText
;
316 header
: gettext('Version'),
319 dataIndex
: 'version',
320 renderer
: 'render_version',
324 initComponent: function() {
327 if (me
.additionalColumns
) {
328 me
.columns
= me
.columns
.concat(me
.additionalColumns
);
335 Ext
.define('ceph-service-list', {
336 extend
: 'Ext.data.Model',
345 'ceph_version_short',
349 calculate
: data
=> PVE
.Utils
.parse_ceph_version(data
),