Skip to content

Commit 9d532af

Browse files
committed
api, server: add rootdiskid param in importUnmanagedInstance API
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent c9a1d30 commit 9d532af

File tree

3 files changed

+43
-16
lines changed

3 files changed

+43
-16
lines changed

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public class ApiConstants {
117117
public static final String DOWNLOAD_DETAILS = "downloaddetails";
118118
public static final String UTILIZATION = "utilization";
119119
public static final String DRIVER = "driver";
120+
public static final String ROOT_DISK_ID = "rootdiskid";
120121
public static final String ROOT_DISK_SIZE = "rootdisksize";
121122
public static final String DHCP_OPTIONS_NETWORK_LIST = "dhcpoptionsnetworklist";
122123
public static final String DHCP_OPTIONS = "dhcpoptions";

api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ImportUnmanagedInstanceCmd.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ public class ImportUnmanagedInstanceCmd extends BaseAsyncCmd {
128128
description = "the ID of the service offering for the virtual machine")
129129
private Long serviceOfferingId;
130130

131+
@Parameter(name = ApiConstants.ROOT_DISK_ID,
132+
type = CommandType.STRING,
133+
description = "the ID of the disk that is to be used as ROOT volume",
134+
since = "4.15.1")
135+
private String rootDiskId;
136+
131137
@Parameter(name = ApiConstants.NIC_NETWORK_LIST,
132138
type = CommandType.MAP,
133139
description = "VM nic to network id mapping using keys nic and network")
@@ -198,6 +204,10 @@ public Long getServiceOfferingId() {
198204
return serviceOfferingId;
199205
}
200206

207+
public String getRootDiskId() {
208+
return rootDiskId;
209+
}
210+
201211
public Map<String, Long> getNicNetworkList() {
202212
Map<String, Long> nicNetworkMap = new HashMap<>();
203213
if (MapUtils.isNotEmpty(nicNetworkList)) {

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,6 @@
2525

2626
import javax.inject.Inject;
2727

28-
import com.cloud.agent.api.PrepareUnmanageVMInstanceAnswer;
29-
import com.cloud.agent.api.PrepareUnmanageVMInstanceCommand;
30-
import com.cloud.event.ActionEvent;
31-
import com.cloud.exception.UnsupportedServiceException;
32-
import com.cloud.storage.Snapshot;
33-
import com.cloud.storage.SnapshotVO;
34-
import com.cloud.storage.dao.SnapshotDao;
35-
import com.cloud.vm.NicVO;
36-
import com.cloud.vm.UserVmVO;
37-
import com.cloud.vm.dao.UserVmDao;
38-
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
3928
import org.apache.cloudstack.api.ApiConstants;
4029
import org.apache.cloudstack.api.ApiErrorCode;
4130
import org.apache.cloudstack.api.ResponseGenerator;
@@ -59,12 +48,15 @@
5948
import org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo;
6049
import org.apache.commons.collections.CollectionUtils;
6150
import org.apache.commons.collections.MapUtils;
51+
import org.apache.commons.lang.StringUtils;
6252
import org.apache.log4j.Logger;
6353

6454
import com.cloud.agent.AgentManager;
6555
import com.cloud.agent.api.Answer;
6656
import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
6757
import com.cloud.agent.api.GetUnmanagedInstancesCommand;
58+
import com.cloud.agent.api.PrepareUnmanageVMInstanceAnswer;
59+
import com.cloud.agent.api.PrepareUnmanageVMInstanceCommand;
6860
import com.cloud.capacity.CapacityManager;
6961
import com.cloud.configuration.Config;
7062
import com.cloud.configuration.Resource;
@@ -75,6 +67,7 @@
7567
import com.cloud.deploy.DeployDestination;
7668
import com.cloud.deploy.DeploymentPlanner;
7769
import com.cloud.deploy.DeploymentPlanningManager;
70+
import com.cloud.event.ActionEvent;
7871
import com.cloud.event.EventTypes;
7972
import com.cloud.event.UsageEventUtils;
8073
import com.cloud.exception.InsufficientAddressCapacityException;
@@ -83,6 +76,7 @@
8376
import com.cloud.exception.InvalidParameterValueException;
8477
import com.cloud.exception.PermissionDeniedException;
8578
import com.cloud.exception.ResourceAllocationException;
79+
import com.cloud.exception.UnsupportedServiceException;
8680
import com.cloud.host.Host;
8781
import com.cloud.host.HostVO;
8882
import com.cloud.host.Status;
@@ -103,6 +97,8 @@
10397
import com.cloud.service.dao.ServiceOfferingDao;
10498
import com.cloud.storage.GuestOS;
10599
import com.cloud.storage.GuestOSHypervisor;
100+
import com.cloud.storage.Snapshot;
101+
import com.cloud.storage.SnapshotVO;
106102
import com.cloud.storage.StoragePool;
107103
import com.cloud.storage.VMTemplateStoragePoolVO;
108104
import com.cloud.storage.VMTemplateVO;
@@ -112,6 +108,7 @@
112108
import com.cloud.storage.dao.DiskOfferingDao;
113109
import com.cloud.storage.dao.GuestOSDao;
114110
import com.cloud.storage.dao.GuestOSHypervisorDao;
111+
import com.cloud.storage.dao.SnapshotDao;
115112
import com.cloud.storage.dao.VMTemplateDao;
116113
import com.cloud.storage.dao.VMTemplatePoolDao;
117114
import com.cloud.storage.dao.VolumeDao;
@@ -127,15 +124,19 @@
127124
import com.cloud.utils.net.NetUtils;
128125
import com.cloud.vm.DiskProfile;
129126
import com.cloud.vm.NicProfile;
127+
import com.cloud.vm.NicVO;
130128
import com.cloud.vm.UserVmManager;
129+
import com.cloud.vm.UserVmVO;
131130
import com.cloud.vm.VMInstanceVO;
132131
import com.cloud.vm.VirtualMachine;
133132
import com.cloud.vm.VirtualMachineManager;
134133
import com.cloud.vm.VirtualMachineProfile;
135134
import com.cloud.vm.VirtualMachineProfileImpl;
136135
import com.cloud.vm.VmDetailConstants;
137136
import com.cloud.vm.dao.NicDao;
137+
import com.cloud.vm.dao.UserVmDao;
138138
import com.cloud.vm.dao.VMInstanceDao;
139+
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
139140
import com.google.common.base.Strings;
140141
import com.google.gson.Gson;
141142

@@ -912,7 +913,7 @@ private void publishVMUsageUpdateResourceCount(final UserVm userVm, ServiceOffer
912913

913914
private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedInstance, final String instanceName, final DataCenter zone, final Cluster cluster, final HostVO host,
914915
final VirtualMachineTemplate template, final String displayName, final String hostName, final Account caller, final Account owner, final Long userId,
915-
final ServiceOfferingVO serviceOffering, final Map<String, Long> dataDiskOfferingMap,
916+
final ServiceOfferingVO serviceOffering, final String rootDiskId, final Map<String, Long> dataDiskOfferingMap,
916917
final Map<String, Long> nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap,
917918
final Map<String, String> details, final boolean migrateAllowed, final boolean forced) {
918919
UserVm userVm = null;
@@ -942,17 +943,31 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
942943
if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
943944
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
944945
}
945-
final UnmanagedInstanceTO.Disk rootDisk = unmanagedInstance.getDisks().get(0);
946+
int rootDiskIndex = 0;
947+
if (StringUtils.isNotBlank(rootDiskId)) {
948+
rootDiskIndex = -1;
949+
for (int i=0 ; i<unmanagedInstanceDisks.size(); ++i) {
950+
UnmanagedInstanceTO.Disk disk = unmanagedInstanceDisks.get(i);
951+
if (rootDiskId.equals(disk.getDiskId())) {
952+
rootDiskIndex = i;
953+
break;
954+
}
955+
}
956+
if (rootDiskIndex < 0) {
957+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to find disk with ID: %s for VM: %s to use as root volume", rootDiskId, instanceName));
958+
}
959+
}
960+
final UnmanagedInstanceTO.Disk rootDisk = unmanagedInstanceDisks.get(rootDiskIndex);
946961
if (rootDisk == null || Strings.isNullOrEmpty(rootDisk.getController())) {
947-
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
962+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve root disk details for VM: %s ", instanceName));
948963
}
949964
allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDisk.getController());
950965
List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
951966
try {
952967
checkUnmanagedDiskAndOfferingForImport(rootDisk, null, validatedServiceOffering, owner, zone, cluster, migrateAllowed);
953968
if (unmanagedInstanceDisks.size() > 1) { // Data disk(s) present
954969
dataDisks.addAll(unmanagedInstanceDisks);
955-
dataDisks.remove(0);
970+
dataDisks.remove(rootDiskIndex);
956971
checkUnmanagedDiskAndOfferingForImport(dataDisks, dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
957972
allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER, dataDisks.get(0).getController());
958973
}
@@ -1167,6 +1182,7 @@ public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd) {
11671182
throw new InvalidParameterValueException(String.format("Failed to import VM: %s. There already exists a VM by the hostname: %s in zone: %s", instanceName, hostName, zone.getUuid()));
11681183
}
11691184
}
1185+
final String rootDiskId = cmd.getRootDiskId();
11701186
final Map<String, Long> nicNetworkMap = cmd.getNicNetworkList();
11711187
final Map<String, Network.IpAddresses> nicIpAddressMap = cmd.getNicIpAddressList();
11721188
final Map<String, Long> dataDiskOfferingMap = cmd.getDataDiskToDiskOfferingList();
@@ -1223,7 +1239,7 @@ public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd) {
12231239
}
12241240
userVm = importVirtualMachineInternal(unmanagedInstance, instanceName, zone, cluster, host,
12251241
template, displayName, hostName, caller, owner, userId,
1226-
serviceOffering, dataDiskOfferingMap,
1242+
serviceOffering, rootDiskId, dataDiskOfferingMap,
12271243
nicNetworkMap, nicIpAddressMap,
12281244
details, cmd.getMigrateAllowed(), forced);
12291245
break;

0 commit comments

Comments
 (0)