|
25 | 25 |
|
26 | 26 | import javax.inject.Inject; |
27 | 27 |
|
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; |
39 | 28 | import org.apache.cloudstack.api.ApiConstants; |
40 | 29 | import org.apache.cloudstack.api.ApiErrorCode; |
41 | 30 | import org.apache.cloudstack.api.ResponseGenerator; |
|
59 | 48 | import org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo; |
60 | 49 | import org.apache.commons.collections.CollectionUtils; |
61 | 50 | import org.apache.commons.collections.MapUtils; |
| 51 | +import org.apache.commons.lang.StringUtils; |
62 | 52 | import org.apache.log4j.Logger; |
63 | 53 |
|
64 | 54 | import com.cloud.agent.AgentManager; |
65 | 55 | import com.cloud.agent.api.Answer; |
66 | 56 | import com.cloud.agent.api.GetUnmanagedInstancesAnswer; |
67 | 57 | import com.cloud.agent.api.GetUnmanagedInstancesCommand; |
| 58 | +import com.cloud.agent.api.PrepareUnmanageVMInstanceAnswer; |
| 59 | +import com.cloud.agent.api.PrepareUnmanageVMInstanceCommand; |
68 | 60 | import com.cloud.capacity.CapacityManager; |
69 | 61 | import com.cloud.configuration.Config; |
70 | 62 | import com.cloud.configuration.Resource; |
|
75 | 67 | import com.cloud.deploy.DeployDestination; |
76 | 68 | import com.cloud.deploy.DeploymentPlanner; |
77 | 69 | import com.cloud.deploy.DeploymentPlanningManager; |
| 70 | +import com.cloud.event.ActionEvent; |
78 | 71 | import com.cloud.event.EventTypes; |
79 | 72 | import com.cloud.event.UsageEventUtils; |
80 | 73 | import com.cloud.exception.InsufficientAddressCapacityException; |
|
83 | 76 | import com.cloud.exception.InvalidParameterValueException; |
84 | 77 | import com.cloud.exception.PermissionDeniedException; |
85 | 78 | import com.cloud.exception.ResourceAllocationException; |
| 79 | +import com.cloud.exception.UnsupportedServiceException; |
86 | 80 | import com.cloud.host.Host; |
87 | 81 | import com.cloud.host.HostVO; |
88 | 82 | import com.cloud.host.Status; |
|
103 | 97 | import com.cloud.service.dao.ServiceOfferingDao; |
104 | 98 | import com.cloud.storage.GuestOS; |
105 | 99 | import com.cloud.storage.GuestOSHypervisor; |
| 100 | +import com.cloud.storage.Snapshot; |
| 101 | +import com.cloud.storage.SnapshotVO; |
106 | 102 | import com.cloud.storage.StoragePool; |
107 | 103 | import com.cloud.storage.VMTemplateStoragePoolVO; |
108 | 104 | import com.cloud.storage.VMTemplateVO; |
|
112 | 108 | import com.cloud.storage.dao.DiskOfferingDao; |
113 | 109 | import com.cloud.storage.dao.GuestOSDao; |
114 | 110 | import com.cloud.storage.dao.GuestOSHypervisorDao; |
| 111 | +import com.cloud.storage.dao.SnapshotDao; |
115 | 112 | import com.cloud.storage.dao.VMTemplateDao; |
116 | 113 | import com.cloud.storage.dao.VMTemplatePoolDao; |
117 | 114 | import com.cloud.storage.dao.VolumeDao; |
|
127 | 124 | import com.cloud.utils.net.NetUtils; |
128 | 125 | import com.cloud.vm.DiskProfile; |
129 | 126 | import com.cloud.vm.NicProfile; |
| 127 | +import com.cloud.vm.NicVO; |
130 | 128 | import com.cloud.vm.UserVmManager; |
| 129 | +import com.cloud.vm.UserVmVO; |
131 | 130 | import com.cloud.vm.VMInstanceVO; |
132 | 131 | import com.cloud.vm.VirtualMachine; |
133 | 132 | import com.cloud.vm.VirtualMachineManager; |
134 | 133 | import com.cloud.vm.VirtualMachineProfile; |
135 | 134 | import com.cloud.vm.VirtualMachineProfileImpl; |
136 | 135 | import com.cloud.vm.VmDetailConstants; |
137 | 136 | import com.cloud.vm.dao.NicDao; |
| 137 | +import com.cloud.vm.dao.UserVmDao; |
138 | 138 | import com.cloud.vm.dao.VMInstanceDao; |
| 139 | +import com.cloud.vm.snapshot.dao.VMSnapshotDao; |
139 | 140 | import com.google.common.base.Strings; |
140 | 141 | import com.google.gson.Gson; |
141 | 142 |
|
@@ -912,7 +913,7 @@ private void publishVMUsageUpdateResourceCount(final UserVm userVm, ServiceOffer |
912 | 913 |
|
913 | 914 | private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedInstance, final String instanceName, final DataCenter zone, final Cluster cluster, final HostVO host, |
914 | 915 | 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, |
916 | 917 | final Map<String, Long> nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap, |
917 | 918 | final Map<String, String> details, final boolean migrateAllowed, final boolean forced) { |
918 | 919 | UserVm userVm = null; |
@@ -942,17 +943,31 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI |
942 | 943 | if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) { |
943 | 944 | throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName)); |
944 | 945 | } |
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); |
946 | 961 | 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)); |
948 | 963 | } |
949 | 964 | allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDisk.getController()); |
950 | 965 | List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>(); |
951 | 966 | try { |
952 | 967 | checkUnmanagedDiskAndOfferingForImport(rootDisk, null, validatedServiceOffering, owner, zone, cluster, migrateAllowed); |
953 | 968 | if (unmanagedInstanceDisks.size() > 1) { // Data disk(s) present |
954 | 969 | dataDisks.addAll(unmanagedInstanceDisks); |
955 | | - dataDisks.remove(0); |
| 970 | + dataDisks.remove(rootDiskIndex); |
956 | 971 | checkUnmanagedDiskAndOfferingForImport(dataDisks, dataDiskOfferingMap, owner, zone, cluster, migrateAllowed); |
957 | 972 | allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER, dataDisks.get(0).getController()); |
958 | 973 | } |
@@ -1167,6 +1182,7 @@ public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd) { |
1167 | 1182 | 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())); |
1168 | 1183 | } |
1169 | 1184 | } |
| 1185 | + final String rootDiskId = cmd.getRootDiskId(); |
1170 | 1186 | final Map<String, Long> nicNetworkMap = cmd.getNicNetworkList(); |
1171 | 1187 | final Map<String, Network.IpAddresses> nicIpAddressMap = cmd.getNicIpAddressList(); |
1172 | 1188 | final Map<String, Long> dataDiskOfferingMap = cmd.getDataDiskToDiskOfferingList(); |
@@ -1223,7 +1239,7 @@ public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd) { |
1223 | 1239 | } |
1224 | 1240 | userVm = importVirtualMachineInternal(unmanagedInstance, instanceName, zone, cluster, host, |
1225 | 1241 | template, displayName, hostName, caller, owner, userId, |
1226 | | - serviceOffering, dataDiskOfferingMap, |
| 1242 | + serviceOffering, rootDiskId, dataDiskOfferingMap, |
1227 | 1243 | nicNetworkMap, nicIpAddressMap, |
1228 | 1244 | details, cmd.getMigrateAllowed(), forced); |
1229 | 1245 | break; |
|
0 commit comments