@@ -1109,50 +1109,41 @@ protected void checkUnmanagedDiskLimits(Account account, UnmanagedInstanceTO.Dis
11091109 }
11101110 }
11111111
1112- private UserVm importVirtualMachineInternal (final UnmanagedInstanceTO unmanagedInstance , final String instanceName , final DataCenter zone , final Cluster cluster , final HostVO host ,
1113- final VirtualMachineTemplate template , final String displayName , final String hostName , final Account caller , final Account owner , final Long userId ,
1114- final ServiceOfferingVO serviceOffering , final Map <String , Long > dataDiskOfferingMap ,
1115- final Map <String , Long > nicNetworkMap , final Map <String , Network .IpAddresses > callerNicIpAddressMap ,
1116- final Map <String , String > details , final boolean migrateAllowed , final boolean forced , final boolean isImportUnmanagedFromSameHypervisor ) {
1117- logger .debug (LogUtils .logGsonWithoutException ("Trying to import VM [%s] with name [%s], in zone [%s], cluster [%s], and host [%s], using template [%s], service offering [%s], disks map [%s], NICs map [%s] and details [%s]." ,
1118- unmanagedInstance , instanceName , zone , cluster , host , template , serviceOffering , dataDiskOfferingMap , nicNetworkMap , details ));
1119- UserVm userVm = null ;
1120- ServiceOfferingVO validatedServiceOffering = null ;
1112+ protected ServiceOfferingVO validateAndGetServiceOffering (UnmanagedInstanceTO unmanagedInstance , ServiceOfferingVO serviceOffering , Account owner , DataCenter zone , Map <String , String > details , Cluster cluster ) {
11211113 try {
1122- validatedServiceOffering = getUnmanagedInstanceServiceOffering (unmanagedInstance , serviceOffering , owner , zone , details , cluster .getHypervisorType ());
1114+ return getUnmanagedInstanceServiceOffering (unmanagedInstance , serviceOffering , owner , zone , details , cluster .getHypervisorType ());
11231115 } catch (Exception e ) {
11241116 String errorMsg = String .format ("Failed to import Unmanaged VM [%s] because the service offering [%s] is not compatible due to [%s]." , unmanagedInstance , serviceOffering , StringUtils .defaultIfEmpty (e .getMessage (), "" ));
11251117 logger .error (errorMsg , e );
11261118 throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , errorMsg );
11271119 }
1120+ }
11281121
1129- String internalCSName = unmanagedInstance .getInternalCSName ();
1130- if (StringUtils .isEmpty (internalCSName )) {
1131- internalCSName = instanceName ;
1132- }
1133- Map <String , String > allDetails = new HashMap <>(details );
1122+ protected String getUnmanagedInstanceInternalName (UnmanagedInstanceTO unmanagedInstance , String instanceName ) {
1123+ return StringUtils .isEmpty (unmanagedInstance .getInternalCSName ()) ?
1124+ instanceName :
1125+ unmanagedInstance .getInternalCSName ();
1126+ }
1127+
1128+ protected void addImportingVMDynamicOfferingDetails (ServiceOfferingVO validatedServiceOffering , ServiceOfferingVO serviceOffering , Map <String , String > allDetails ) {
11341129 if (validatedServiceOffering .isDynamic ()) {
11351130 allDetails .put (VmDetailConstants .CPU_NUMBER , String .valueOf (validatedServiceOffering .getCpu ()));
11361131 allDetails .put (VmDetailConstants .MEMORY , String .valueOf (validatedServiceOffering .getRamSize ()));
11371132 if (serviceOffering .getSpeed () == null ) {
11381133 allDetails .put (VmDetailConstants .CPU_SPEED , String .valueOf (validatedServiceOffering .getSpeed ()));
11391134 }
11401135 }
1136+ }
11411137
1142- if (!migrateAllowed && host != null && !hostSupportsServiceOfferingAndTemplate (host , validatedServiceOffering , template )) {
1143- throw new InvalidParameterValueException (String .format ("Service offering: %s or template: %s is not compatible with host: %s of unmanaged VM: %s" , serviceOffering .getUuid (), template .getUuid (), host .getUuid (), instanceName ));
1144- }
1145- // Check disks and supplied disk offerings
1146- List <UnmanagedInstanceTO .Disk > unmanagedInstanceDisks = unmanagedInstance .getDisks ();
1147- if (CollectionUtils .isEmpty (unmanagedInstanceDisks )) {
1148- throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("No attached disks found for the unmanaged VM: %s" , instanceName ));
1149- }
1150- Pair <UnmanagedInstanceTO .Disk , List <UnmanagedInstanceTO .Disk >> rootAndDataDisksPair = getRootAndDataDisks (unmanagedInstanceDisks , dataDiskOfferingMap );
1151- final UnmanagedInstanceTO .Disk rootDisk = rootAndDataDisksPair .first ();
1152- final List <UnmanagedInstanceTO .Disk > dataDisks = rootAndDataDisksPair .second ();
1153- if (rootDisk == null || StringUtils .isEmpty (rootDisk .getController ())) {
1154- throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("VM import failed. Unable to retrieve root disk details for VM: %s " , instanceName ));
1155- }
1138+ protected void checkImportingVMDisksAndDiskOfferings (UnmanagedInstanceTO unmanagedInstance ,
1139+ UnmanagedInstanceTO .Disk rootDisk ,
1140+ List <UnmanagedInstanceTO .Disk > dataDisks ,
1141+ Map <String , Long > dataDiskOfferingMap ,
1142+ ServiceOfferingVO validatedServiceOffering , Cluster cluster ,
1143+ Map <String , String > allDetails ,
1144+ boolean isImportUnmanagedFromSameHypervisor , Account owner ,
1145+ DataCenter zone , ServiceOfferingVO serviceOffering ,
1146+ boolean migrateAllowed ) {
11561147 if (cluster .getHypervisorType () == Hypervisor .HypervisorType .KVM ) {
11571148 Long rootDiskOfferingId = validatedServiceOffering .getDiskOfferingId ();
11581149 DiskOffering rootDiskOffering = diskOfferingDao .findById (rootDiskOfferingId );
@@ -1177,24 +1168,41 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
11771168 logger .error ("Volume resource allocation error for owner: {}" , owner , e );
11781169 throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("Volume resource allocation error for owner: %s. %s" , owner .getUuid (), StringUtils .defaultString (e .getMessage ())));
11791170 }
1171+ }
1172+
1173+ private Pair <UnmanagedInstanceTO .Disk , List <UnmanagedInstanceTO .Disk >> getUnmanagedInstanceDisksPair (UnmanagedInstanceTO unmanagedInstance , Map <String , Long > dataDiskOfferingMap , String instanceName ) {
1174+ List <UnmanagedInstanceTO .Disk > unmanagedInstanceDisks = unmanagedInstance .getDisks ();
1175+ if (CollectionUtils .isEmpty (unmanagedInstanceDisks )) {
1176+ throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("No attached disks found for the unmanaged VM: %s" , instanceName ));
1177+ }
1178+ Pair <UnmanagedInstanceTO .Disk , List <UnmanagedInstanceTO .Disk >> rootAndDataDisksPair = getRootAndDataDisks (unmanagedInstanceDisks , dataDiskOfferingMap );
1179+ final UnmanagedInstanceTO .Disk rootDisk = rootAndDataDisksPair .first ();
1180+ if (rootDisk == null || StringUtils .isEmpty (rootDisk .getController ())) {
1181+ throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("VM import failed. Unable to retrieve root disk details for VM: %s " , instanceName ));
1182+ }
1183+ return rootAndDataDisksPair ;
1184+ }
1185+
1186+ private VirtualMachine .PowerState getImportingVMPowerState (UnmanagedInstanceTO unmanagedInstance ) {
1187+ return unmanagedInstance .getPowerState ().equals (UnmanagedInstanceTO .PowerState .PowerOn ) ?
1188+ VirtualMachine .PowerState .PowerOn :
1189+ VirtualMachine .PowerState .PowerOff ;
1190+ }
1191+
1192+ private void checkImportingVMNics (UnmanagedInstanceTO unmanagedInstance , Map <String , Network .IpAddresses > callerNicIpAddressMap , Map <String , String > allDetails , Map <String , Long > nicNetworkMap , Account owner , DataCenter zone , Cluster cluster , String hostName ) {
11801193 // Check NICs and supplied networks
1181- Map <String , Network .IpAddresses > nicIpAddressMap = getNicIpAddresses (unmanagedInstance .getNics (), callerNicIpAddressMap );
1182- Map <String , Long > allNicNetworkMap = getUnmanagedNicNetworkMap (unmanagedInstance .getName (), unmanagedInstance .getNics (), nicNetworkMap , nicIpAddressMap , zone , hostName , owner , cluster .getHypervisorType ());
11831194 if (!CollectionUtils .isEmpty (unmanagedInstance .getNics ())) {
11841195 allDetails .put (VmDetailConstants .NIC_ADAPTER , unmanagedInstance .getNics ().get (0 ).getAdapterType ());
11851196 }
11861197
11871198 if (StringUtils .isNotEmpty (unmanagedInstance .getVncPassword ())) {
11881199 allDetails .put (VmDetailConstants .KVM_VNC_PASSWORD , unmanagedInstance .getVncPassword ());
11891200 }
1201+ }
11901202
1191- VirtualMachine .PowerState powerState = VirtualMachine .PowerState .PowerOff ;
1192- if (unmanagedInstance .getPowerState ().equals (UnmanagedInstanceTO .PowerState .PowerOn )) {
1193- powerState = VirtualMachine .PowerState .PowerOn ;
1194- }
1195-
1203+ private UserVm importAndGetImportingVM (DataCenter zone , HostVO host , VirtualMachineTemplate template , String internalCSName , String displayName , Account owner , Account caller , Long userId , ServiceOfferingVO validatedServiceOffering , String hostName , Cluster cluster , VirtualMachine .PowerState powerState , Map <String , String > allDetails , String instanceName ) {
11961204 try {
1197- userVm = userVmManager .importVM (zone , host , template , internalCSName , displayName , owner ,
1205+ return userVmManager .importVM (zone , host , template , internalCSName , displayName , owner ,
11981206 null , caller , true , null , owner .getAccountId (), userId ,
11991207 validatedServiceOffering , null , hostName ,
12001208 cluster .getHypervisorType (), allDetails , powerState , null );
@@ -1203,11 +1211,9 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
12031211 logger .error (errorMsg , ice );
12041212 throw new ServerApiException (ApiErrorCode .INSUFFICIENT_CAPACITY_ERROR , errorMsg );
12051213 }
1214+ }
12061215
1207- if (userVm == null ) {
1208- throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("Failed to import vm name: %s" , instanceName ));
1209- }
1210- List <Pair <DiskProfile , StoragePool >> diskProfileStoragePoolList = new ArrayList <>();
1216+ private void importVMDisksAfterImportingVM (UserVm userVm , Cluster cluster , VirtualMachineTemplate template , Account owner , UnmanagedInstanceTO .Disk rootDisk , List <UnmanagedInstanceTO .Disk > dataDisks , Map <String , String > details , ServiceOfferingVO serviceOffering , Map <String , Long > dataDiskOfferingMap , String instanceName , List <Pair <DiskProfile , StoragePool >> diskProfileStoragePoolList ) {
12111217 try {
12121218 if (rootDisk .getCapacity () == null || rootDisk .getCapacity () == 0 ) {
12131219 throw new InvalidParameterValueException (String .format ("Root disk ID: %s size is invalid" , rootDisk .getDiskId ()));
@@ -1239,6 +1245,9 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
12391245 cleanupFailedImportVM (userVm );
12401246 throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("Failed to import volumes while importing vm: %s. %s" , instanceName , StringUtils .defaultString (e .getMessage ())));
12411247 }
1248+ }
1249+
1250+ private void importVMNicsAfterImportingVM (UnmanagedInstanceTO unmanagedInstance , Map <String , Long > allNicNetworkMap , UserVm userVm , boolean forced , String instanceName , Map <String , Network .IpAddresses > nicIpAddressMap ) {
12421251 try {
12431252 int nicIndex = 0 ;
12441253 for (UnmanagedInstanceTO .Nic nic : unmanagedInstance .getNics ()) {
@@ -1252,6 +1261,50 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
12521261 cleanupFailedImportVM (userVm );
12531262 throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("Failed to import NICs while importing vm: %s. %s" , instanceName , StringUtils .defaultString (e .getMessage ())));
12541263 }
1264+ }
1265+
1266+ private UserVm importVirtualMachineInternal (final UnmanagedInstanceTO unmanagedInstance , final String instanceName , final DataCenter zone , final Cluster cluster , final HostVO host ,
1267+ final VirtualMachineTemplate template , final String displayName , final String hostName , final Account caller , final Account owner , final Long userId ,
1268+ final ServiceOfferingVO serviceOffering , final Map <String , Long > dataDiskOfferingMap ,
1269+ final Map <String , Long > nicNetworkMap , final Map <String , Network .IpAddresses > callerNicIpAddressMap ,
1270+ final Map <String , String > details , final boolean migrateAllowed , final boolean forced , final boolean isImportUnmanagedFromSameHypervisor ) {
1271+ logger .debug (LogUtils .logGsonWithoutException ("Trying to import VM [%s] with name [%s], in zone [%s], cluster [%s], and host [%s], using template [%s], service offering [%s], disks map [%s], NICs map [%s] and details [%s]." ,
1272+ unmanagedInstance , instanceName , zone , cluster , host , template , serviceOffering , dataDiskOfferingMap , nicNetworkMap , details ));
1273+
1274+ ServiceOfferingVO validatedServiceOffering = validateAndGetServiceOffering (unmanagedInstance , serviceOffering , owner , zone , details , cluster );
1275+ String internalCSName = getUnmanagedInstanceInternalName (unmanagedInstance , instanceName );
1276+ Map <String , String > allDetails = new HashMap <>(details );
1277+ addImportingVMDynamicOfferingDetails (validatedServiceOffering , serviceOffering , allDetails );
1278+
1279+ if (!migrateAllowed && host != null && !hostSupportsServiceOfferingAndTemplate (host , validatedServiceOffering , template )) {
1280+ throw new InvalidParameterValueException (String .format ("Service offering: %s or template: %s is not compatible with host: %s of unmanaged VM: %s" , serviceOffering .getUuid (), template .getUuid (), host .getUuid (), instanceName ));
1281+ }
1282+
1283+ Pair <UnmanagedInstanceTO .Disk , List <UnmanagedInstanceTO .Disk >> disksPair = getUnmanagedInstanceDisksPair (unmanagedInstance , dataDiskOfferingMap , instanceName );
1284+ UnmanagedInstanceTO .Disk rootDisk = disksPair .first ();
1285+ List <UnmanagedInstanceTO .Disk > dataDisks = disksPair .second ();
1286+
1287+ checkImportingVMDisksAndDiskOfferings (unmanagedInstance , rootDisk , dataDisks , dataDiskOfferingMap ,
1288+ validatedServiceOffering , cluster , allDetails , isImportUnmanagedFromSameHypervisor ,
1289+ owner , zone , serviceOffering , migrateAllowed );
1290+
1291+ Map <String , Network .IpAddresses > nicIpAddressMap = getNicIpAddresses (unmanagedInstance .getNics (), callerNicIpAddressMap );
1292+ Map <String , Long > allNicNetworkMap = getUnmanagedNicNetworkMap (unmanagedInstance .getName (), unmanagedInstance .getNics (), nicNetworkMap , nicIpAddressMap , zone , hostName , owner , cluster .getHypervisorType ());
1293+ checkImportingVMNics (unmanagedInstance , callerNicIpAddressMap , allDetails , nicNetworkMap ,
1294+ owner , zone , cluster , hostName );
1295+
1296+ VirtualMachine .PowerState powerState = getImportingVMPowerState (unmanagedInstance );
1297+
1298+ UserVm userVm = importAndGetImportingVM (zone , host , template , internalCSName , displayName , owner , caller ,
1299+ userId , validatedServiceOffering , hostName , cluster , powerState , allDetails , instanceName );
1300+
1301+ if (userVm == null ) {
1302+ throw new ServerApiException (ApiErrorCode .INTERNAL_ERROR , String .format ("Failed to import vm name: %s" , instanceName ));
1303+ }
1304+
1305+ List <Pair <DiskProfile , StoragePool >> diskProfileStoragePoolList = new ArrayList <>();
1306+ importVMDisksAfterImportingVM (userVm , cluster , template , owner , rootDisk , dataDisks , details , serviceOffering , dataDiskOfferingMap , instanceName , diskProfileStoragePoolList );
1307+ importVMNicsAfterImportingVM (unmanagedInstance , allNicNetworkMap , userVm , forced , instanceName , nicIpAddressMap );
12551308 if (migrateAllowed ) {
12561309 userVm = migrateImportedVM (host , template , validatedServiceOffering , userVm , owner , diskProfileStoragePoolList );
12571310 }
0 commit comments