]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ha/ResourceEdit.js
ui: ceph/status: cleanup legacy version handling
[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 /*jslint confusion: true */
62 var vmidStore = (me.vmid) ? {} : {
63 model: 'PVEResources',
64 autoLoad: true,
65 sorters: 'vmid',
66 filters: [
67 {
68 property: 'type',
69 value: /lxc|qemu/
70 },
71 {
72 property: 'hastate',
73 value: /unmanaged/
74 }
75 ]
76 };
77
78 // value is a string above, but a number below
79 me.column1 = [
80 {
81 xtype: me.vmid ? 'displayfield' : 'vmComboSelector',
82 submitValue: me.isCreate,
83 name: 'vmid',
84 fieldLabel: (me.vmid && me.guestType === 'ct') ? 'CT' : 'VM',
85 value: me.vmid,
86 store: vmidStore,
87 validateExists: true
88 },
89 {
90 xtype: 'proxmoxintegerfield',
91 name: 'max_restart',
92 fieldLabel: gettext('Max. Restart'),
93 value: 1,
94 minValue: 0,
95 maxValue: 10,
96 allowBlank: false
97 },
98 {
99 xtype: 'proxmoxintegerfield',
100 name: 'max_relocate',
101 fieldLabel: gettext('Max. Relocate'),
102 value: 1,
103 minValue: 0,
104 maxValue: 10,
105 allowBlank: false
106 }
107 ];
108 /*jslint confusion: false */
109
110 me.column2 = [
111 {
112 xtype: 'pveHAGroupSelector',
113 name: 'group',
114 fieldLabel: gettext('Group')
115 },
116 {
117 xtype: 'proxmoxKVComboBox',
118 name: 'state',
119 value: 'started',
120 fieldLabel: gettext('Request State'),
121 comboItems: [
122 ['started', 'started'],
123 ['stopped', 'stopped'],
124 ['ignored', 'ignored'],
125 ['disabled', 'disabled']
126 ],
127 listeners: {
128 'change': function(field, newValue) {
129 if (newValue === 'disabled') {
130 disabledHint.setVisible(true);
131 }
132 else {
133 if (disabledHint.isVisible()) {
134 disabledHint.setVisible(false);
135 }
136 }
137 }
138 }
139 },
140 disabledHint
141 ];
142
143 me.columnB = [
144 {
145 xtype: 'textfield',
146 name: 'comment',
147 fieldLabel: gettext('Comment')
148 },
149 fewVotesHint
150 ];
151
152 me.callParent();
153 }
154 });
155
156 Ext.define('PVE.ha.VMResourceEdit', {
157 extend: 'Proxmox.window.Edit',
158
159 vmid: undefined,
160 guestType: undefined,
161 isCreate: undefined,
162
163 initComponent : function() {
164 var me = this;
165
166 if (me.isCreate === undefined) {
167 me.isCreate = !me.vmid;
168 }
169
170 if (me.isCreate) {
171 me.url = '/api2/extjs/cluster/ha/resources';
172 me.method = 'POST';
173 } else {
174 me.url = '/api2/extjs/cluster/ha/resources/' + me.vmid;
175 me.method = 'PUT';
176 }
177
178 var ipanel = Ext.create('PVE.ha.VMResourceInputPanel', {
179 isCreate: me.isCreate,
180 vmid: me.vmid,
181 guestType: me.guestType
182 });
183
184 Ext.apply(me, {
185 subject: gettext('Resource') + ': ' + gettext('Container') +
186 '/' + gettext('Virtual Machine'),
187 isAdd: true,
188 items: [ ipanel ]
189 });
190
191 me.callParent();
192
193 if (!me.isCreate) {
194 me.load({
195 success: function(response, options) {
196 var values = response.result.data;
197
198 var regex = /^(\S+):(\S+)$/;
199 var res = regex.exec(values.sid);
200
201 if (res[1] !== 'vm' && res[1] !== 'ct') {
202 throw "got unexpected resource type";
203 }
204
205 values.vmid = res[2];
206
207 ipanel.setValues(values);
208 }
209 });
210 }
211 }
212 });