diff --git a/api/src/com/cloud/host/Host.java b/api/src/com/cloud/host/Host.java index 0ece719bcc4..3aaa504069c 100755 --- a/api/src/com/cloud/host/Host.java +++ b/api/src/com/cloud/host/Host.java @@ -31,7 +31,9 @@ public interface Host { Storage(false), Routing(false), SecondaryStorage(false), - ConsoleProxy(true); + ConsoleProxy(true), + ExternalFirewall(false), + ExternalLoadBalancer(false); boolean _virtual; private Type(boolean virtual) { diff --git a/api/src/com/cloud/network/service/Providers.java b/api/src/com/cloud/network/service/Providers.java index cfc9d440911..5556fd94394 100644 --- a/api/src/com/cloud/network/service/Providers.java +++ b/api/src/com/cloud/network/service/Providers.java @@ -19,4 +19,6 @@ package com.cloud.network.service; public class Providers { public final static String VirtualRouter = "VirtualRouter"; + public final static String ExternalFirewall = "ExternalFirewall"; + public final static String ExternalLoadBalancer = "ExternalLoadBalancer"; } diff --git a/api/src/com/cloud/resource/Resource.java b/api/src/com/cloud/resource/Resource.java index b1e99ba6137..ebc5f3f434e 100644 --- a/api/src/com/cloud/resource/Resource.java +++ b/api/src/com/cloud/resource/Resource.java @@ -78,7 +78,8 @@ public interface Resource { enum ReservationStrategy { UserSpecified, Create, - Start + Start, + PlaceHolder; } /** diff --git a/core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java b/core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java new file mode 100644 index 00000000000..d50b54709fc --- /dev/null +++ b/core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java @@ -0,0 +1,5 @@ +package com.cloud.agent.api; + +public class StartupExternalFirewallCommand extends StartupCommand { + +} diff --git a/core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java b/core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java new file mode 100644 index 00000000000..a964888c0ae --- /dev/null +++ b/core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java @@ -0,0 +1,5 @@ +package com.cloud.agent.api; + +public class StartupExternalLoadBalancerCommand extends StartupCommand { + +} diff --git a/deps/cloud-axis.jar b/deps/cloud-axis.jar new file mode 100644 index 00000000000..20b09a595b4 Binary files /dev/null and b/deps/cloud-axis.jar differ diff --git a/deps/cloud-commons-discovery.jar b/deps/cloud-commons-discovery.jar new file mode 100644 index 00000000000..b88554847b7 Binary files /dev/null and b/deps/cloud-commons-discovery.jar differ diff --git a/deps/cloud-iControl.jar b/deps/cloud-iControl.jar new file mode 100644 index 00000000000..2d188168fa3 Binary files /dev/null and b/deps/cloud-iControl.jar differ diff --git a/deps/cloud-wsdl4j.jar b/deps/cloud-wsdl4j.jar new file mode 100644 index 00000000000..c6254ee6966 Binary files /dev/null and b/deps/cloud-wsdl4j.jar differ diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index 02dd9a0a96c..bf192d2f928 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -18,6 +18,7 @@ package com.cloud.agent; import java.util.List; +import java.util.Map; import java.util.Set; import com.cloud.agent.api.Answer; @@ -34,8 +35,10 @@ import com.cloud.host.Host; import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status; +import com.cloud.host.Host.Type; import com.cloud.host.Status.Event; import com.cloud.offering.ServiceOffering; +import com.cloud.resource.ServerResource; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; @@ -159,6 +162,16 @@ public interface AgentManager extends Manager { List listByDataCenter(long dcId); List listByPod(long podId); + /** + * Adds a new host + * @param zoneId + * @param resource + * @param hostType + * @param hostDetails + * @return new Host + */ + public Host addHost(long zoneId, ServerResource resource, Type hostType, Map hostDetails); + /** * Deletes a host * diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 60ce6b03d0f..d6442af2b11 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -60,6 +60,8 @@ import com.cloud.agent.api.ReadyCommand; import com.cloud.agent.api.ShutdownCommand; import com.cloud.agent.api.StartupAnswer; import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.StartupExternalFirewallCommand; +import com.cloud.agent.api.StartupExternalLoadBalancerCommand; import com.cloud.agent.api.StartupProxyCommand; import com.cloud.agent.api.StartupRoutingCommand; import com.cloud.agent.api.StartupStorageCommand; @@ -1616,15 +1618,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS for (final VMInstanceVO vm : vms) { _haMgr.scheduleMigration(vm); } - } else { - final List ids = _volDao.findVmsStoredOnHost(hostId); - for (final Long id : ids) { - final VMInstanceVO instance = _vmDao.findById(id); - if (instance != null && (instance.getState() == State.Running || instance.getState() == State.Starting)) { - _haMgr.scheduleStop(instance, host.getId(), false); - } - } - } + } return true; } @@ -1755,6 +1749,25 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS } } } + + public Host addHost(long zoneId, ServerResource resource, Type hostType, Map hostDetails) { + // Check if the zone exists in the system + if (_dcDao.findById(zoneId) == null ){ + throw new InvalidParameterValueException("Can't find zone with id " + zoneId); + } + + Map details = hostDetails; + String guid = (String) details.get("guid"); + List currentHosts = _hostDao.listBy(hostType, zoneId); + for (HostVO currentHost : currentHosts) { + if (currentHost.getGuid().equals(guid)) { + return currentHost; + } + } + + AgentAttache attache = simulateStart(resource, hostDetails, true); + return _hostDao.findById(attache.getId()); + } public HostVO createHost(final StartupCommand startup, ServerResource resource, Map details, boolean directFirst) throws IllegalArgumentException { Host.Type type = null; @@ -1793,6 +1806,10 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS type = Host.Type.ConsoleProxy; } else if (startup instanceof StartupRoutingCommand) { type = Host.Type.Routing; + } else if (startup instanceof StartupExternalFirewallCommand) { + type = Host.Type.ExternalFirewall; + } else if (startup instanceof StartupExternalLoadBalancerCommand) { + type = Host.Type.ExternalLoadBalancer; } else { assert false : "Did someone add a new Startup command?"; } @@ -1842,17 +1859,12 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS * startup.getStorageIpAddress()); } } */ - if (startup instanceof StartupStorageCommand) { - server = _hostDao.persist(server); - id = server.getId(); - } else if (startup instanceof StartupProxyCommand) { + if (startup instanceof StartupProxyCommand) { server.setProxyPort(((StartupProxyCommand) startup).getProxyPort()); - server = _hostDao.persist(server); - id = server.getId(); - } else if (startup instanceof StartupRoutingCommand) { - server = _hostDao.persist(server); - id = server.getId(); - } + } + + server = _hostDao.persist(server); + id = server.getId(); s_logger.info("New " + server.getType().toString() + " host connected w/ guid " + startup.getGuid() + " and id is " + id); } else { @@ -2020,7 +2032,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS } Long podId = null; if (p == null) { - if (type != Host.Type.SecondaryStorage) { + if (type != Host.Type.SecondaryStorage && + type != Host.Type.ExternalFirewall && + type != Host.Type.ExternalLoadBalancer) { /* * s_logger.info("Unable to find the pod so we are creating one." diff --git a/server/src/com/cloud/agent/manager/AgentMonitor.java b/server/src/com/cloud/agent/manager/AgentMonitor.java index 17ed235c56c..5ef7ff19521 100755 --- a/server/src/com/cloud/agent/manager/AgentMonitor.java +++ b/server/src/com/cloud/agent/manager/AgentMonitor.java @@ -108,6 +108,11 @@ public class AgentMonitor extends Thread implements Listener { } for (HostVO host : hosts) { + if (host.getType().equals(Host.Type.ExternalFirewall) || + host.getType().equals(Host.Type.ExternalLoadBalancer)) { + continue; + } + if (host.getManagementServerId() == null || host.getManagementServerId() == _msId) { if (s_logger.isInfoEnabled()) { s_logger.info("Asking agent mgr to investgate why host " + host.getId() + " is behind on ping. last ping time: " + host.getLastPinged()); diff --git a/server/src/com/cloud/vm/NicVO.java b/server/src/com/cloud/vm/NicVO.java index f34447e51a9..ebc5392e5b3 100644 --- a/server/src/com/cloud/vm/NicVO.java +++ b/server/src/com/cloud/vm/NicVO.java @@ -45,7 +45,7 @@ public class NicVO implements Nic { long id; @Column(name="instance_id") - long instanceId; + Long instanceId; @Column(name="ip4_address") String ip4Address; @@ -107,7 +107,7 @@ public class NicVO implements Nic { @Column(name=GenericDao.CREATED_COLUMN) Date created; - public NicVO(String reserver, long instanceId, long configurationId) { + public NicVO(String reserver, Long instanceId, long configurationId) { this.reserver = reserver; this.instanceId = instanceId; this.networkId = configurationId; diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 2fd92c8d9a9..9262741d7cf 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -167,7 +167,7 @@ INSERT INTO `cloud`.`certificate` (id,certificate,updated) VALUES ('1',null,'N') CREATE TABLE `cloud`.`nics` ( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id', + `instance_id` bigint unsigned COMMENT 'vm instance id', `mac_address` varchar(17) COMMENT 'mac address', `ip4_address` varchar(15) COMMENT 'ip4 address', `netmask` varchar(15) COMMENT 'netmask for ip4 address',