pve-manager/www/manager6/dc/MetricServerView.js
Dominik Csapak f257dcec26 ui: add MetricServerView to Datacenter
adds ui support for configuring the External Metric servers.
for now, influxdb and graphite edit windows do not share code,
it would be ideal to do that once we add more plugins

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
2020-11-21 20:39:33 +01:00

398 lines
7.3 KiB
JavaScript

Ext.define('PVE.dc.MetricServerView', {
extend: 'Ext.grid.Panel',
alias: ['widget.pveMetricServerView'],
stateful: true,
stateId: 'grid-metricserver',
controller: {
xclass: 'Ext.app.ViewController',
render_type: function(value) {
switch (value) {
case 'influxdb': return "InfluxDB";
case 'graphite': return "Graphite";
default: return Proxmox.Utils.unknownText;
}
},
addInfluxDB: function() {
let me = this;
Ext.create(`PVE.dc.InfluxDBEdit`, {
url: `/api2/extjs/cluster/metricserver`,
autoShow: true,
listeners: {
destroy: () => me.reload(),
},
});
},
addGraphite: function() {
let me = this;
Ext.create(`PVE.dc.GraphiteEdit`, {
url: `/api2/extjs/cluster/metricserver`,
autoShow: true,
listeners: {
destroy: () => me.reload(),
},
});
},
editServer: function() {
let me = this;
let view = me.getView();
let selection = view.getSelection();
if (!selection || selection.length < 1) {
return;
}
let rec = selection[0];
let xtype = me.render_type(rec.data.type);
Ext.create(`PVE.dc.${xtype}Edit`, {
url: `/api2/extjs/cluster/metricserver/${rec.data.id}`,
serverid: rec.data.id,
autoShow: true,
listeners: {
destroy: () => me.reload(),
},
});
},
reload: function() {
this.getView().getStore().load();
},
},
store: {
autoLoad: true,
id: 'metricservers',
proxy: {
type: 'proxmox',
url: '/api2/json/cluster/metricserver',
},
},
columns: [
{
text: gettext('Name'),
flex: 2,
dataIndex: 'id',
},
{
text: gettext('Type'),
flex: 1,
dataIndex: 'type',
renderer: 'render_type',
},
{
text: gettext('Enabled'),
dataIndex: 'disable',
width: 100,
renderer: Proxmox.Utils.format_neg_boolean,
},
{
text: gettext('Server'),
width: 200,
dataIndex: 'server',
},
{
text: gettext('Port'),
width: 100,
dataIndex: 'port',
},
],
tbar: [
{
text: gettext('Add'),
menu: [
{
text: 'Graphite',
handler: 'addGraphite',
},
{
text: 'InfluxDB',
handler: 'addInfluxDB',
},
],
},
{
text: gettext('Edit'),
xtype: 'proxmoxButton',
handler: 'editServer',
disabled: true,
},
{
xtype: 'proxmoxStdRemoveButton',
baseurl: `/api2/extjs/cluster/metricserver`,
callback: 'reload',
},
],
listeners: {
itemdblclick: 'editServer',
},
initComponent: function() {
var me = this;
me.callParent();
Proxmox.Utils.monStoreErrors(me, me.getStore());
},
});
Ext.define('PVE.dc.InfluxDBEdit', {
extend: 'Proxmox.window.Edit',
mixins: ['Proxmox.Mixin.CBind'],
subject: 'InfluxDB',
cbindData: function() {
let me = this;
me.isCreate = !me.serverid;
me.serverid = me.serverid || "";
me.method = me.isCreate ? 'POST' : 'PUT';
if (!me.isCreate) {
me.subject = `InfluxDB: ${me.serverid}`;
}
return {};
},
items: [
{
xtype: 'inputpanel',
onGetValues: function(values) {
values.disable = values.enable ? 0 : 1;
delete values.enable;
return values;
},
column1: [
{
xtype: 'hidden',
name: 'type',
value: 'influxdb',
cbind: {
submitValue: '{isCreate}',
},
},
{
fieldLabel: gettext('Name'),
xtype: 'pmxDisplayEditField',
name: 'id',
allowBlank: false,
cbind: {
editable: '{isCreate}',
value: '{serverid}',
},
},
{
fieldLabel: gettext('Enabled'),
xtype: 'checkbox',
inputValue: 1,
uncheckedValue: 0,
checked: true,
name: 'enable',
},
],
column2: [
{
fieldLabel: gettext('Server'),
xtype: 'proxmoxtextfield',
name: 'server',
allowBlank: false,
},
{
fieldLabel: gettext('Port'),
xtype: 'proxmoxintegerfield',
minValue: 1,
maximum: 65536,
name: 'port',
allowBlank: false,
},
],
advancedColumn1: [], // has to exists to render any advanced columns
advancedColumn2: [
{
fieldLabel: 'MTU',
xtype: 'proxmoxintegerfield',
name: 'mtu',
minValue: 1,
emptyText: '1500',
submitEmpty: false,
cbind: {
deleteEmpty: '{!isCreate}',
},
},
],
},
],
initComponent: function() {
let me = this;
me.callParent();
if (!me.serverid) { return; }
me.load({
success: function(response, options) {
let values = response.result.data;
values.enable = !values.disable;
me.down('inputpanel').setValues(values);
},
});
},
});
Ext.define('PVE.dc.GraphiteEdit', {
extend: 'Proxmox.window.Edit',
mixins: ['Proxmox.Mixin.CBind'],
subject: 'Graphite',
cbindData: function() {
let me = this;
me.isCreate = !me.serverid;
me.serverid = me.serverid || "";
me.method = me.isCreate ? 'POST' : 'PUT';
if (!me.isCreate) {
me.subject = `Graphite: ${me.serverid}`;
}
return {};
},
items: [
{
xtype: 'inputpanel',
onGetValues: function(values) {
values.disable = values.enable ? 0 : 1;
delete values.enable;
return values;
},
column1: [
{
xtype: 'hidden',
name: 'type',
value: 'graphite',
cbind: {
submitValue: '{isCreate}',
},
},
{
fieldLabel: gettext('Name'),
xtype: 'pmxDisplayEditField',
name: 'id',
allowBlank: false,
cbind: {
editable: '{isCreate}',
value: '{serverid}',
},
},
{
fieldLabel: gettext('Enabled'),
xtype: 'checkbox',
inputValue: 1,
uncheckedValue: 0,
checked: true,
name: 'enable',
},
],
column2: [
{
fieldLabel: gettext('Server'),
xtype: 'proxmoxtextfield',
name: 'server',
allowBlank: false,
},
{
fieldLabel: gettext('Port'),
xtype: 'proxmoxintegerfield',
minimum: 1,
maximum: 65536,
name: 'port',
allowBlank: false,
},
{
fieldLabel: gettext('Path'),
xtype: 'proxmoxtextfield',
emptyText: 'proxmox',
name: 'path',
cbind: {
deleteEmpty: '{!isCreate}',
},
},
],
advancedColumn1: [
{
fieldLabel: gettext('Protocol'),
xtype: 'proxmoxKVComboBox',
name: 'proto',
value: '__default__',
cbind: {
deleteEmpty: '{!isCreate}',
},
comboItems: [
['__default__', 'UDP'],
['tcp', 'TCP'],
],
listeners: {
change: function(field, value) {
let me = this;
me.up('inputpanel').down('field[name=timeout]').setDisabled(value !== 'tcp');
me.up('inputpanel').down('field[name=mtu]').setDisabled(value === 'tcp');
},
},
},
],
advancedColumn2: [
{
fieldLabel: 'MTU',
xtype: 'proxmoxintegerfield',
name: 'mtu',
minimum: 1,
emptyText: '1500',
submitEmpty: false,
cbind: {
deleteEmpty: '{!isCreate}',
},
},
{
fieldLabel: gettext('TCP Timeout'),
xtype: 'proxmoxintegerfield',
name: 'timeout',
disabled: true,
cbind: {
deleteEmpty: '{!isCreate}',
},
minValue: 1,
emptyText: 1,
},
],
},
],
initComponent: function() {
let me = this;
me.callParent();
if (!me.serverid) { return; }
me.load({
success: function(response, options) {
let values = response.result.data;
values.enable = !values.disable;
me.down('inputpanel').setValues(values);
},
});
},
});