]>
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 let view
= this.getView();
67 let host
= rec
.data
.host
, nodev
= [0];
68 if (view
.nodeversions
[host
] !== undefined) {
69 nodev
= view
.nodeversions
[host
].version
.parts
;
73 if (PVE
.Utils
.compare_ceph_versions(view
.maxversion
, nodev
) > 0) {
74 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_UPGRADE');
75 } else if (PVE
.Utils
.compare_ceph_versions(nodev
, value
) > 0) {
76 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OLD');
77 } else if (view
.mixedversions
) {
78 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OK');
83 getMaxVersions: function(store
, records
, success
) {
84 if (!success
|| records
.length
< 1) {
88 let view
= me
.getView();
90 view
.nodeversions
= records
[0].data
.node
;
92 view
.mixedversions
= false;
93 for (const [_nodename
, data
] of Object
.entries(view
.nodeversions
)) {
94 let res
= PVE
.Utils
.compare_ceph_versions(data
.version
.parts
, view
.maxversion
);
95 if (res
!== 0 && view
.maxversion
.length
> 0) {
96 view
.mixedversions
= true;
99 view
.maxversion
= data
.version
.parts
;
104 init: function(view
) {
105 if (view
.pveSelNode
) {
106 view
.nodename
= view
.pveSelNode
.data
.node
;
108 if (!view
.nodename
) {
109 throw "no node name specified";
113 throw "no type specified";
116 view
.versionsstore
= Ext
.create('Proxmox.data.UpdateStore', {
119 storeid
: `ceph-versions-${view.type}-list${view.nodename}`,
122 url
: "/api2/json/cluster/ceph/metadata?scope=versions",
125 view
.versionsstore
.on('load', this.getMaxVersions
, this);
126 view
.on('destroy', view
.versionsstore
.stopUpdate
);
128 view
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
131 storeid
: `ceph-${view.type}-list${view.nodename}`,
132 model
: 'ceph-service-list',
135 url
: `/api2/json/nodes/${view.nodename}/ceph/${view.type}`,
139 view
.setStore(Ext
.create('Proxmox.data.DiffStore', {
141 sorters
: [{ property
: 'name' }],
144 if (view
.storeLoadCallback
) {
145 view
.rstore
.on('load', view
.storeLoadCallback
, this);
147 view
.on('destroy', view
.rstore
.stopUpdate
);
149 if (view
.showCephInstallMask
) {
150 PVE
.Utils
.monitor_ceph_installed(view
, view
.rstore
, view
.nodename
, true);
154 service_cmd: function(rec
, cmd
) {
155 let view
= this.getView();
156 if (!rec
.data
.host
) {
157 Ext
.Msg
.alert(gettext('Error'), "entry has no host");
160 Proxmox
.Utils
.API2Request({
161 url
: `/nodes/${rec.data.host}/ceph/${cmd}`,
163 params
: { service
: view
.type
+ '.' + rec
.data
.name
},
164 success: function(response
, options
) {
165 Ext
.create('Proxmox.window.TaskProgress', {
167 upid
: response
.result
.data
,
168 taskDone
: () => view
.rstore
.load(),
171 failure
: (response
, _opts
) => Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
174 onChangeService: function(button
) {
176 let record
= me
.getView().getSelection()[0];
177 me
.service_cmd(record
, button
.action
);
180 showSyslog: function() {
181 let view
= this.getView();
182 let rec
= view
.getSelection()[0];
183 let service
= `ceph-${view.type}@${rec.data.name}`;
184 Ext
.create('Ext.window.Window', {
185 title
: `${gettext('Syslog')}: ${service}`,
192 xtype
: 'proxmoxLogView',
193 url
: `/api2/extjs/nodes/${rec.data.host}/syslog?service=${encodeURIComponent(service)}`,
194 log_select_timespan
: 1,
199 onCreate: function() {
200 let view
= this.getView();
201 Ext
.create('PVE.CephCreateService', {
203 nodename
: view
.nodename
,
204 subject
: view
.getTitle(),
206 taskDone
: () => view
.rstore
.load(),
213 xtype
: 'proxmoxButton',
214 text
: gettext('Start'),
215 iconCls
: 'fa fa-play',
218 enableFn
: rec
=> rec
.data
.state
=== 'stopped' || rec
.data
.state
=== 'unknown',
219 handler
: 'onChangeService',
222 xtype
: 'proxmoxButton',
223 text
: gettext('Stop'),
224 iconCls
: 'fa fa-stop',
226 enableFn
: rec
=> rec
.data
.state
!== 'stopped',
228 handler
: 'onChangeService',
231 xtype
: 'proxmoxButton',
232 text
: gettext('Restart'),
233 iconCls
: 'fa fa-refresh',
236 enableFn
: rec
=> rec
.data
.state
!== 'stopped',
237 handler
: 'onChangeService',
241 text
: gettext('Create'),
242 reference
: 'createButton',
246 text
: gettext('Destroy'),
247 xtype
: 'proxmoxStdRemoveButton',
248 getUrl: function(rec
) {
249 let view
= this.up('grid');
250 if (!rec
.data
.host
) {
251 Ext
.Msg
.alert(gettext('Error'), "entry has no host, cannot build API url");
254 return `/nodes/${rec.data.host}/ceph/${view.type}/${rec.data.name}`;
256 callback: function(options
, success
, response
) {
257 let view
= this.up('grid');
259 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
262 Ext
.create('Proxmox.window.TaskProgress', {
264 upid
: response
.result
.data
,
265 taskDone
: () => view
.rstore
.load(),
271 xtype
: 'proxmoxButton',
272 text
: gettext('Syslog'),
274 handler
: 'showSyslog',
280 header
: gettext('Name'),
283 renderer: function(v
) {
284 return this.type
+ '.' + v
;
289 header
: gettext('Host'),
292 renderer: function(v
) {
293 return v
|| Proxmox
.Utils
.unknownText
;
298 header
: gettext('Status'),
304 header
: gettext('Address'),
307 renderer: function(v
) {
308 return v
|| Proxmox
.Utils
.unknownText
;
313 header
: gettext('Version'),
316 dataIndex
: 'version',
317 renderer
: 'render_version',
321 initComponent: function() {
324 if (me
.additionalColumns
) {
325 me
.columns
= me
.columns
.concat(me
.additionalColumns
);
332 Ext
.define('ceph-service-list', {
333 extend
: 'Ext.data.Model',
342 'ceph_version_short',
346 calculate
: data
=> PVE
.Utils
.parse_ceph_version(data
),