Skip to content

Commit 1c5dc6c

Browse files
committed
CLOUDSTACK-8959: Option to attach the config drive.
1 parent 3ded3e9 commit 1c5dc6c

File tree

5 files changed

+129
-113
lines changed

5 files changed

+129
-113
lines changed

api/src/com/cloud/vm/UserVmService.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,23 @@
1616
// under the License.
1717
package com.cloud.vm;
1818

19-
import java.util.List;
20-
import java.util.Map;
21-
19+
import com.cloud.dc.DataCenter;
20+
import com.cloud.exception.ConcurrentOperationException;
21+
import com.cloud.exception.InsufficientCapacityException;
22+
import com.cloud.exception.ManagementServerException;
23+
import com.cloud.exception.ResourceAllocationException;
24+
import com.cloud.exception.ResourceUnavailableException;
25+
import com.cloud.exception.StorageUnavailableException;
26+
import com.cloud.exception.VirtualMachineMigrationException;
27+
import com.cloud.host.Host;
28+
import com.cloud.hypervisor.Hypervisor.HypervisorType;
29+
import com.cloud.network.Network.IpAddresses;
30+
import com.cloud.offering.ServiceOffering;
31+
import com.cloud.storage.StoragePool;
32+
import com.cloud.template.VirtualMachineTemplate;
33+
import com.cloud.user.Account;
34+
import com.cloud.uservm.UserVm;
35+
import com.cloud.utils.exception.ExecutionException;
2236
import org.apache.cloudstack.api.BaseCmd.HTTPMethod;
2337
import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
2438
import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
@@ -38,27 +52,11 @@
3852
import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
3953
import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
4054

41-
import com.cloud.dc.DataCenter;
42-
import com.cloud.exception.ConcurrentOperationException;
43-
import com.cloud.exception.InsufficientCapacityException;
44-
import com.cloud.exception.ManagementServerException;
45-
import com.cloud.exception.ResourceAllocationException;
46-
import com.cloud.exception.ResourceUnavailableException;
47-
import com.cloud.exception.StorageUnavailableException;
48-
import com.cloud.exception.VirtualMachineMigrationException;
49-
import com.cloud.host.Host;
50-
import com.cloud.hypervisor.Hypervisor.HypervisorType;
51-
import com.cloud.network.Network.IpAddresses;
52-
import com.cloud.offering.ServiceOffering;
53-
import com.cloud.storage.StoragePool;
54-
import com.cloud.template.VirtualMachineTemplate;
55-
import com.cloud.user.Account;
56-
import com.cloud.uservm.UserVm;
57-
import com.cloud.utils.exception.ExecutionException;
55+
import java.util.List;
56+
import java.util.Map;
5857

5958
public interface UserVmService {
6059

61-
6260
/**
6361
* Destroys one virtual machine
6462
*

engine/api/src/com/cloud/vm/VirtualMachineManager.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,15 @@
4949
public interface VirtualMachineManager extends Manager {
5050

5151
static final ConfigKey<Boolean> ExecuteInSequence = new ConfigKey<Boolean>("Advanced", Boolean.class, "execute.in.sequence.hypervisor.commands", "false",
52-
"If set to true, StartCommand, StopCommand, CopyCommand, MigrateCommand will be synchronized on the agent side."
52+
"If set to true, StartCommand, StopCommand, CopyCommand, Migrateommand will be synchronized on the agent side."
5353
+ " If set to false, these commands become asynchronous. Default value is false.", false);
5454

5555
static final ConfigKey<String> VmConfigDriveLabel = new ConfigKey<String>("Hidden", String.class, "vm.configdrive.label", "config",
5656
"The default lable name for the config drive", false);
5757

58+
static final ConfigKey<Boolean> ConfigDriveCreation = new ConfigKey<Boolean>("Advanced", Boolean.class, "use.config.drive", "true",
59+
"If true, use config drives for data transfer else don't use. Default is true", true);
60+
5861
public interface Topics {
5962
public static final String VM_POWER_STATE = "vm.powerstate";
6063
}

engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@
204204
import com.cloud.vm.snapshot.VMSnapshotManager;
205205
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
206206

207+
208+
207209
@Local(value = VirtualMachineManager.class)
208210
public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMachineManager, VmWorkJobHandler, Listener, Configurable {
209211
private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class);
@@ -2244,8 +2246,9 @@ private void orchestrateMigrateWithStorage(final String vmUuid, final long srcHo
22442246
final String zoneName = _dcDao.findById(vm.getDataCenterId()).getName();
22452247
boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
22462248

2247-
vmData = _networkModel.generateVmData(userVm.getUserData(), serviceOffering, zoneName, vm.getInstanceName(), vm.getId(),
2248-
(String) profile.getParameter(VirtualMachineProfile.Param.VmSshPubKey), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows);
2249+
2250+
vmData = (ConfigDriveCreation.value()) ? (_networkModel.generateVmData(userVm.getUserData(), serviceOffering, zoneName, vm.getInstanceName(), vm.getId(),
2251+
(String) profile.getParameter(VirtualMachineProfile.Param.VmSshPubKey), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows)) : null;
22492252
String vmName = vm.getInstanceName();
22502253
String configDriveIsoRootFolder = "/tmp";
22512254
String isoFile = configDriveIsoRootFolder + "/" + vmName + "/configDrive/" + vmName + ".iso";
@@ -2257,10 +2260,12 @@ private void orchestrateMigrateWithStorage(final String vmUuid, final long srcHo
22572260
// At source host detach the config drive iso.
22582261
AttachOrDettachConfigDriveCommand dettachCommand = new AttachOrDettachConfigDriveCommand(vm.getInstanceName(), vmData, VmConfigDriveLabel.value(), false);
22592262
try {
2260-
_agentMgr.send(srcHost.getId(), dettachCommand);
2261-
s_logger.debug("Deleted config drive ISO for vm " + vm.getInstanceName() + " In host " + srcHost);
2263+
if(ConfigDriveCreation.value()){
2264+
_agentMgr.send(srcHost.getId(), dettachCommand);
2265+
s_logger.debug("Deleted config drive ISO for vm " + vm.getInstanceName() + " In host " + srcHost);
2266+
}
22622267
} catch (OperationTimedoutException e) {
2263-
s_logger.debug("TIme out occured while exeuting command AttachOrDettachConfigDrive " + e.getMessage());
2268+
s_logger.debug("Time out occured while exeuting command AttachOrDettachConfigDrive " + e.getMessage());
22642269

22652270
}
22662271

@@ -3666,7 +3671,7 @@ public String getConfigComponentName() {
36663671
public ConfigKey<?>[] getConfigKeys() {
36673672
return new ConfigKey<?>[] {ClusterDeltaSyncInterval, StartRetry, VmDestroyForcestop, VmOpCancelInterval, VmOpCleanupInterval, VmOpCleanupWait,
36683673
VmOpLockStateRetry,
3669-
VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval, VmConfigDriveLabel};
3674+
VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval, VmConfigDriveLabel,ConfigDriveCreation};
36703675
}
36713676

36723677
public List<StoragePoolAllocator> getStoragePoolAllocators() {

plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,6 @@
1919

2020
package com.cloud.hypervisor.xenserver.resource.wrapper.xenbase;
2121

22-
import java.util.ArrayList;
23-
import java.util.HashMap;
24-
import java.util.List;
25-
import java.util.Map;
26-
import java.util.Set;
27-
28-
import org.apache.log4j.Logger;
29-
3022
import com.cloud.agent.api.Answer;
3123
import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
3224
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
@@ -49,6 +41,13 @@
4941
import com.xensource.xenapi.Types.VmPowerState;
5042
import com.xensource.xenapi.VDI;
5143
import com.xensource.xenapi.VM;
44+
import org.apache.log4j.Logger;
45+
46+
import java.util.ArrayList;
47+
import java.util.HashMap;
48+
import java.util.List;
49+
import java.util.Map;
50+
import java.util.Set;
5251

5352
@ResourceWrapper(handles = StartCommand.class)
5453
public final class CitrixStartCommandWrapper extends CommandWrapper<StartCommand, Answer, CitrixResourceBase> {
@@ -62,6 +61,8 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
6261
final String vmName = vmSpec.getName();
6362
VmPowerState state = VmPowerState.HALTED;
6463
VM vm = null;
64+
String configDriveLabel = vmSpec.getConfigDriveLabel();
65+
List<String[]> vmDataList = vmSpec.getVmData();
6566
// if a VDI is created, record its UUID to send back to the CS MS
6667
final Map<String, String> iqnToPath = new HashMap<String, String>();
6768
try {
@@ -123,6 +124,16 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
123124
citrixResourceBase.createVif(conn, vmName, vm, vmSpec, nic);
124125
}
125126

127+
if (vmDataList != null ){
128+
// for shared network with config drive
129+
// 1. create iso sr if it is not there
130+
// 2. add iso to sr
131+
// 3. create vbd and attach it to vm
132+
if (!citrixResourceBase.createAndAttachConfigDriveIsoForVM(conn, vm, vmDataList, configDriveLabel)) {
133+
s_logger.debug("Failed to attach config drive iso to VM " + vmName);
134+
}
135+
}
136+
126137
citrixResourceBase.startVM(conn, host, vm, vmName);
127138

128139
if (citrixResourceBase.isOvs()) {

server/src/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 76 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -16,81 +16,6 @@
1616
// under the License.
1717
package com.cloud.vm;
1818

19-
import java.util.ArrayList;
20-
import java.util.Arrays;
21-
import java.util.Date;
22-
import java.util.HashMap;
23-
import java.util.HashSet;
24-
import java.util.LinkedHashMap;
25-
import java.util.List;
26-
import java.util.Map;
27-
import java.util.Map.Entry;
28-
import java.util.Set;
29-
import java.util.UUID;
30-
import java.util.concurrent.ConcurrentHashMap;
31-
import java.util.concurrent.ExecutorService;
32-
import java.util.concurrent.Executors;
33-
import java.util.concurrent.ScheduledExecutorService;
34-
import java.util.concurrent.TimeUnit;
35-
36-
import javax.ejb.Local;
37-
import javax.inject.Inject;
38-
import javax.naming.ConfigurationException;
39-
40-
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
41-
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
42-
import org.apache.cloudstack.affinity.AffinityGroupService;
43-
import org.apache.cloudstack.affinity.AffinityGroupVO;
44-
import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
45-
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
46-
import org.apache.cloudstack.api.ApiConstants;
47-
import org.apache.cloudstack.api.BaseCmd.HTTPMethod;
48-
import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
49-
import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
50-
import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
51-
import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
52-
import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
53-
import org.apache.cloudstack.api.command.user.vm.RebootVMCmd;
54-
import org.apache.cloudstack.api.command.user.vm.RemoveNicFromVMCmd;
55-
import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd;
56-
import org.apache.cloudstack.api.command.user.vm.ResetVMSSHKeyCmd;
57-
import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
58-
import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
59-
import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
60-
import org.apache.cloudstack.api.command.user.vm.UpdateDefaultNicForVMCmd;
61-
import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
62-
import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
63-
import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
64-
import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
65-
import org.apache.cloudstack.context.CallContext;
66-
import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity;
67-
import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao;
68-
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
69-
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
70-
import org.apache.cloudstack.engine.service.api.OrchestrationService;
71-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
72-
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
73-
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
74-
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
75-
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
76-
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
77-
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
78-
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult;
79-
import org.apache.cloudstack.framework.async.AsyncCallFuture;
80-
import org.apache.cloudstack.framework.config.ConfigKey;
81-
import org.apache.cloudstack.framework.config.Configurable;
82-
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
83-
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
84-
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
85-
import org.apache.cloudstack.storage.command.DeleteCommand;
86-
import org.apache.cloudstack.storage.command.DettachCommand;
87-
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
88-
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
89-
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
90-
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
91-
import org.apache.commons.codec.binary.Base64;
92-
import org.apache.log4j.Logger;
93-
9419
import com.cloud.agent.AgentManager;
9520
import com.cloud.agent.api.Answer;
9621
import com.cloud.agent.api.Command;
@@ -283,6 +208,79 @@
283208
import com.cloud.vm.snapshot.VMSnapshotManager;
284209
import com.cloud.vm.snapshot.VMSnapshotVO;
285210
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
211+
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
212+
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
213+
import org.apache.cloudstack.affinity.AffinityGroupService;
214+
import org.apache.cloudstack.affinity.AffinityGroupVO;
215+
import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
216+
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
217+
import org.apache.cloudstack.api.ApiConstants;
218+
import org.apache.cloudstack.api.BaseCmd.HTTPMethod;
219+
import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
220+
import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
221+
import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
222+
import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
223+
import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
224+
import org.apache.cloudstack.api.command.user.vm.RebootVMCmd;
225+
import org.apache.cloudstack.api.command.user.vm.RemoveNicFromVMCmd;
226+
import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd;
227+
import org.apache.cloudstack.api.command.user.vm.ResetVMSSHKeyCmd;
228+
import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
229+
import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
230+
import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
231+
import org.apache.cloudstack.api.command.user.vm.UpdateDefaultNicForVMCmd;
232+
import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
233+
import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
234+
import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
235+
import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
236+
import org.apache.cloudstack.context.CallContext;
237+
import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity;
238+
import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao;
239+
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
240+
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
241+
import org.apache.cloudstack.engine.service.api.OrchestrationService;
242+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
243+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
244+
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
245+
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
246+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
247+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
248+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
249+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult;
250+
import org.apache.cloudstack.framework.async.AsyncCallFuture;
251+
import org.apache.cloudstack.framework.config.ConfigKey;
252+
import org.apache.cloudstack.framework.config.Configurable;
253+
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
254+
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
255+
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
256+
import org.apache.cloudstack.storage.command.DeleteCommand;
257+
import org.apache.cloudstack.storage.command.DettachCommand;
258+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
259+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
260+
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
261+
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
262+
import org.apache.commons.codec.binary.Base64;
263+
import org.apache.log4j.Logger;
264+
265+
import javax.ejb.Local;
266+
import javax.inject.Inject;
267+
import javax.naming.ConfigurationException;
268+
import java.util.ArrayList;
269+
import java.util.Arrays;
270+
import java.util.Date;
271+
import java.util.HashMap;
272+
import java.util.HashSet;
273+
import java.util.LinkedHashMap;
274+
import java.util.List;
275+
import java.util.Map;
276+
import java.util.Map.Entry;
277+
import java.util.Set;
278+
import java.util.UUID;
279+
import java.util.concurrent.ConcurrentHashMap;
280+
import java.util.concurrent.ExecutorService;
281+
import java.util.concurrent.Executors;
282+
import java.util.concurrent.ScheduledExecutorService;
283+
import java.util.concurrent.TimeUnit;
286284

287285
@Local(value = {UserVmManager.class, UserVmService.class})
288286
public class UserVmManagerImpl extends ManagerBase implements UserVmManager, VirtualMachineGuru, UserVmService, Configurable {
@@ -514,6 +512,7 @@ public enum UserVmCloneType {
514512
"number of threads for fetching vms ip address", true);
515513

516514

515+
517516
@Override
518517
public UserVmVO getVirtualMachine(long vmId) {
519518
return _vmDao.findById(vmId);
@@ -3524,8 +3523,8 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl
35243523
final String zoneName = _dcDao.findById(vm.getDataCenterId()).getName();
35253524
boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
35263525

3527-
List<String[]> vmData = _networkModel.generateVmData(vm.getUserData(), serviceOffering, zoneName, vm.getInstanceName(), vm.getId(),
3528-
(String) profile.getParameter(VirtualMachineProfile.Param.VmSshPubKey), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows);
3526+
List<String[]> vmData = (VirtualMachineManager.ConfigDriveCreation.value()) ? (_networkModel.generateVmData(vm.getUserData(), serviceOffering, zoneName, vm.getInstanceName(), vm.getId(),
3527+
(String) profile.getParameter(VirtualMachineProfile.Param.VmSshPubKey), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows)) : null;
35293528
String vmName = vm.getInstanceName();
35303529
String configDriveIsoRootFolder = "/tmp";
35313530
String isoFile = configDriveIsoRootFolder + "/" + vmName + "/configDrive/" + vmName + ".iso";

0 commit comments

Comments
 (0)