]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ha/ResourceEdit.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / ha / ResourceEdit.js
1 Ext.define('PVE.ha.VMResourceInputPanel', {
2 extend: 'Proxmox.panel.InputPanel',
3 onlineHelp: 'ha_manager_resource_config',
4 vmid: undefined,
5
6 onGetValues: function(values) {
7 var me = this;
8
9 if (values.vmid) {
10 values.sid = values.vmid;
11 }
12 delete values.vmid;
13
14 PVE.Utils.delete_if_default(values, 'group', '', me.isCreate);
15 PVE.Utils.delete_if_default(values, 'max_restart', '1', me.isCreate);
16 PVE.Utils.delete_if_default(values, 'max_relocate', '1', me.isCreate);
17
18 return values;
19 },
20
21 initComponent: function() {
22 var me = this;
23 var MIN_QUORUM_VOTES = 3;
24
25 var disabledHint = Ext.createWidget({
26 xtype: 'displayfield', // won't get submitted by default
27 userCls: 'pmx-hint',
28 value: 'Disabling the resource will stop the guest system. ' +
29 'See the online help for details.',
30 hidden: true,
31 });
32
33 var fewVotesHint = Ext.createWidget({
34 itemId: 'fewVotesHint',
35 xtype: 'displayfield',
36 userCls: 'pmx-hint',
37 value: 'At least three quorum votes are recommended for reliable HA.',
38 hidden: true,
39 });
40
41 Proxmox.Utils.API2Request({
42 url: '/cluster/config/nodes',
43 method: 'GET',
44 failure: function(response) {
45 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
46 },
47 success: function(response) {
48 var nodes = response.result.data;
49 var votes = 0;
50 Ext.Array.forEach(nodes, function(node) {
51 var vote = parseInt(node.quorum_votes, 10); // parse as base 10
52 votes += vote || 0; // parseInt might return NaN, which is false
53 });
54
55 if (votes < MIN_QUORUM_VOTES) {
56 fewVotesHint.setVisible(true);
57 }
58 },
59 });
60
61 var vmidStore = me.vmid ? {} : {
62 model: 'PVEResources',
63 autoLoad: true,
64 sorters: 'vmid',
65 filters: [
66 {
67 property: 'type',
68 value: /lxc|qemu/,
69 },
70 {
71 property: 'hastate',
72 value: /unmanaged/,
73 },
74 ],
75 };
76
77 // value is a string above, but a number below
78 me.column1 = [
79 {
80 xtype: me.vmid ? 'displayfield' : 'vmComboSelector',
81 submitValue: me.isCreate,
82 name: 'vmid',
83 fieldLabel: me.vmid && me.guestType === 'ct' ? 'CT' : 'VM',
84 value: me.vmid,
85 store: vmidStore,
86 validateExists: true,
87 },
88 {
89 xtype: 'proxmoxintegerfield',
90 name: 'max_restart',
91 fieldLabel: gettext('Max. Restart'),
92 value: 1,
93 minValue: 0,
94 maxValue: 10,
95 allowBlank: false,
96 },
97 {
98 xtype: 'proxmoxintegerfield',
99 name: 'max_relocate',
100 fieldLabel: gettext('Max. Relocate'),
101 value: 1,
102 minValue: 0,
103 maxValue: 10,
104 allowBlank: false,
105 },
106 ];
107
108 me.column2 = [
109 {
110 xtype: 'pveHAGroupSelector',
111 name: 'group',
112 fieldLabel: gettext('Group'),
113 },
114 {
115 xtype: 'proxmoxKVComboBox',
116 name: 'state',
117 value: 'started',
118 fieldLabel: gettext('Request State'),
119 comboItems: [
120 ['started', 'started'],
121 ['stopped', 'stopped'],
122 ['ignored', 'ignored'],
123 ['disabled', 'disabled'],
124 ],
125 listeners: {
126 'change': function(field, newValue) {
127 if (newValue === 'disabled') {
128 disabledHint.setVisible(true);
129 } else if (disabledHint.isVisible()) {
130 disabledHint.setVisible(false);
131 }
132 },
133 },
134 },
135 disabledHint,
136 ];
137
138 me.columnB = [
139 {
140 xtype: 'textfield',
141 name: 'comment',
142 fieldLabel: gettext('Comment'),
143 },
144 fewVotesHint,
145 ];
146
147 me.callParent();
148 },
149 });
150
151 Ext.define('PVE.ha.VMResourceEdit', {
152 extend: 'Proxmox.window.Edit',
153
154 vmid: undefined,
155 guestType: undefined,
156 isCreate: undefined,
157
158 initComponent: function() {
159 var me = this;
160
161 if (me.isCreate === undefined) {
162 me.isCreate = !me.vmid;
163 }
164
165 if (me.isCreate) {
166 me.url = '/api2/extjs/cluster/ha/resources';
167 me.method = 'POST';
168 } else {
169 me.url = '/api2/extjs/cluster/ha/resources/' + me.vmid;
170 me.method = 'PUT';
171 }
172
173 var ipanel = Ext.create('PVE.ha.VMResourceInputPanel', {
174 isCreate: me.isCreate,
175 vmid: me.vmid,
176 guestType: me.guestType,
177 });
178
179 Ext.apply(me, {
180 subject: gettext('Resource') + ': ' + gettext('Container') +
181 '/' + gettext('Virtual Machine'),
182 isAdd: true,
183 items: [ipanel],
184 });
185
186 me.callParent();
187
188 if (!me.isCreate) {
189 me.load({
190 success: function(response, options) {
191 var values = response.result.data;
192
193 var regex = /^(\S+):(\S+)$/;
194 var res = regex.exec(values.sid);
195
196 if (res[1] !== 'vm' && res[1] !== 'ct') {
197 throw "got unexpected resource type";
198 }
199
200 values.vmid = res[2];
201
202 ipanel.setValues(values);
203 },
204 });
205 }
206 },
207 });