--- /dev/null
+Ext.define('PVE.CephCreateMon', {
+ extend: 'PVE.window.Edit',
+ alias: ['widget.pveCephCreateMon'],
+
+ subject: 'Ceph Monitor',
+
+ showProgress: true,
+
+ setNode: function(nodename) {
+ var me = this;
+
+ me.nodename = nodename;
+ me.url = "/nodes/" + nodename + "/ceph/mon";
+ },
+
+ initComponent : function() {
+ /*jslint confusion: true */
+ var me = this;
+
+ if (!me.nodename) {
+ throw "no node name specified";
+ }
+
+ me.setNode(me.nodename);
+
+ me.create = true;
+
+ Ext.applyIf(me, {
+ method: 'POST',
+ items: [
+ {
+ xtype: 'PVE.form.NodeSelector',
+ submitValue: false,
+ fieldLabel: gettext('Host'),
+ selectCurNode: true,
+ allowBlank: false,
+ listeners: {
+ change: function(f, value) {
+ me.setNode(value);
+ }
+ }
+ }
+ ]
+ });
+
+ me.callParent();
+ }
+});
+
+Ext.define('PVE.node.CephMonList', {
+ extend: 'Ext.grid.GridPanel',
+ alias: ['widget.pveNodeCephMonList'],
+
+ initComponent: function() {
+ var me = this;
+
+ var nodename = me.pveSelNode.data.node;
+ if (!nodename) {
+ throw "no node name specified";
+ }
+
+ var sm = Ext.create('Ext.selection.RowModel', {});
+
+ var rstore = Ext.create('PVE.data.UpdateStore', {
+ interval: 3000,
+ storeid: 'ceph-mon-list',
+ model: 'ceph-mon-list',
+ proxy: {
+ type: 'pve',
+ url: "/api2/json/nodes/" + nodename + "/ceph/mon"
+ }
+ });
+
+ var store = Ext.create('PVE.data.DiffStore', { rstore: rstore });
+
+ PVE.Utils.monStoreErrors(me, rstore);
+
+ var service_cmd = function(cmd) {
+ var rec = sm.getSelection()[0];
+ if (!rec.data.host) {
+ Ext.Msg.alert(gettext('Error'), "entry has no host");
+ return;
+ }
+ PVE.Utils.API2Request({
+ url: "/nodes/" + rec.data.host + "/ceph/" + cmd,
+ method: 'POST',
+ params: { service: "mon." + rec.data.name },
+ success: function(response, options) {
+ var upid = response.result.data;
+ var win = Ext.create('PVE.window.TaskProgress', { upid: upid });
+ win.show();
+ },
+ failure: function(response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ }
+ });
+ };
+
+ var start_btn = new PVE.button.Button({
+ text: gettext('Start'),
+ selModel: sm,
+ disabled: true,
+ handler: function(){
+ service_cmd("start");
+ }
+ });
+
+ var stop_btn = new PVE.button.Button({
+ text: gettext('Stop'),
+ selModel: sm,
+ disabled: true,
+ handler: function(){
+ service_cmd("stop");
+ }
+ });
+
+ var create_btn = new Ext.Button({
+ text: gettext('Create'),
+ handler: function(){
+ var win = Ext.create('PVE.CephCreateMon', {
+ nodename: nodename
+ });
+ win.show();
+ }
+ });
+
+ var remove_btn = new PVE.button.Button({
+ text: gettext('Remove'),
+ selModel: sm,
+ disabled: true,
+ handler: function() {
+ var rec = sm.getSelection()[0];
+
+ if (!rec.data.host) {
+ Ext.Msg.alert(gettext('Error'), "entry has no host");
+ return;
+ }
+
+ PVE.Utils.API2Request({
+ url: "/nodes/" + rec.data.host + "/ceph/mon/" +
+ rec.data.name,
+ method: 'DELETE',
+ success: function(response, options) {
+ var upid = response.result.data;
+ var win = Ext.create('PVE.window.TaskProgress', { upid: upid });
+ win.show();
+ },
+ failure: function(response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ }
+ });
+ }
+ });
+
+ Ext.apply(me, {
+ store: store,
+ selModel: sm,
+ stateful: false,
+ tbar: [ start_btn, stop_btn, create_btn, remove_btn ],
+ columns: [
+ {
+ header: gettext('Name'),
+ width: 50,
+ sortable: true,
+ renderer: function(v) { return "mon." + v; },
+ dataIndex: 'name'
+ },
+ {
+ header: gettext('Host'),
+ width: 100,
+ sortable: true,
+ renderer: function(v) {
+ return v || 'unknown';
+ },
+ dataIndex: 'host'
+ },
+ {
+ header: gettext('Quorum'),
+ width: 50,
+ sortable: false,
+ renderer: PVE.Utils.format_boolean,
+ dataIndex: 'quorum'
+ },
+ {
+ header: gettext('Address'),
+ flex: 1,
+ sortable: true,
+ dataIndex: 'addr'
+ }
+ ],
+ listeners: {
+ show: rstore.startUpdate,
+ hide: rstore.stopUpdate,
+ destroy: rstore.stopUpdate
+ }
+ });
+
+ me.callParent();
+ }
+}, function() {
+
+ Ext.define('ceph-mon-list', {
+ extend: 'Ext.data.Model',
+ fields: [ 'addr', 'name', 'rank', 'host', 'quorum' ],
+ idProperty: 'name'
+ });
+});