diff --git a/agent/src/com/cloud/agent/vmdata/JettyVmDataServer.java b/agent/src/com/cloud/agent/vmdata/JettyVmDataServer.java index 38ebe1ac33d..df112a6a46f 100644 --- a/agent/src/com/cloud/agent/vmdata/JettyVmDataServer.java +++ b/agent/src/com/cloud/agent/vmdata/JettyVmDataServer.java @@ -21,6 +21,7 @@ package com.cloud.agent.vmdata; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; @@ -38,6 +39,7 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Logger; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; @@ -294,10 +296,18 @@ public class JettyVmDataServer implements VmDataServer { try { _fs.create(vmDataDir, item[1]); String vmDataFile = vmDataDir + File.separator + item[1]; + byte[] data; if (item[2] != null) { - BufferedWriter writer = new BufferedWriter(new FileWriter(vmDataFile)); - writer.write(item[2]); - writer.close(); + if (item[1].equals("userdata")) { + data = Base64.decodeBase64(item[2]); + } else { + data = item[2].getBytes(); + } + if (data != null && data.length > 0) { + FileOutputStream writer = new FileOutputStream(vmDataFile); + writer.write(data); + writer.close(); + } } } catch (IOException e) { s_logger.warn("Failed to write vm data item " + item[1], e); diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 81f0a620c40..dc70480c90d 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -489,9 +489,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { @Override public HostVO getSSAgent(HostVO ssHost) { if( ssHost.getType() == Host.Type.LocalSecondaryStorage ) { - if( ssHost.getStatus() == Status.Up ) { - return ssHost; - } + return ssHost; } else if ( ssHost.getType() == Host.Type.SecondaryStorage) { Long dcId = ssHost.getDataCenterId(); List ssAHosts = _hostDao.listBy(Host.Type.SecondaryStorageVM, dcId); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 73bd4e2cc82..433b7ca0886 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -484,12 +484,14 @@ public class ApiDBUtils { if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) { return _templateHostDao.listByTemplateId(templateId); } else { - HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId); - if (secondaryStorageHost == null) { - return new ArrayList(); - } else { - return _templateHostDao.listByHostTemplate(secondaryStorageHost.getId(), templateId); + List templates = new ArrayList(); + List secondaryStorageHosts = _storageMgr.getSecondaryStorageHosts(zoneId); + if (!secondaryStorageHosts.isEmpty()) { + for (HostVO ssh : secondaryStorageHosts) { + templates.addAll(_templateHostDao.listByHostTemplate(ssh.getId(), templateId)); + } } + return templates; } } else { return _templateHostDao.listByOnlyTemplateId(templateId); diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index e1210cb5e42..5b4860788e5 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -195,5 +195,7 @@ public interface StorageManager extends Manager { boolean delPoolFromHost(long hostId); - HostVO getSecondaryStorageHost(long zoneId, long tmpltId); + HostVO getSecondaryStorageHost(long zoneId, long tmpltId); + + List getSecondaryStorageHosts(long zoneId); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index aabb44848e7..fe3795c857d 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -970,6 +970,18 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag int index = rn.nextInt(size); return hosts.get(index); } + + @Override + public List getSecondaryStorageHosts(long zoneId) { + List hosts = _hostDao.listSecondaryStorageHosts(zoneId); + if( hosts == null || hosts.size() == 0) { + hosts = _hostDao.listLocalSecondaryStorageHosts(zoneId); + if (hosts.isEmpty()) { + return new ArrayList(); + } + } + return hosts; + } @Override public String getStoragePoolTags(long poolId) {