]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/Clone.js
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' ? false : true;
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
) {
97 // disable the Storage selector when clone mode is linked clone
98 updateVisibility: function() {
100 var clonemode
= me
.lookupReference('clonemodesel').getValue();
101 var disksel
= me
.lookup('diskselector');
102 disksel
.setDisabled(clonemode
=== 'clone');
105 // add to the list of valid nodes each node where
106 // all the VM disks are available
107 verifyFeature: function() {
110 var snapname
= me
.lookupReference('snapshotsel').getValue();
111 var clonemode
= me
.lookupReference('clonemodesel').getValue();
113 var params
= { feature
: clonemode
};
114 if (snapname
!== 'current') {
115 params
.snapname
= snapname
;
118 Proxmox
.Utils
.API2Request({
120 url
: '/nodes/' + me
.nodename
+ '/' + me
.guestType
+ '/' + me
.vmid
+ '/feature',
123 failure: function(response
, opts
) {
124 me
.lookupReference('submitBtn').setDisabled(true);
125 Ext
.Msg
.alert('Error', response
.htmlStatus
);
127 success: function(response
, options
) {
128 var res
= response
.result
.data
;
130 me
.lookupReference('targetsel').allowedNodes
= res
.nodes
;
131 me
.lookupReference('targetsel').validate();
136 initComponent : function() {
140 throw "no node name specified";
144 throw "no VM ID specified";
148 me
.snapname
= 'current';
152 throw "no Guest Type specified";
155 var titletext
= me
.guestType
=== 'lxc' ? 'CT' : 'VM';
157 titletext
+= ' Template';
159 me
.title
= "Clone " + titletext
+ " " + me
.vmid
;
165 xtype
: 'pveNodeSelector',
167 reference
: 'targetsel',
168 fieldLabel
: gettext('Target node'),
171 onlineValidator
: true,
173 change: function(f
, value
) {
174 me
.lookupReference('hdstorage').setTargetNode(value
);
179 var modelist
= [['copy', gettext('Full Clone')]];
181 modelist
.push(['clone', gettext('Linked Clone')]);
185 xtype
: 'pveGuestIDSelector',
187 guestType
: me
.guestType
,
189 loadNextFreeID
: true,
190 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
? true : false,
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
? true : false // because default mode is clone for templates
255 var formPanel
= Ext
.create('Ext.form.Panel', {
257 reference
: 'cloneform',
260 defaultType
: 'container',
289 xtype
: 'proxmoxHelpButton',
290 listenToGlobalEvent
: false,
292 onlineHelp
: me
.onlineHelp
296 reference
: 'submitBtn',
297 text
: gettext('Clone'),
299 handler: function() {
300 var cloneForm
= me
.lookupReference('cloneform');
301 if (cloneForm
.isValid()) {
302 me
.create_clone(cloneForm
.getValues());