]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/grid/Replication.js
eabf5524002a6147fc4ee11814775d7bb6f09f8d
1 Ext
.define('PVE.window.ReplicaEdit', {
2 extend
: 'Proxmox.window.Edit',
3 xtype
: 'pveReplicaEdit',
5 subject
: gettext('Replication Job'),
8 url
: '/cluster/replication',
11 initComponent: function() {
14 var vmid
= me
.pveSelNode
.data
.vmid
;
15 var nodename
= me
.pveSelNode
.data
.node
;
20 xtype
: (me
.isCreate
&& !vmid
)?'pveGuestIDSelector':'displayfield',
22 fieldLabel
: 'CT/VM ID',
28 xtype
: me
.isCreate
? 'pveNodeSelector':'displayfield',
30 disallowedNodes
: [nodename
],
32 onlineValidator
: true,
33 fieldLabel
: gettext("Target")
36 xtype
: 'pveCalendarEvent',
37 fieldLabel
: gettext('Schedule'),
38 emptyText
: '*/15 - ' + Ext
.String
.format(gettext('Every {0} minutes'), 15),
43 fieldLabel
: gettext('Rate limit') + ' (MB/s)',
46 emptyText
: gettext('unlimited'),
51 fieldLabel
: gettext('Comment'),
55 xtype
: 'proxmoxcheckbox',
59 fieldLabel
: gettext('Enabled')
67 onlineHelp
: 'pvesr_schedule_time_format',
69 onGetValues: function(values
) {
70 var me
= this.up('window');
72 values
.disable
= values
.enabled
? 0 : 1;
73 delete values
.enabled
;
75 PVE
.Utils
.delete_if_default(values
, 'rate', '', me
.isCreate
);
76 PVE
.Utils
.delete_if_default(values
, 'disable', 0, me
.isCreate
);
77 PVE
.Utils
.delete_if_default(values
, 'schedule', '*/15', me
.isCreate
);
78 PVE
.Utils
.delete_if_default(values
, 'comment', '', me
.isCreate
);
81 values
.type
= 'local';
82 var vm
= vmid
|| values
.guest
;
84 if (me
.highestids
[vm
] !== undefined) {
85 id
= me
.highestids
[vm
];
88 values
.id
= vm
+ '-' + id
.toString();
101 success: function(response
) {
102 var jobs
= response
.result
.data
;
104 Ext
.Array
.forEach(jobs
, function(job
) {
105 var match
= /^([0-9]+)\-([0-9]+)$/.exec(job
.id
);
107 var vmid
= parseInt(match
[1],10);
108 var id
= parseInt(match
[2],10);
109 if (highestids
[vmid
] < id
||
110 highestids
[vmid
] === undefined) {
111 highestids
[vmid
] = id
;
116 me
.highestids
= highestids
;
122 success: function(response
, options
) {
123 response
.result
.data
.enabled
= !response
.result
.data
.disable
;
124 me
.setValues(response
.result
.data
);
125 me
.digest
= response
.result
.data
.digest
;
132 /*jslint confusion: true */
133 /* callback is a function and string */
134 Ext
.define('PVE.grid.ReplicaView', {
135 extend
: 'Ext.grid.Panel',
136 xtype
: 'pveReplicaView',
138 onlineHelp
: 'chapter_pvesr',
141 stateId
: 'grid-pve-replication-status',
144 xclass
: 'Ext.app.ViewController',
146 addJob: function(button
,event
,rec
) {
147 var me
= this.getView();
148 var controller
= this;
149 var win
= Ext
.create('PVE.window.ReplicaEdit', {
152 pveSelNode
: me
.pveSelNode
154 win
.on('destroy', function() { controller
.reload(); });
158 editJob: function(button
,event
,rec
) {
159 var me
= this.getView();
160 var controller
= this;
162 var win
= Ext
.create('PVE.window.ReplicaEdit', {
163 url
: '/cluster/replication/' + data
.id
,
165 pveSelNode
: me
.pveSelNode
167 win
.on('destroy', function() { controller
.reload(); });
171 scheduleJobNow: function(button
,event
,rec
) {
172 var me
= this.getView();
173 var controller
= this;
175 Proxmox
.Utils
.API2Request({
176 url
: "/api2/extjs/nodes/" + me
.nodename
+ "/replication/" + rec
.data
.id
+ "/schedule_now",
179 callback: function() { controller
.reload(); },
180 failure: function (response
, opts
) {
181 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
186 showLog: function(button
, event
, rec
) {
187 var me
= this.getView();
188 var controller
= this;
189 var logView
= Ext
.create('Proxmox.panel.LogView', {
191 url
: "/api2/extjs/nodes/" + me
.nodename
+ "/replication/" + rec
.data
.id
+ "/log"
193 var win
= Ext
.create('Ext.window.Window', {
199 title
: gettext("Replication Log")
203 logView
.requestUpdate();
207 Ext
.TaskManager
.start(task
);
208 win
.on('destroy', function() {
209 Ext
.TaskManager
.stop(task
);
216 var me
= this.getView();
220 dblClick: function(grid
, record
, item
) {
222 me
.editJob(undefined, undefined, record
);
226 // currently replication is for cluster only, so we disable the whole
228 checkPrerequisites: function() {
229 var me
= this.getView();
230 if (PVE
.data
.ResourceStore
.getNodes().length
< 2) {
231 me
.mask(gettext("Replication needs at least two nodes"), ['pve-static-mask']);
237 itemdblclick
: 'dblClick',
238 afterlayout
: 'checkPrerequisites'
245 text
: gettext('Add'),
250 xtype
: 'proxmoxButton',
251 text
: gettext('Edit'),
252 itemId
: 'editButton',
257 xtype
: 'proxmoxStdRemoveButton',
258 itemId
: 'removeButton',
259 baseurl
: '/api2/extjs/cluster/replication/',
264 xtype
: 'proxmoxButton',
265 text
: gettext('Log'),
271 xtype
: 'proxmoxButton',
272 text
: gettext('Schedule now'),
273 itemId
: 'scheduleNowButton',
274 handler
: 'scheduleJobNow',
279 initComponent: function() {
282 var url
= '/cluster/replication';
284 me
.nodename
= me
.pveSelNode
.data
.node
;
285 me
.vmid
= me
.pveSelNode
.data
.vmid
;
289 text
: gettext('Enabled'),
290 dataIndex
: 'enabled',
291 xtype
: 'checkcolumn',
302 text
: gettext('Guest'),
307 text
: gettext('Job'),
312 text
: gettext('Target'),
319 me
.stateId
= 'grid-pve-replication-dc';
320 } else if (!me
.vmid
) {
322 url
= '/nodes/' + me
.nodename
+ '/replication';
325 url
= '/nodes/' + me
.nodename
+ '/replication' + '?guest=' + me
.vmid
;
331 text
: gettext('Status'),
335 renderer: function(value
, metadata
, record
) {
337 if (record
.data
.pid
) {
338 metadata
.tdCls
= 'x-grid-row-loading';
345 if (record
.data
.remove_job
) {
346 icons
.push('<i class="fa fa-ban warning" title="'
347 + gettext("Removal Scheduled") + '"></i>');
348 states
.push(gettext("Removal Scheduled"));
351 if (record
.data
.error
) {
352 icons
.push('<i class="fa fa-times critical" title="'
353 + gettext("Error") + '"></i>');
354 states
.push(record
.data
.error
);
357 if (icons
.length
== 0) {
358 icons
.push('<i class="fa fa-check good"></i>');
359 states
.push(gettext('OK'));
362 return icons
.join(',') + ' ' + states
.join(',');
366 text
: gettext('Last Sync'),
367 dataIndex
: 'last_sync',
369 renderer: function(value
, metadata
, record
) {
374 if (record
.data
.pid
) {
375 return gettext('syncing');
378 return Proxmox
.Utils
.render_timestamp(value
);
382 text
: gettext('Duration'),
383 dataIndex
: 'duration',
385 renderer
: Proxmox
.Utils
.render_duration
388 text
: gettext('Next Sync'),
389 dataIndex
: 'next_sync',
391 renderer: function(value
) {
396 var now
= new Date();
397 var next
= new Date(value
*1000);
400 return gettext('pending');
403 return Proxmox
.Utils
.render_timestamp(value
);
411 text
: gettext('Schedule'),
413 dataIndex
: 'schedule'
416 text
: gettext('Rate limit'),
418 renderer: function(value
) {
420 return gettext('unlimited');
423 return value
.toString() + ' MB/s';
428 text
: gettext('Comment'),
429 dataIndex
: 'comment',
430 renderer
: Ext
.htmlEncode
434 me
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
435 storeid
: 'pve-replica-' + me
.nodename
+ me
.vmid
,
436 model
: (mode
=== 'dc')? 'pve-replication' : 'pve-replication-state',
440 url
: "/api2/json" + url
444 me
.store
= Ext
.create('Proxmox.data.DiffStore', {
458 // we cannot access the log and scheduleNow button
459 // in the datacenter, because
460 // we do not know where/if the jobs runs
462 me
.down('#logButton').setHidden(true);
463 me
.down('#scheduleNowButton').setHidden(true);
466 // if we set the warning mask, we do not want to load
467 // or set the mask on store errors
468 if (PVE
.data
.ResourceStore
.getNodes().length
< 2) {
472 Proxmox
.Utils
.monStoreErrors(me
, me
.rstore
);
474 me
.on('destroy', me
.rstore
.stopUpdate
);
475 me
.rstore
.startUpdate();
479 Ext
.define('pve-replication', {
480 extend
: 'Ext.data.Model',
482 'id', 'target', 'comment', 'rate', 'type',
483 { name
: 'guest', type
: 'integer' },
484 { name
: 'jobnum', type
: 'integer' },
485 { name
: 'schedule', defaultValue
: '*/15' },
486 { name
: 'disable', defaultValue
: '' },
487 { name
: 'enabled', calculate: function(data
) { return !data
.disable
; } }
491 Ext
.define('pve-replication-state', {
492 extend
: 'pve-replication',
494 'last_sync', 'next_sync', 'error', 'duration', 'state',
495 'fail_count', 'remove_job', 'pid'