]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/Clone.js
e4ea17adfc6bb0cc8f306858a464f7a75504f21c
1 Ext
.define('PVE.window.Clone', {
2 extend
: 'Ext.window.Window',
8 onlineHelp
: 'qm_copy_and_clone',
11 xclass
: 'Ext.app.ViewController',
13 'panel[reference=cloneform]': {
14 validitychange
: 'disableSubmit',
17 disableSubmit: function(form
) {
18 this.lookupReference('submitBtn').setDisabled(!form
.isValid());
23 // display a snapshot selector only if needed
24 wrap: function(nodename
, vmid
, isTemplate
, guestType
) {
25 Proxmox
.Utils
.API2Request({
26 url
: '/nodes/' + nodename
+ '/' + guestType
+ '/' + vmid
+'/snapshot',
27 failure: function(response
, opts
) {
28 Ext
.Msg
.alert('Error', response
.htmlStatus
);
30 success: function(response
, opts
) {
31 var snapshotList
= response
.result
.data
;
32 var hasSnapshots
= !(snapshotList
.length
=== 1 &&
33 snapshotList
[0].name
=== 'current');
35 Ext
.create('PVE.window.Clone', {
39 isTemplate
: isTemplate
,
40 hasSnapshots
: hasSnapshots
,
47 create_clone: function(values
) {
50 var params
= { newid
: values
.newvmid
};
52 if (values
.snapname
&& values
.snapname
!== 'current') {
53 params
.snapname
= values
.snapname
;
57 params
.pool
= values
.pool
;
61 if (me
.guestType
=== 'lxc') {
62 params
.hostname
= values
.name
;
64 params
.name
= values
.name
;
69 params
.target
= values
.target
;
72 if (values
.clonemode
=== 'copy') {
74 if (values
.hdstorage
) {
75 params
.storage
= values
.hdstorage
;
76 if (values
.diskformat
&& me
.guestType
!== 'lxc') {
77 params
.format
= values
.diskformat
;
82 Proxmox
.Utils
.API2Request({
84 url
: '/nodes/' + me
.nodename
+ '/' + me
.guestType
+ '/' + me
.vmid
+ '/clone',
87 failure: function(response
, opts
) {
88 Ext
.Msg
.alert('Error', response
.htmlStatus
);
90 success: function(response
, options
) {
96 // disable the Storage selector when clone mode is linked clone
97 updateVisibility: function() {
99 var clonemode
= me
.lookupReference('clonemodesel').getValue();
100 var disksel
= me
.lookup('diskselector');
101 disksel
.setDisabled(clonemode
=== 'clone');
104 // add to the list of valid nodes each node where
105 // all the VM disks are available
106 verifyFeature: function() {
109 var snapname
= me
.lookupReference('snapshotsel').getValue();
110 var clonemode
= me
.lookupReference('clonemodesel').getValue();
112 var params
= { feature
: clonemode
};
113 if (snapname
!== 'current') {
114 params
.snapname
= snapname
;
117 Proxmox
.Utils
.API2Request({
119 url
: '/nodes/' + me
.nodename
+ '/' + me
.guestType
+ '/' + me
.vmid
+ '/feature',
122 failure: function(response
, opts
) {
123 me
.lookupReference('submitBtn').setDisabled(true);
124 Ext
.Msg
.alert('Error', response
.htmlStatus
);
126 success: function(response
, options
) {
127 var res
= response
.result
.data
;
129 me
.lookupReference('targetsel').allowedNodes
= res
.nodes
;
130 me
.lookupReference('targetsel').validate();
135 initComponent: function() {
139 throw "no node name specified";
143 throw "no VM ID specified";
147 me
.snapname
= 'current';
151 throw "no Guest Type specified";
154 var titletext
= me
.guestType
=== 'lxc' ? 'CT' : 'VM';
156 titletext
+= ' Template';
158 me
.title
= "Clone " + titletext
+ " " + me
.vmid
;
164 xtype
: 'pveNodeSelector',
166 reference
: 'targetsel',
167 fieldLabel
: gettext('Target node'),
170 onlineValidator
: true,
172 change: function(f
, value
) {
173 me
.lookupReference('hdstorage').setTargetNode(value
);
178 var modelist
= [['copy', gettext('Full Clone')]];
180 modelist
.push(['clone', gettext('Linked Clone')]);
184 xtype
: 'pveGuestIDSelector',
186 guestType
: me
.guestType
,
188 loadNextFreeID
: true,
189 validateExists
: false,
196 fieldLabel
: me
.guestType
=== 'lxc' ? gettext('Hostname') : gettext('Name'),
199 xtype
: 'pvePoolSelector',
200 fieldLabel
: gettext('Resource Pool'),
208 xtype
: 'proxmoxKVComboBox',
209 fieldLabel
: gettext('Mode'),
211 reference
: 'clonemodesel',
213 hidden
: !me
.isTemplate
,
214 value
: me
.isTemplate
? 'clone' : 'copy',
215 comboItems
: modelist
,
217 change: function(t
, value
) {
218 me
.updateVisibility();
224 xtype
: 'PVE.form.SnapshotSelector',
226 reference
: 'snapshotsel',
227 fieldLabel
: gettext('Snapshot'),
228 nodename
: me
.nodename
,
229 guestType
: me
.guestType
,
231 hidden
: !!(me
.isTemplate
|| !me
.hasSnapshots
),
236 change: function(f
, value
) {
242 xtype
: 'pveDiskStorageSelector',
243 reference
: 'diskselector',
244 nodename
: me
.nodename
,
248 storageLabel
: gettext('Target Storage'),
250 storageContent
: me
.guestType
=== 'qemu' ? 'images' : 'rootdir',
251 emptyText
: gettext('Same as source'),
252 disabled
: !!me
.isTemplate
, // because default mode is clone for templates
255 var formPanel
= Ext
.create('Ext.form.Panel', {
257 reference
: 'cloneform',
260 defaultType
: 'container',
288 xtype
: 'proxmoxHelpButton',
289 listenToGlobalEvent
: false,
291 onlineHelp
: me
.onlineHelp
,
295 reference
: 'submitBtn',
296 text
: gettext('Clone'),
298 handler: function() {
299 var cloneForm
= me
.lookupReference('cloneform');
300 if (cloneForm
.isValid()) {
301 me
.create_clone(cloneForm
.getValues());