From 8eb430f60220af1a133c832f210e95c19cedf07c Mon Sep 17 00:00:00 2001 From: Mike Tutkowski Date: Fri, 27 Dec 2013 23:00:00 -0700 Subject: [PATCH] CLOUDSTACK-5662: XenServer can't discover iSCSI targets with different credentials --- .../com/cloud/hypervisor/HypervisorGuru.java | 2 + .../cloud/vm/VirtualMachineManagerImpl.java | 28 +++++++++++ .../com/cloud/hypervisor/XenServerGuru.java | 50 +++++++++++++++++++ .../xen/resource/CitrixResourceBase.java | 6 +-- .../resource/XenServerStorageProcessor.java | 2 +- .../cloud/hypervisor/HypervisorGuruBase.java | 5 ++ 6 files changed, 88 insertions(+), 5 deletions(-) diff --git a/api/src/com/cloud/hypervisor/HypervisorGuru.java b/api/src/com/cloud/hypervisor/HypervisorGuru.java index cc276808201..6f354d3bb6c 100644 --- a/api/src/com/cloud/hypervisor/HypervisorGuru.java +++ b/api/src/com/cloud/hypervisor/HypervisorGuru.java @@ -75,4 +75,6 @@ public interface HypervisorGuru extends Adapter { * */ List finalizeExpungeNics(VirtualMachine vm, List nics); + + List finalizeExpungeVolumes(VirtualMachine vm); } diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 1ae149df60c..824dc0b3022 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -479,6 +479,34 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac List nicExpungeCommands = hvGuru.finalizeExpungeNics(vm, profile.getNics()); _networkMgr.cleanupNics(profile); + s_logger.debug("Cleaning up hypervisor data structures (ex. SRs in XenServer) for managed storage"); + + List volumeExpungeCommands = hvGuru.finalizeExpungeVolumes(vm); + + if (volumeExpungeCommands != null) { + Long hostId = vm.getHostId() != null ? vm.getHostId() : vm.getLastHostId(); + + if (hostId != null) { + Commands cmds = new Commands(Command.OnError.Stop); + + for (Command volumeExpungeCommand : volumeExpungeCommands) { + cmds.addCommand(volumeExpungeCommand); + } + + _agentMgr.send(hostId, cmds); + + if (!cmds.isSuccessful()) { + for (Answer answer : cmds.getAnswers()) { + if (!answer.getResult()) { + s_logger.warn("Failed to expunge vm due to: " + answer.getDetails()); + + throw new CloudRuntimeException("Unable to expunge " + vm + " due to " + answer.getDetails()); + } + } + } + } + } + // Clean up volumes based on the vm's instance id volumeMgr.cleanupVolumes(vm.getId()); diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java index 5ddde14deb9..af37068203f 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.hypervisor; +import java.util.ArrayList; +import java.util.List; + import javax.ejb.Local; import javax.inject.Inject; @@ -26,14 +29,22 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.GuestOSVO; +import com.cloud.storage.Volume; +import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.VolumeDao; import com.cloud.template.VirtualMachineTemplate.BootloaderType; import com.cloud.utils.Pair; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.storage.command.CopyCommand; +import org.apache.cloudstack.storage.command.DettachCommand; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; @Local(value=HypervisorGuru.class) public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru { @@ -42,6 +53,12 @@ public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru EndPointSelector endPointSelector; @Inject HostDao hostDao; + @Inject + VolumeDao _volumeDao; + @Inject + PrimaryDataStoreDao _storagePoolDao; + @Inject + VolumeDataFactory _volFactory; protected XenServerGuru() { super(); @@ -73,6 +90,39 @@ public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru return true; } + @Override + public List finalizeExpungeVolumes(VirtualMachine vm) { + List commands = new ArrayList(); + + List volumes = _volumeDao.findByInstance(vm.getId()); + + if (volumes != null) { + for (VolumeVO volume : volumes) { + if (volume.getVolumeType() == Volume.Type.DATADISK) { + StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId()); + + if (storagePool.isManaged()) { + DataTO volTO = _volFactory.getVolume(volume.getId()).getTO(); + DiskTO disk = new DiskTO(volTO, volume.getDeviceId(), volume.getPath(), volume.getVolumeType()); + + DettachCommand cmd = new DettachCommand(disk, vm.getInstanceName()); + + cmd.setManaged(true); + + cmd.setStorageHost(storagePool.getHostAddress()); + cmd.setStoragePort(storagePool.getPort()); + + cmd.set_iScsiName(volume.get_iScsiName()); + + commands.add(cmd); + } + } + } + } + + return commands; + } + @Override public Pair getCommandHostDelegation(long hostId, Command cmd) { if (cmd instanceof CopyCommand) { diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 5e8402d7f1a..a23a6460597 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -6504,9 +6504,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return vdi; } - protected void handleSrAndVdiDetach(String iqn) throws Exception { - Connection conn = getConnection(); - + protected void handleSrAndVdiDetach(String iqn, Connection conn) throws Exception { SR sr = getStorageRepository(conn, iqn); removeSR(conn, sr); @@ -6614,7 +6612,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vdi.setNameLabel(conn, "detached"); if (cmd.isManaged()) { - handleSrAndVdiDetach(cmd.get_iScsiName()); + handleSrAndVdiDetach(cmd.get_iScsiName(), conn); } return new AttachVolumeAnswer(cmd); diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java index ad3001d4d3b..029481b7211 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java @@ -425,7 +425,7 @@ public class XenServerStorageProcessor implements StorageProcessor { } if (cmd.isManaged()) { - hypervisorResource.handleSrAndVdiDetach(cmd.get_iScsiName()); + hypervisorResource.handleSrAndVdiDetach(cmd.get_iScsiName(), conn); } return new DettachAnswer(disk); diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java index 4e28a6aba66..e504e8188c1 100644 --- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java @@ -144,4 +144,9 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis public List finalizeExpungeNics(VirtualMachine vm, List nics) { return null; } + + @Override + public List finalizeExpungeVolumes(VirtualMachine vm) { + return null; + } }