From 72e8b767fed556949561f675878b64f0fadef6c6 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Wed, 15 Sep 2010 10:43:30 -0700 Subject: [PATCH] Mount secondary storage as a datastore to implement ISO attachment --- core/src/com/cloud/agent/api/AttachIsoCommand.java | 9 +++++++++ core/src/com/cloud/storage/StorageManager.java | 2 +- server/src/com/cloud/server/ManagementServerImpl.java | 5 +++-- server/src/com/cloud/storage/StorageManagerImpl.java | 7 +++---- server/src/com/cloud/vm/UserVmManagerImpl.java | 11 ++++++++--- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/core/src/com/cloud/agent/api/AttachIsoCommand.java b/core/src/com/cloud/agent/api/AttachIsoCommand.java index 6073ab553f7..f4e3fcc46bc 100644 --- a/core/src/com/cloud/agent/api/AttachIsoCommand.java +++ b/core/src/com/cloud/agent/api/AttachIsoCommand.java @@ -21,6 +21,7 @@ package com.cloud.agent.api; public class AttachIsoCommand extends Command { private String vmName; + private String storeUrl; private String isoPath; private boolean attach; @@ -49,4 +50,12 @@ public class AttachIsoCommand extends Command { public boolean isAttach() { return attach; } + + public String getStoreUrl() { + return storeUrl; + } + + public void setStoreUrl(String url) { + storeUrl = url; + } } diff --git a/core/src/com/cloud/storage/StorageManager.java b/core/src/com/cloud/storage/StorageManager.java index e75267963a7..d5e447e4e1b 100755 --- a/core/src/com/cloud/storage/StorageManager.java +++ b/core/src/com/cloud/storage/StorageManager.java @@ -138,7 +138,7 @@ public interface StorageManager extends Manager { * @param datacenterId * @return absolute ISO path */ - public String getAbsoluteIsoPath(long templateId, long dataCenterId); + public Pair getAbsoluteIsoPath(long templateId, long dataCenterId); /** * Returns the URL of the secondary storage host diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index edee8753ca2..16e361dd4d6 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2399,10 +2399,11 @@ public class ManagementServerImpl implements ManagementServer { UserVmVO started = null; if (isIso) { - String isoPath = _storageMgr.getAbsoluteIsoPath(templateId, dataCenterId); + Pair isoPath = _storageMgr.getAbsoluteIsoPath(templateId, dataCenterId); + assert(isoPath != null); try { - started = _vmMgr.startVirtualMachine(userId, created.getId(), password, isoPath, startEventId); + started = _vmMgr.startVirtualMachine(userId, created.getId(), password, isoPath.first(), startEventId); } catch (ExecutionException e) { diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 3dfca37b085..c9c3fc912c5 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1174,8 +1174,7 @@ public class StorageManagerImpl implements StorageManager { return null; } - @Override - public String getAbsoluteIsoPath(long templateId, long dataCenterId) { + public Pair getAbsoluteIsoPath(long templateId, long dataCenterId) { String isoPath = null; List storageHosts = _hostDao.listBy(Host.Type.SecondaryStorage, dataCenterId); @@ -1184,12 +1183,12 @@ public class StorageManagerImpl implements StorageManager { VMTemplateHostVO templateHostVO = _vmTemplateHostDao.findByHostTemplate(storageHost.getId(), templateId); if (templateHostVO != null) { isoPath = storageHost.getStorageUrl() + "/" + templateHostVO.getInstallPath(); - break; + return new Pair(isoPath, storageHost.getStorageUrl()); } } } - return isoPath; + return null; } @Override diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 0112d6e454f..83d3c85d3a4 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -527,15 +527,18 @@ public class UserVmManagerImpl implements UserVmManager { } // Get the path of the ISO - String isoPath = _storageMgr.getAbsoluteIsoPath(isoId, vm.getDataCenterId()); + Pair isoPathPair = _storageMgr.getAbsoluteIsoPath(isoId, vm.getDataCenterId()); + String isoPath; String isoName = _templateDao.findById(isoId).getName(); - if (isoPath == null) { + if (isoPathPair == null) { // we can't send a null path to the ServerResource, so return false if we are unable to find the isoPath if (isoName.startsWith("xs-tools")) isoPath = isoName; else return false; + } else { + isoPath = isoPathPair.first(); } String vmName = vm.getInstanceName(); @@ -545,6 +548,8 @@ public class UserVmManagerImpl implements UserVmManager { return false; AttachIsoCommand cmd = new AttachIsoCommand(vmName, isoPath, attach); + if(isoPathPair != null) + cmd.setStoreUrl(isoPathPair.second()); Answer a = _agentMgr.easySend(vm.getHostId(), cmd); return (a != null); } @@ -670,7 +675,7 @@ public class UserVmManagerImpl implements UserVmManager { } else { Long isoId = vm.getIsoId(); if (isoId != null) { - isoPath = _storageMgr.getAbsoluteIsoPath(isoId, vm.getDataCenterId()); + isoPath = _storageMgr.getAbsoluteIsoPath(isoId, vm.getDataCenterId()).first(); } }