Hi,

I noticed a minor problem trying to attach a volume that is at the cluster
scope to a VM whose root disk is at the zone scope IF the VM is in the
stopped state (this works fine when the VM is in the running state).

The problem is in the needMoveVolume method in the VolumeApiServiceImpl
method.

When the VM is in the Stopped state, if you try to get the host ID of the
VM, it will come back as null. (code below)

        if (storeForRootStoreScope.getScopeType() !=
storeForDataStoreScope.getScopeType()) {

            if (storeForDataStoreScope.getScopeType() == ScopeType.CLUSTER)
{

                Long vmClusterId = null;

                if (storeForRootStoreScope.getScopeType() == ScopeType.HOST)
{

                    HostScope hs = (HostScope)storeForRootStoreScope;

                    vmClusterId = hs.getClusterId();

                } else if (storeForRootStoreScope.getScopeType() ==
ScopeType.ZONE) {

                    Long hostId = _vmInstanceDao
.findById(rootVolumeOfVm.getInstanceId()).getHostId();

                    if (hostId != null) {

                        HostVO host = _hostDao.findById(hostId);

                        vmClusterId = host.getClusterId();

                    }

                }

                if(storeForDataStoreScope.getScopeId().equals(vmClusterId)) {

                    return false;

                }

            } else if (storeForDataStoreScope.getScopeType() == ScopeType.
HOST

                    && (storeForRootStoreScope.getScopeType() == ScopeType.
CLUSTER || storeForRootStoreScope.getScopeType() == ScopeType.ZONE)) {

                Long hostId = _vmInstanceDao
.findById(rootVolumeOfVm.getInstanceId()).getHostId();

                if (storeForDataStoreScope.getScopeId().equals(hostId)) {

                    return false;

                }

            }

            throw new CloudRuntimeException("Can't move volume between
scope: " + storeForDataStoreScope.getScopeType() + " and " +
storeForRootStoreScope.getScopeType());

        }
My question is the following: Do you think it's acceptable to query for the
last host ID if the host ID is null in this situation? (code below)

        if (storeForRootStoreScope.getScopeType() !=
storeForDataStoreScope.getScopeType()) {

            if (storeForDataStoreScope.getScopeType() == ScopeType.CLUSTER)
{

                Long vmClusterId = null;

                if (storeForRootStoreScope.getScopeType() == ScopeType.HOST)
{

                    HostScope hs = (HostScope)storeForRootStoreScope;

                    vmClusterId = hs.getClusterId();

                } else if (storeForRootStoreScope.getScopeType() ==
ScopeType.ZONE) {

                    Long hostId = _vmInstanceDao
.findById(rootVolumeOfVm.getInstanceId()).getHostId();



                    if (hostId == null) {

                        hostId = _vmInstanceDao
.findById(rootVolumeOfVm.getInstanceId()).getLastHostId();

                    }



                    if (hostId != null) {

                        HostVO host = _hostDao.findById(hostId);

                        vmClusterId = host.getClusterId();

                    }

                }

                if(storeForDataStoreScope.getScopeId().equals(vmClusterId)) {

                    return false;

                }

            } else if (storeForDataStoreScope.getScopeType() == ScopeType.
HOST

                    && (storeForRootStoreScope.getScopeType() == ScopeType.
CLUSTER || storeForRootStoreScope.getScopeType() == ScopeType.ZONE)) {

                Long hostId = _vmInstanceDao
.findById(rootVolumeOfVm.getInstanceId()).getHostId();

                if (storeForDataStoreScope.getScopeId().equals(hostId)) {

                    return false;

                }

            }

            throw new CloudRuntimeException("Can't move volume between
scope: " + storeForDataStoreScope.getScopeType() + " and " +
storeForRootStoreScope.getScopeType());

        }
I believe this solves the problem for this one case, but it wouldn't solve
the case where the VM was created in the Stopped state, it's root disk is
at the zone scope, and we want to attach a data disk that is at the cluster
scope to the VM.

In this situation, there will not be a last host ID.

Thoughts?

Thanks!

-- 
*Mike Tutkowski*
*Senior CloudStack Developer, SolidFire Inc.*
e: mike.tutkow...@solidfire.com
o: 303.746.7302
Advancing the way the world uses the
cloud<http://solidfire.com/solution/overview/?video=play>
*(tm)*

Reply via email to