diff --git a/api/src/com/cloud/api/commands/AddHostCmd.java b/api/src/com/cloud/api/commands/AddHostCmd.java index 2c75d070cc3..a1f7b02754d 100644 --- a/api/src/com/cloud/api/commands/AddHostCmd.java +++ b/api/src/com/cloud/api/commands/AddHostCmd.java @@ -62,6 +62,9 @@ public class AddHostCmd extends BaseCmd { @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=true, description="the Zone ID for the host") private Long zoneId; + + @Parameter(name=ApiConstants.HYPERVISOR, type=CommandType.STRING, required=false, description="hypervisor type of the host") + private String hypervisor; ///////////////////////////////////////////////////// @@ -95,6 +98,10 @@ public class AddHostCmd extends BaseCmd { public Long getZoneId() { return zoneId; } + + public String getHypervisor() { + return hypervisor; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index bf192d2f928..a02f27568e2 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -222,7 +222,8 @@ public interface AgentManager extends Manager { public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException; public boolean reconnect(final long hostId) throws AgentUnavailableException; - public List discoverHosts(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; + public List discoverHosts(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password, String hypervisor) + throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; Answer easySend(Long hostId, Command cmd, int timeout); diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index c940074d43d..8d65e0bc09e 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -118,6 +118,7 @@ import com.cloud.host.Status; import com.cloud.host.Status.Event; import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.kvm.resource.KvmDummyResourceBase; import com.cloud.maid.StackMaid; @@ -557,18 +558,19 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS if( clusterName == null && clusterId == null ) { clusterName = "Standalone-" + url; } - return discoverHosts(dcId, podId, clusterId, clusterName, url, username, password); + return discoverHosts(dcId, podId, clusterId, clusterName, url, username, password, cmd.getHypervisor()); } @Override public List discoverHosts(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { Long dcId = cmd.getZoneId(); String url = cmd.getUrl(); - return discoverHosts(dcId, null, null, null, url, null, null); + return discoverHosts(dcId, null, null, null, url, null, null, ""); } @Override - public List discoverHosts(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { + public List discoverHosts(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password, String hypervisorType) + throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { URI uri = null; //Check if the zone exists in the system @@ -639,6 +641,11 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS Enumeration en = _discoverers.enumeration(); while (en.hasMoreElements()) { Discoverer discoverer = en.nextElement(); + if(hypervisorType != null) { + if(!discoverer.matchHypervisor(hypervisorType)) + continue; + } + Map> resources = null; try { diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index be4f671c5d3..ac6710cbd8a 100644 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -29,6 +29,7 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.kvm.resource.KvmDummyResourceBase; import com.cloud.resource.Discoverer; @@ -310,6 +311,18 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, public void postDiscovery(List hosts, long msId) throws DiscoveryException { // TODO Auto-generated method stub - } + + public Hypervisor.HypervisorType getHypervisorType() { + return Hypervisor.HypervisorType.KVM; + } + + @Override + public boolean matchHypervisor(String hypervisor) { + // for backwards compatibility, if not supplied, always let to try it + if(hypervisor == null) + return true; + + return Hypervisor.HypervisorType.KVM.toString().equalsIgnoreCase(hypervisor); + } } diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 245ae669e89..8daf0d2d450 100644 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -52,6 +52,7 @@ import com.cloud.host.HostInfo; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.xen.resource.CitrixResourceBase; import com.cloud.hypervisor.xen.resource.XcpServerResource; @@ -478,7 +479,14 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L createXsToolsISO(); return true; } - + + @Override + public boolean matchHypervisor(String hypervisor) { + if(hypervisor == null) + return true; + return Hypervisor.HypervisorType.XenServer.toString().equalsIgnoreCase(hypervisor); + } + @Override public void postDiscovery(List hosts, long msId) throws DiscoveryException{ //do nothing @@ -540,4 +548,5 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L public boolean processTimeout(long agentId, long seq) { return false; } + } diff --git a/server/src/com/cloud/resource/Discoverer.java b/server/src/com/cloud/resource/Discoverer.java index a162a417afd..e88f6f0dea2 100644 --- a/server/src/com/cloud/resource/Discoverer.java +++ b/server/src/com/cloud/resource/Discoverer.java @@ -23,6 +23,7 @@ import java.util.Map; import com.cloud.exception.DiscoveryException; import com.cloud.host.HostVO; +import com.cloud.hypervisor.Hypervisor; import com.cloud.utils.component.Adapter; /** @@ -41,4 +42,6 @@ public interface Discoverer extends Adapter { Map> find(long dcId, Long podId, Long clusterId, URI uri, String username, String password) throws DiscoveryException; void postDiscovery(List hosts, long msId) throws DiscoveryException; + + boolean matchHypervisor(String hypervisor); } diff --git a/server/src/com/cloud/resource/DummyHostDiscoverer.java b/server/src/com/cloud/resource/DummyHostDiscoverer.java index b60d35bb08c..9a0c5f3b93b 100644 --- a/server/src/com/cloud/resource/DummyHostDiscoverer.java +++ b/server/src/com/cloud/resource/DummyHostDiscoverer.java @@ -30,6 +30,7 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.host.HostVO; +import com.cloud.hypervisor.Hypervisor; @Local(value=Discoverer.class) public class DummyHostDiscoverer implements Discoverer { @@ -88,7 +89,12 @@ public class DummyHostDiscoverer implements Discoverer { public boolean stop() { return true; } - + + @Override + public boolean matchHypervisor(String hypervisor) { + return false; + } + @Override public void postDiscovery(List hosts, long msId) { //do nothing diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageDiscoverer.java b/server/src/com/cloud/storage/secondary/SecondaryStorageDiscoverer.java index c2403c97f72..1b079abbc06 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageDiscoverer.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageDiscoverer.java @@ -34,6 +34,7 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.host.HostVO; import com.cloud.host.Status.Event; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; import com.cloud.resource.ServerResource; @@ -237,6 +238,11 @@ public class SecondaryStorageDiscoverer extends DiscovererBase implements Discov } return true; } + + @Override + public boolean matchHypervisor(String hypervisor) { + return true; + } @Override public void postDiscovery(List hosts, long msId) {