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