]> git.proxmox.com Git - pmg-gui.git/blobdiff - js/ClusterAdministration.js
fix #4137: display receiver in attachment/virus quarantine
[pmg-gui.git] / js / ClusterAdministration.js
index ccbc9d77a841ee10c5f274731b7e83708db427b8..105b2a69873a08e8df60606248bc7d222026275c 100644 (file)
@@ -2,13 +2,107 @@ Ext.define('pmg-cluster', {
     extend: 'Ext.data.Model',
     fields: [
        'type', 'name', 'ip', 'hostrsapubkey', 'rootrsapubkey',
-       'fingerprint', { type: 'integer', name: 'cid' }
+       'fingerprint', { type: 'integer', name: 'cid' },
+       { type: 'boolean', name: 'insync' },
+       'memory', 'loadavg', 'uptime', 'rootfs', 'conn_error', 'level',
+       {
+ type: 'number', name: 'memory_per',
+         calculate: function(data) {
+             var mem = data.memory;
+             return Ext.isObject(mem) ? mem.used/mem.total : 0;
+         },
+       },
+       {
+ type: 'number', name: 'rootfs_per',
+         calculate: function(data) {
+             var du = data.rootfs;
+             return Ext.isObject(du) ? du.used/du.total : 0;
+         },
+       },
     ],
     proxy: {
         type: 'proxmox',
-       url: "/api2/json/config/cluster"
+       url: "/api2/json/config/cluster/status",
     },
-    idProperty: 'cid'
+    idProperty: 'cid',
+});
+
+Ext.define('PMG.ClusterJoinNodeWindow', {
+    extend: 'Proxmox.window.Edit',
+    xtype: 'pmgClusterJoinNodeWindow',
+    onlineHelp: 'pmgcm_join',
+
+    title: gettext('Cluster Join'),
+
+    width: 800,
+
+    method: 'POST',
+
+    url: '/config/cluster/join',
+
+    items: [
+       {
+           xtype: 'textfield',
+           fieldLabel: 'IP Address',
+           name: 'master_ip',
+       },
+       {
+           xtype: 'textfield',
+           inputType: 'password',
+           fieldLabel: gettext('Password'),
+           name: 'password',
+       },
+       {
+           xtype: 'textfield',
+           fieldLabel: gettext('Fingerprint'),
+           name: 'fingerprint',
+       },
+    ],
+});
+
+Ext.define('PMG.ClusterAddNodeWindow', {
+    extend: 'Ext.window.Window',
+    xtype: 'pmgClusterAddNodeWindow',
+    mixins: ['Proxmox.Mixin.CBind'],
+
+    width: 800,
+
+    modal: true,
+
+    title: gettext('Cluster Join') + ' : ' + gettext('Information'),
+
+    ipAddress: undefined,
+
+    fingerprint: undefined,
+
+    items: [
+       {
+           xtype: 'component',
+           border: false,
+           padding: '10 10 10 10',
+           html: gettext("Please use the 'Join' button on the node you want to add, using the following IP address and fingerprint."),
+       },
+       {
+           xtype: 'container',
+           layout: 'form',
+           border: false,
+           padding: '0 10 10 10',
+           items: [
+               {
+                   xtype: 'textfield',
+                   fieldLabel: gettext('IP Address'),
+                   cbind: { value: '{ipAddress}' },
+                   editable: false,
+               },
+               {
+                   xtype: 'textfield',
+                   fieldLabel: gettext('Fingerprint'),
+                   cbind: { value: '{fingerprint}' },
+                   editable: false,
+               },
+           ],
+       },
+    ],
 });
 
 Ext.define('PMG.ClusterAdministration', {
@@ -24,8 +118,8 @@ Ext.define('PMG.ClusterAdministration', {
        parent: null,
        data: {
            nodecount: 0,
-           master: undefined
-       }
+           master: null,
+       },
     },
 
     items: [
@@ -37,13 +131,17 @@ Ext.define('PMG.ClusterAdministration', {
 
                init: function(view) {
                    view.store.on('load', this.onLoad, this);
+                   Proxmox.Utils.monStoreErrors(view, view.getStore(), true);
                },
 
-               onLoad: function(store, records) {
+               onLoad: function(store, records, success) {
                    var vm = this.getViewModel();
+                   if (!success || !records) {
+                       return;
+                   }
                    vm.set('nodecount', records.length);
 
-                   var master = undefined;
+                   var master = null;
                    Ext.Array.each(records, function(ni) {
                        if (ni.data.type === 'master') {
                            master = ni;
@@ -52,94 +150,162 @@ Ext.define('PMG.ClusterAdministration', {
                    vm.set('master', master);
                },
 
+               onCreate: function() {
+                   var view = this.getView();
+
+                   Proxmox.Utils.API2Request({
+                       url: '/config/cluster/create',
+                       method: 'POST',
+                       waitMsgTarget: view,
+                       failure: function(response, opts) {
+                           Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+                       },
+                       success: function(response, options) {
+                           var upid = response.result.data;
+                           var win = Ext.create('Proxmox.window.TaskProgress', { upid: upid });
+                           win.show();
+                           win.on('destroy', function() { view.store.load(); });
+                       },
+                   });
+               },
+
+               onJoin: function() {
+                   var win = Ext.create('PMG.ClusterJoinNodeWindow', {});
+                   win.show();
+                   win.on('destroy', function() {
+                       // fixme: logout
+                   });
+               },
+
                onAdd: function() {
                    var vm = this.getViewModel();
-                   var win = Ext.create('Ext.window.Window', {
-                       width: 800,
-                       modal: true,
-                       title: gettext('Cluster Join Information'),
-                       items: [
-                           {
-                               xtype: 'component',
-                               border: false,
-                               padding: 10,
-                               html: gettext("Please use the 'Join' button on the node you want to add, using the following IP address and fingerprint.")
-                           },
-                           {
-                               layout: 'form',
-                               border: false,
-                               padding: '0 10 10 10',
-                               items: [
-                                   {
-                                       xtype: 'textfield',
-                                       fieldLabel: gettext('IP Address'),
-                                       value: vm.get('master').get('ip'),
-                                       editable: false
-                                   },
-                                   {
-                                       xtype: 'textfield',
-                                       fieldLabel: gettext('Fingerprint'),
-                                       value: vm.get('master').get('fingerprint'),
-                                       editable: false
-                                   }
-                               ]
-                           }
-                       ]
+
+                   var win = Ext.create('PMG.ClusterAddNodeWindow', {
+                       ipAddress: vm.get('master').get('ip'),
+                       fingerprint: vm.get('master').get('fingerprint'),
                    });
+
                    win.show();
-               }
+               },
            },
            store: {
                autoLoad: true,
-               model: 'pmg-cluster'
+               model: 'pmg-cluster',
+               sorters: ['cid'],
            },
            tbar: [
                {
                    text: gettext('Create'),
                    reference: 'createButton',
+                   handler: 'onCreate',
                    bind: {
-                       disabled: '{nodecount}'
-                   }
+                       disabled: '{nodecount}',
+                   },
                },
                {
                    text: gettext('Add'),
                    reference: 'addButton',
                    handler: 'onAdd',
                    bind: {
-                       disabled: '{!master}'
-                   }
+                       disabled: '{!master}',
+                   },
                },
                {
                    text: gettext('Join'),
                    reference: 'joinButton',
+                   handler: 'onJoin',
                    bind: {
-                       disabled: '{nodecount}'
-                   }
-               }
+                       disabled: '{nodecount}',
+                   },
+               },
            ],
            columns: [
                {
                    header: gettext('Node'),
                    width: 150,
-                   dataIndex: 'name'
+                   dataIndex: 'name',
                },
                {
                    header: gettext('Role'),
                    width: 100,
-                   dataIndex: 'type'
+                   dataIndex: 'type',
                },
                {
                    header: gettext('ID'),
                    width: 80,
-                   dataIndex: 'cid'
+                   dataIndex: 'cid',
                },
                {
 
                    header: gettext('IP'),
                    width: 150,
-                   dataIndex: 'ip'
+                   dataIndex: 'ip',
+               },
+               {
+                   header: gettext('State'),
+                   width: 100,
+                   renderer: function(value, metaData, record) {
+                       var d = record.data;
+                       var state = 'active';
+                       if (!d.insync) {
+                           state = 'syncing';
+                       }
+                       if (d.conn_error) {
+                           metaData.tdCls = 'x-form-invalid-field';
+                           var html = '<p>' + Ext.htmlEncode(d.conn_error) + '</p>';
+                           html = html.replace(/\n/g, '<br>');
+                           metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
+                               html.replace(/"/g, '&quot;') + '"';
+                           state = 'error';
+                       }
+                       return state;
+                   },
+                   dataIndex: 'insync',
+               },
+               {
+                   header: gettext('Subscription'),
+                   width: 120,
+                   renderer: Proxmox.Utils.format_subscription_level,
+                   dataIndex: 'level',
+               },
+               {
+                   header: gettext('Uptime'),
+                   width: 150,
+                   renderer: Proxmox.Utils.render_uptime,
+                   dataIndex: 'uptime',
                },
-           ]
-       }
-    ]
+               {
+                   header: gettext('Load average'),
+                   renderer: function(value) {
+                       if (Ext.isDefined(value)) {
+                           if (Ext.isArray(value)) {
+                               return value[0];
+                           }
+                           return value.toString();
+                       }
+                       return '';
+                   },
+                   dataIndex: 'loadavg',
+               },
+               {
+                   xtype: 'widgetcolumn',
+                   widget: {
+                       xtype: 'progressbarwidget',
+                       textTpl: '{value:percent}',
+                   },
+                   header: gettext('RAM usage'),
+                   dataIndex: 'memory_per',
+               },
+               {
+                   xtype: 'widgetcolumn',
+                   widget: {
+                       xtype: 'progressbarwidget',
+                       textTpl: '{value:percent}',
+                   },
+                   header: gettext('HD space'),
+                   dataIndex: 'rootfs_per',
+               },
+           ],
+       },
+    ],
 });