This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.13
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.13 by this push:
     new 97f21c1  xenserver: Fixed null pointer and deployment issue on 
Xenserver with L2 Guest network with configDrive (#4004)
97f21c1 is described below

commit 97f21c1835765c42e237aa3a8c61e296a8f82dd0
Author: Spaceman1984 <[email protected]>
AuthorDate: Tue Jun 23 08:51:50 2020 +0200

    xenserver: Fixed null pointer and deployment issue on Xenserver with L2 
Guest network with configDrive (#4004)
    
    This PR fixes an issue where an instance fails to deploy due to a null 
pointer when using an L2 Guest Network with DefaultL2NetworkOfferingConfigDrive 
on Xenserver. It also fixes migrating an instance to another host.
    
    This has been tested by:
    - Creating an L2 Guest network, using DefaultL2NetworkOfferingConfigDrive 
as the network offering.
    - Deploying an instance using the L2 Guest network created.
    - Migrating the instance away from the host and back
---
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |  1 -
 .../xenserver/resource/CitrixResourceBase.java     | 33 +++++-------
 .../xenbase/CitrixMigrateCommandWrapper.java       |  3 +-
 .../wrapper/xenbase/CitrixStartCommandWrapper.java | 59 ++++++++++++----------
 .../network/element/ConfigDriveNetworkElement.java | 12 ++---
 5 files changed, 53 insertions(+), 55 deletions(-)

diff --git 
a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
 
b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
index b7c7ad3..13c9019 100755
--- 
a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ 
b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1055,7 +1055,6 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
                 } catch (final AffinityConflictException e2) {
                     s_logger.warn("Unable to create deployment, affinity rules 
associted to the VM conflict", e2);
                     throw new CloudRuntimeException("Unable to create 
deployment, affinity rules associted to the VM conflict");
-
                 }
 
                 if (dest == null) {
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index 79a9fb2..f9ec05a 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -201,6 +201,12 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
 
     private final static int BASE_TO_CONVERT_BYTES_INTO_KILOBYTES = 1024;
 
+    private final static int USER_DEVICE_START_ID = 3;
+
+    private final static String VM_NAME_ISO_SUFFIX = "-ISO";
+
+    private final static String VM_FILE_ISO_SUFFIX = ".iso";
+
     private static final XenServerConnectionPool ConnPool = 
XenServerConnectionPool.getInstance();
     // static min values for guests on xenserver
     private static final long mem_128m = 134217728L;
@@ -1120,7 +1126,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         throw new CloudRuntimeException(errMsg);
     }
 
-    public VBD createVbd(final Connection conn, final DiskTO volume, final 
String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) 
throws XmlRpcException, XenAPIException {
+    public VBD createVbd(final Connection conn, final DiskTO volume, final 
String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi, int 
isoCount) throws XmlRpcException, XenAPIException {
         final Volume.Type type = volume.getType();
 
         if (vdi == null) {
@@ -1156,7 +1162,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         if (volume.getType() == Volume.Type.ISO) {
             vbdr.mode = Types.VbdMode.RO;
             vbdr.type = Types.VbdType.CD;
-            vbdr.userdevice = "3";
+            vbdr.userdevice = String.valueOf(USER_DEVICE_START_ID + isoCount);
         } else {
             vbdr.mode = Types.VbdMode.RW;
             vbdr.type = Types.VbdType.DISK;
@@ -3868,7 +3874,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         return getVDIbyUuid(conn, volumePath);
     }
 
-    protected VDI mount(final Connection conn, final String vmName, final 
DiskTO volume) throws XmlRpcException, XenAPIException {
+    public VDI mount(final Connection conn, final String vmName, final DiskTO 
volume) throws XmlRpcException, XenAPIException {
         final DataTO data = volume.getData();
         final Volume.Type type = volume.getType();
         if (type == Volume.Type.ISO) {
@@ -3882,7 +3888,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
 
             // corer case, xenserver pv driver iso
             final String templateName = iso.getName();
-            if (templateName.startsWith("xs-tools")) {
+            if (templateName != null && templateName.startsWith("xs-tools")) {
                 try {
                     final String actualTemplateName = 
getActualIsoTemplate(conn);
                     final Set<VDI> vdis = VDI.getByNameLabel(conn, 
actualTemplateName);
@@ -3911,7 +3917,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             } catch (final URISyntaxException e) {
                 throw new CloudRuntimeException("Incorrect uri " + mountpoint, 
e);
             }
-            final SR isoSr = createIsoSRbyURI(conn, uri, vmName, false);
+            final SR isoSr = createIsoSRbyURI(conn, uri, vmName, true);
 
             final String isoname = isoPath.substring(index + 1);
 
@@ -4098,17 +4104,6 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         }
         final VM vm = vms.iterator().next();
 
-        if (vmDataList != null) {
-            // create SR
-            SR sr = createLocalIsoSR(conn, _configDriveSRName + 
getHost().getIp());
-
-            // 1. create vm data files
-            createVmdataFiles(vmName, vmDataList, configDriveLabel);
-
-            // 2. copy config drive iso to host
-            copyConfigDriveIsoToHost(conn, sr, vmName);
-        }
-
         final Set<VBD> vbds = vm.getVBDs(conn);
         for (final VBD vbd : vbds) {
             final VBD.Record vbdr = vbd.getRecord(conn);
@@ -5449,7 +5444,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
     public SR createLocalIsoSR(final Connection conn, final String srName) 
throws XenAPIException, XmlRpcException {
 
         // if config drive sr already exists then return
-        SR sr = getSRByNameLabelandHost(conn, _configDriveSRName + 
_host.getIp());
+        SR sr = getSRByNameLabelandHost(conn, srName);
 
         if (sr != null) {
             s_logger.debug("Config drive SR already exist, returing it");
@@ -5542,10 +5537,10 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             s_logger.debug("Attaching config drive iso device for the VM " + 
vmName + " In host " + ipAddr);
             Set<VM> vms = VM.getByNameLabel(conn, vmName);
 
-            SR sr = getSRByNameLabel(conn, _configDriveSRName + ipAddr);
+            SR sr = getSRByNameLabel(conn, vmName + VM_NAME_ISO_SUFFIX);
             //Here you will find only two vdis with the <vmname>.iso.
             //one is from source host and second from dest host
-            Set<VDI> vdis = VDI.getByNameLabel(conn, vmName + ".iso");
+            Set<VDI> vdis = VDI.getByNameLabel(conn, vmName + 
VM_FILE_ISO_SUFFIX);
             if (vdis.isEmpty()) {
                 s_logger.debug("Could not find config drive ISO: " + vmName);
                 return false;
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixMigrateCommandWrapper.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixMigrateCommandWrapper.java
index 12d19c8..9115559 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixMigrateCommandWrapper.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixMigrateCommandWrapper.java
@@ -91,7 +91,8 @@ public class CitrixMigrateCommandWrapper extends 
CommandWrapper<MigrateCommand,
 
             // The iso can be attached to vm only once the vm is (present in 
the host) migrated.
             // Attach the config drive iso device to VM
-            if (!citrixResourceBase.attachConfigDriveToMigratedVm(conn, 
vmName, dstHostIpAddr)) {
+            VM vm = vms.iterator().next();
+            if (!citrixResourceBase.attachConfigDriveIsoToVm(conn, vm)) {
                 s_logger.debug("Config drive ISO attach failed after migration 
for vm "+vmName);
             }
 
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
index 5737e93..ecd1b0d 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
@@ -98,34 +98,8 @@ public final class CitrixStartCommandWrapper extends 
CommandWrapper<StartCommand
             if (vmSpec.getType() != VirtualMachine.Type.User) {
                 citrixResourceBase.createPatchVbd(conn, vmName, vm);
             }
-            // put cdrom at the first place in the list
-            List<DiskTO> disks = new 
ArrayList<DiskTO>(vmSpec.getDisks().length);
-            int index = 0;
-            for (final DiskTO disk : vmSpec.getDisks()) {
-                if (Volume.Type.ISO.equals(disk.getType())) {
-                    disks.add(0, disk);
-                } else {
-                    disks.add(index, disk);
-                }
-                index++;
-            }
-
-            for (DiskTO disk : disks) {
-                final VDI newVdi = citrixResourceBase.prepareManagedDisk(conn, 
disk, vmSpec.getId(), vmSpec.getName());
-
-                if (newVdi != null) {
-                    final Map<String, String> data = new HashMap<>();
 
-                    final String path = newVdi.getUuid(conn);
-
-                    data.put(StartAnswer.PATH, path);
-                    data.put(StartAnswer.IMAGE_FORMAT, 
Storage.ImageFormat.VHD.toString());
-
-                    iqnToData.put(disk.getDetails().get(DiskTO.IQN), data);
-                }
-
-                citrixResourceBase.createVbd(conn, disk, vmName, vm, 
vmSpec.getBootloader(), newVdi);
-            }
+            prepareDisks(vmSpec, citrixResourceBase, conn, iqnToData, vmName, 
vm);
 
             for (final NicTO nic : vmSpec.getNics()) {
                 citrixResourceBase.createVif(conn, vmName, vm, vmSpec, nic);
@@ -228,4 +202,35 @@ public final class CitrixStartCommandWrapper extends 
CommandWrapper<StartCommand
             }
         }
     }
+
+    private void prepareDisks(VirtualMachineTO vmSpec, CitrixResourceBase 
citrixResourceBase, Connection conn,
+                              Map<String, Map<String, String>> iqnToData, 
String vmName, VM vm) throws Exception {
+        // put cdrom at the first place in the list
+        List<DiskTO> disks = new ArrayList<DiskTO>(vmSpec.getDisks().length);
+        int index = 0;
+        for (final DiskTO disk : vmSpec.getDisks()) {
+            if (Volume.Type.ISO.equals(disk.getType())) {
+                disks.add(0, disk);
+            } else {
+                disks.add(index, disk);
+            }
+            index++;
+        }
+        int isoCount = 0;
+        for (DiskTO disk : disks) {
+            final VDI newVdi = citrixResourceBase.prepareManagedDisk(conn, 
disk, vmSpec.getId(), vmSpec.getName());
+            if (newVdi != null) {
+                final Map<String, String> data = new HashMap<>();
+                final String path = newVdi.getUuid(conn);
+                data.put(StartAnswer.PATH, path);
+                data.put(StartAnswer.IMAGE_FORMAT, 
Storage.ImageFormat.VHD.toString());
+                iqnToData.put(disk.getDetails().get(DiskTO.IQN), data);
+            }
+            citrixResourceBase.createVbd(conn, disk, vmName, vm, 
vmSpec.getBootloader(), newVdi, isoCount);
+
+            if (disk.getType() == Volume.Type.ISO) {
+                isoCount++;
+            }
+        }
+    }
 }
diff --git 
a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java 
b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
index e2c3ca7..5331222 100644
--- 
a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
+++ 
b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
@@ -305,18 +305,16 @@ public class ConfigDriveNetworkElement extends 
AdapterBase implements NetworkEle
 
     @Override
     public boolean prepareMigration(NicProfile nic, Network network, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
-        if (nic.isDefaultNic() && 
_networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.ConfigDrive))
 {
+        if 
(_networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.ConfigDrive))
 {
             LOG.trace(String.format("[prepareMigration] for vm: %s", 
vm.getInstanceName()));
-            final DataStore dataStore = findDataStore(vm, dest);
-
             try {
-                addConfigDriveDisk(vm, dataStore);
-            } catch (ResourceUnavailableException e) {
+                addPasswordAndUserdata(network, nic, vm, dest, context);
+            } catch (InsufficientCapacityException | 
ResourceUnavailableException e) {
                 LOG.error("Failed to add config disk drive due to: ", e);
+                return false;
             }
-            return false;
         }
-        else return  true;
+        return  true;
     }
 
     @Override

Reply via email to