diff --git a/api/src/com/cloud/network/element/DnsServiceProvider.java b/api/src/com/cloud/network/element/DnsServiceProvider.java new file mode 100644 index 00000000000..7abce537221 --- /dev/null +++ b/api/src/com/cloud/network/element/DnsServiceProvider.java @@ -0,0 +1,36 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.element; + +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachineProfile; + +public interface DnsServiceProvider extends NetworkElement { + boolean addDnsEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; + + boolean configDnsSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; + + boolean removeDnsSupportForSubnet(Network network) throws ResourceUnavailableException; +} diff --git a/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index 89bec1783f6..a3f3a8cbc3d 100644 --- a/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -23,7 +23,6 @@ import java.util.Map; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey.Scope; - import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; @@ -39,6 +38,7 @@ import com.cloud.network.Network.Service; import com.cloud.network.NetworkProfile; import com.cloud.network.PhysicalNetwork; import com.cloud.network.element.DhcpServiceProvider; +import com.cloud.network.element.DnsServiceProvider; import com.cloud.network.element.LoadBalancingServiceProvider; import com.cloud.network.element.StaticNatServiceProvider; import com.cloud.network.element.UserDataServiceProvider; @@ -219,6 +219,8 @@ public interface NetworkOrchestrationService { DhcpServiceProvider getDhcpServiceProvider(Network network); + DnsServiceProvider getDnsServiceProvider(Network network); + void removeDhcpServiceInSubnet(Nic nic); boolean resourceCountNeedsUpdate(NetworkOffering ntwkOff, ACLType aclType); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 5a89dac7810..49058905100 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -32,12 +32,9 @@ import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; - import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.network.Networks; - import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.dao.RemoteAccessVpnDao; import com.cloud.network.dao.RemoteAccessVpnVO; @@ -59,7 +56,6 @@ import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.region.PortableIpDao; - import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.api.AgentControlAnswer; @@ -115,6 +111,7 @@ import com.cloud.network.NetworkMigrationResponder; import com.cloud.network.NetworkModel; import com.cloud.network.NetworkProfile; import com.cloud.network.NetworkStateListener; +import com.cloud.network.Networks; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork; @@ -141,6 +138,7 @@ import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.element.AggregatedCommandExecutor; import com.cloud.network.element.DhcpServiceProvider; +import com.cloud.network.element.DnsServiceProvider; import com.cloud.network.element.IpDeployer; import com.cloud.network.element.LoadBalancingServiceProvider; import com.cloud.network.element.NetworkElement; @@ -1276,6 +1274,18 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra return false; } } + if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dns) + && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, element.getProvider()) && element instanceof DnsServiceProvider) { + final DnsServiceProvider sp = (DnsServiceProvider)element; + if (profile.getIPv6Address() == null) { + if (!sp.configDnsSupportForSubnet(network, profile, vmProfile, dest, context)) { + return false; + } + } + if(!sp.addDnsEntry(network, profile, vmProfile, dest, context)) { + return false; + } + } if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.UserData) && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.UserData, element.getProvider()) && element instanceof UserDataServiceProvider) { final UserDataServiceProvider sp = (UserDataServiceProvider)element; @@ -1885,15 +1895,29 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } if (vm.getType() == Type.User - && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == GuestType.Shared && isLastNicInSubnet(nic)) { - // remove the dhcpservice ip if this is the last nic in subnet. - final DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network); - if (dhcpServiceProvider != null - && isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider)) { - removeDhcpServiceInSubnet(nic); + if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)) { + // remove the dhcpservice ip if this is the last nic in subnet. + final DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network); + if (dhcpServiceProvider != null + && isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider)) { + removeDhcpServiceInSubnet(nic); + } + } + if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dns)){ + final DnsServiceProvider dnsServiceProvider = getDnsServiceProvider(network); + if (dnsServiceProvider != null) { + try { + if(!dnsServiceProvider.removeDnsSupportForSubnet(network)) { + s_logger.warn("Failed to remove the ip alias on the dns server"); + } + } catch (final ResourceUnavailableException e) { + //failed to remove the dnsconfig. + s_logger.info("Unable to delete the ip alias due to unable to contact the dns server."); + } + } } } @@ -2807,6 +2831,18 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } } + @Override + public DnsServiceProvider getDnsServiceProvider(final Network network) { + final String dnsProvider = _ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Service.Dns); + + if (dnsProvider == null) { + s_logger.debug("Network " + network + " doesn't support service " + Service.Dhcp.getName()); + return null; + } + + return (DnsServiceProvider) _networkModel.getElementImplementingProvider(dnsProvider); + } + protected boolean isSharedNetworkWithServices(final Network network) { assert network != null; final DataCenter zone = _entityMgr.findById(DataCenter.class, network.getDataCenterId()); diff --git a/plugins/network-elements/nuage-vsp/pom.xml b/plugins/network-elements/nuage-vsp/pom.xml index b17fdf002da..d26a3aab2b0 100644 --- a/plugins/network-elements/nuage-vsp/pom.xml +++ b/plugins/network-elements/nuage-vsp/pom.xml @@ -38,7 +38,7 @@ net.nuage.vsp nuage-vsp-acs-client - 3.2.8.0 + 3.2.8.1 diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java index c7505d9e3c4..c710ad5eaea 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java @@ -19,6 +19,8 @@ package com.cloud.agent.api; +import org.apache.commons.lang.builder.HashCodeBuilder; + import com.cloud.host.Host; public class PingNuageVspCommand extends PingCommand { @@ -38,19 +40,18 @@ public class PingNuageVspCommand extends PingCommand { public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof PingNuageVspCommand)) return false; - if (!super.equals(o)) return false; PingNuageVspCommand that = (PingNuageVspCommand) o; - if (shouldAudit != that.shouldAudit) return false; - - return true; + return super.equals(that) + && shouldAudit == that.shouldAudit; } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (shouldAudit ? 1 : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(shouldAudit) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java index 50cace6ffcb..4691355533a 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java @@ -19,11 +19,15 @@ package com.cloud.agent.api.element; -import com.cloud.agent.api.Command; +import java.util.List; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspAclRule; import net.nuage.vsp.acs.client.api.model.VspNetwork; -import java.util.List; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; public class ApplyAclRuleVspCommand extends Command { @@ -63,27 +67,30 @@ public class ApplyAclRuleVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ApplyAclRuleVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof ApplyAclRuleVspCommand)) { + return false; + } ApplyAclRuleVspCommand that = (ApplyAclRuleVspCommand) o; - if (_networkReset != that._networkReset) return false; - if (_aclRules != null ? !_aclRules.equals(that._aclRules) : that._aclRules != null) return false; - if (_aclType != that._aclType) return false; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - - return true; + return super.equals(that) + && _networkReset == that._networkReset + && Objects.equals(_aclType, that._aclType) + && Objects.equals(_network, that._network) + && Objects.equals(_aclRules, that._aclRules); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_aclType != null ? _aclType.hashCode() : 0); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - result = 31 * result + (_aclRules != null ? _aclRules.hashCode() : 0); - result = 31 * result + (_networkReset ? 1 : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_aclType) + .append(_network) + .append(_networkReset) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java index 500f091919b..b017dea91a5 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java @@ -19,11 +19,15 @@ package com.cloud.agent.api.element; -import com.cloud.agent.api.Command; +import java.util.List; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspNetwork; import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import java.util.List; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; public class ApplyStaticNatVspCommand extends Command { @@ -51,24 +55,26 @@ public class ApplyStaticNatVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ApplyStaticNatVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof ApplyStaticNatVspCommand)) { + return false; + } ApplyStaticNatVspCommand that = (ApplyStaticNatVspCommand) o; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - if (_staticNatDetails != null ? !_staticNatDetails.equals(that._staticNatDetails) : that._staticNatDetails != null) - return false; - - return true; + return super.equals(that) + && Objects.equals(_network, that._network) + && Objects.equals(_staticNatDetails, that._staticNatDetails); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - result = 31 * result + (_staticNatDetails != null ? _staticNatDetails.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java index 2145f601722..37ec2bff4b6 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java @@ -19,38 +19,39 @@ package com.cloud.agent.api.element; -import com.cloud.agent.api.Command; +import java.util.List; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspAclRule; +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; import net.nuage.vsp.acs.client.api.model.VspNetwork; -import java.util.List; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; public class ImplementVspCommand extends Command { private final VspNetwork _network; - private final List _dnsServers; private final List _ingressFirewallRules; private final List _egressFirewallRules; private final List _floatingIpUuids; + private final VspDhcpDomainOption _dhcpOption; - public ImplementVspCommand(VspNetwork network, List dnsServers, List ingressFirewallRules, - List egressFirewallRules, List floatingIpUuids) { + public ImplementVspCommand(VspNetwork network, List ingressFirewallRules, + List egressFirewallRules, List floatingIpUuids, VspDhcpDomainOption dhcpOption) { super(); this._network = network; - this._dnsServers = dnsServers; this._ingressFirewallRules = ingressFirewallRules; this._egressFirewallRules = egressFirewallRules; this._floatingIpUuids = floatingIpUuids; + this._dhcpOption = dhcpOption; } public VspNetwork getNetwork() { return _network; } - public List getDnsServers() { - return _dnsServers; - } - public List getIngressFirewallRules() { return _ingressFirewallRules; } @@ -63,6 +64,10 @@ public class ImplementVspCommand extends Command { return _floatingIpUuids; } + public VspDhcpDomainOption getDhcpOption() { + return _dhcpOption; + } + @Override public boolean executeInSequence() { return false; @@ -70,32 +75,30 @@ public class ImplementVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ImplementVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof ImplementVspCommand)) { + return false; + } ImplementVspCommand that = (ImplementVspCommand) o; - if (_dnsServers != null ? !_dnsServers.equals(that._dnsServers) : that._dnsServers != null) return false; - if (_egressFirewallRules != null ? !_egressFirewallRules.equals(that._egressFirewallRules) : that._egressFirewallRules != null) - return false; - if (_floatingIpUuids != null ? !_floatingIpUuids.equals(that._floatingIpUuids) : that._floatingIpUuids != null) - return false; - if (_ingressFirewallRules != null ? !_ingressFirewallRules.equals(that._ingressFirewallRules) : that._ingressFirewallRules != null) - return false; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_network, that._network) + && Objects.equals(_dhcpOption, that._dhcpOption) + && Objects.equals(_floatingIpUuids, that._floatingIpUuids) + && Objects.equals(_ingressFirewallRules, that._ingressFirewallRules) + && Objects.equals(_egressFirewallRules, that._egressFirewallRules); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - result = 31 * result + (_dnsServers != null ? _dnsServers.hashCode() : 0); - result = 31 * result + (_ingressFirewallRules != null ? _ingressFirewallRules.hashCode() : 0); - result = 31 * result + (_egressFirewallRules != null ? _egressFirewallRules.hashCode() : 0); - result = 31 * result + (_floatingIpUuids != null ? _floatingIpUuids.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .append(_dhcpOption) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java index 6ad4ec6c401..77b22bc2af3 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java @@ -19,9 +19,12 @@ package com.cloud.agent.api.element; -import com.cloud.agent.api.Command; - import java.util.List; +import java.util.Objects; + +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; public class ShutDownVpcVspCommand extends Command { @@ -61,29 +64,30 @@ public class ShutDownVpcVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ShutDownVpcVspCommand)) return false; + if (this == o) { + return true; + } + if (!(o instanceof ShutDownVpcVspCommand)) { + return false; + } if (!super.equals(o)) return false; ShutDownVpcVspCommand that = (ShutDownVpcVspCommand) o; - if (_domainRouterUuids != null ? !_domainRouterUuids.equals(that._domainRouterUuids) : that._domainRouterUuids != null) - return false; - if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null) - return false; - if (_domainUuid != null ? !_domainUuid.equals(that._domainUuid) : that._domainUuid != null) return false; - if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_domainUuid, that._domainUuid) + && Objects.equals(_vpcUuid, that._vpcUuid) + && Objects.equals(_domainTemplateName, that._domainTemplateName) + && Objects.equals(_domainRouterUuids, that._domainRouterUuids); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_domainUuid != null ? _domainUuid.hashCode() : 0); - result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0); - result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0); - result = 31 * result + (_domainRouterUuids != null ? _domainRouterUuids.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_domainUuid) + .append(_vpcUuid) + .append(_domainTemplateName) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVspCommand.java new file mode 100644 index 00000000000..8406764adbf --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVspCommand.java @@ -0,0 +1,84 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.agent.api.element; + +import java.util.Objects; + +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; +import net.nuage.vsp.acs.client.api.model.VspNetwork; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.cloud.agent.api.Command; + +public class ShutDownVspCommand extends Command { + + private final VspNetwork _network; + private final VspDhcpDomainOption _dhcpOptions; + + public ShutDownVspCommand(VspNetwork network, VspDhcpDomainOption dhcpOptions) { + super(); + this._network = network; + this._dhcpOptions = dhcpOptions; + } + + public VspNetwork getNetwork() { + return _network; + } + + public VspDhcpDomainOption getDhcpOptions() { + return _dhcpOptions; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ShutDownVspCommand)) { + return false; + } + + ShutDownVspCommand that = (ShutDownVspCommand) o; + + return super.equals(that) + && Objects.equals(_dhcpOptions, that._dhcpOptions) + && Objects.equals(_network, that._network); + } + + + + @Override + public int hashCode() { + return Objects.hash(_network, _dhcpOptions); + } + + public String toDetailString() { + return new ToStringBuilder(this) + .append("network", _network) + .append("dhcpOptions", _dhcpOptions) + .toString(); + } +} diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java index 10dffccaccd..a122f039035 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java @@ -19,11 +19,16 @@ package com.cloud.agent.api.guru; -import com.cloud.agent.api.Command; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspNetwork; import net.nuage.vsp.acs.client.api.model.VspNic; import net.nuage.vsp.acs.client.api.model.VspVm; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; + public class DeallocateVmVspCommand extends Command { private final VspNetwork _network; @@ -56,25 +61,29 @@ public class DeallocateVmVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof DeallocateVmVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof DeallocateVmVspCommand)) { + return false; + } DeallocateVmVspCommand that = (DeallocateVmVspCommand) o; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - if (_nic != null ? !_nic.equals(that._nic) : that._nic != null) return false; - if (_vm != null ? !_vm.equals(that._vm) : that._vm != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_network, that._network) + && Objects.equals(_nic, that._nic) + && Objects.equals(_vm, that._vm); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - result = 31 * result + (_vm != null ? _vm.hashCode() : 0); - result = 31 * result + (_nic != null ? _nic.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .append(_vm) + .append(_nic) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java index bb3575690d2..5dc4ba7a5da 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java @@ -19,28 +19,33 @@ package com.cloud.agent.api.guru; -import com.cloud.agent.api.Command; +import java.util.Objects; + +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; import net.nuage.vsp.acs.client.api.model.VspNetwork; -import java.util.List; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.cloud.agent.api.Command; public class ImplementNetworkVspCommand extends Command { private final VspNetwork _network; - private final List _dnsServers; + private final VspDhcpDomainOption _dhcpOption; - public ImplementNetworkVspCommand(VspNetwork network, List dnsServers) { + public ImplementNetworkVspCommand(VspNetwork network, VspDhcpDomainOption dhcpOption) { super(); this._network = network; - this._dnsServers = dnsServers; + this._dhcpOption = dhcpOption; } public VspNetwork getNetwork() { return _network; } - public List getDnsServers() { - return _dnsServers; + public VspDhcpDomainOption getDhcpOption() { + return _dhcpOption; } @Override @@ -50,23 +55,34 @@ public class ImplementNetworkVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ImplementNetworkVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof ImplementNetworkVspCommand)) { + return false; + } ImplementNetworkVspCommand that = (ImplementNetworkVspCommand) o; - if (_dnsServers != null ? !_dnsServers.equals(that._dnsServers) : that._dnsServers != null) return false; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_dhcpOption, that._dhcpOption) + && Objects.equals(_network, that._network); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - result = 31 * result + (_dnsServers != null ? _dnsServers.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .append(_dhcpOption) + .toHashCode(); + } + + public String toDetailString() { + return new ToStringBuilder(this) + .append("network", _network) + .append("dhcpOption", _dhcpOption) + .toString(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java index 299b9a6ec73..910d4ac7bf6 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java @@ -19,25 +19,33 @@ package com.cloud.agent.api.guru; -import com.cloud.agent.api.Command; +import java.util.Objects; + +import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption; import net.nuage.vsp.acs.client.api.model.VspNetwork; import net.nuage.vsp.acs.client.api.model.VspNic; import net.nuage.vsp.acs.client.api.model.VspStaticNat; import net.nuage.vsp.acs.client.api.model.VspVm; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; + public class ReserveVmInterfaceVspCommand extends Command { private final VspNetwork _network; private final VspVm _vm; private final VspNic _nic; private final VspStaticNat _staticNat; + private final VspDhcpVMOption _dhcpOption; - public ReserveVmInterfaceVspCommand(VspNetwork network, VspVm vm, VspNic nic, VspStaticNat staticNat) { + public ReserveVmInterfaceVspCommand(VspNetwork network, VspVm vm, VspNic nic, VspStaticNat staticNat, VspDhcpVMOption dhcpOption) { super(); this._network = network; this._vm = vm; this._nic = nic; this._staticNat = staticNat; + this._dhcpOption = dhcpOption; } public VspNetwork getNetwork() { @@ -56,6 +64,10 @@ public class ReserveVmInterfaceVspCommand extends Command { return _staticNat; } + public VspDhcpVMOption getDhcpOption() { + return _dhcpOption; + } + @Override public boolean executeInSequence() { return false; @@ -63,27 +75,33 @@ public class ReserveVmInterfaceVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ReserveVmInterfaceVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof ReserveVmInterfaceVspCommand)) { + return false; + } ReserveVmInterfaceVspCommand that = (ReserveVmInterfaceVspCommand) o; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - if (_nic != null ? !_nic.equals(that._nic) : that._nic != null) return false; - if (_staticNat != null ? !_staticNat.equals(that._staticNat) : that._staticNat != null) return false; - if (_vm != null ? !_vm.equals(that._vm) : that._vm != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_network, that._network) + && Objects.equals(_nic, that._nic) + && Objects.equals(_dhcpOption, that._dhcpOption) + && Objects.equals(_staticNat, that._staticNat) + && Objects.equals(_vm, that._vm); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - result = 31 * result + (_vm != null ? _vm.hashCode() : 0); - result = 31 * result + (_nic != null ? _nic.hashCode() : 0); - result = 31 * result + (_staticNat != null ? _staticNat.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .append(_vm) + .append(_nic) + .append(_staticNat) + .append(_dhcpOption) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java index b3f8f8e012a..873b5c26fe0 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java @@ -19,9 +19,14 @@ package com.cloud.agent.api.guru; -import com.cloud.agent.api.Command; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspNetwork; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; + public class TrashNetworkVspCommand extends Command { private final VspNetwork _network; @@ -42,21 +47,25 @@ public class TrashNetworkVspCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof TrashNetworkVspCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof TrashNetworkVspCommand)) { + return false; + } TrashNetworkVspCommand that = (TrashNetworkVspCommand) o; - if (_network != null ? !_network.equals(that._network) : that._network != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_network, that._network); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_network != null ? _network.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/UpdateDhcpOptionVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/UpdateDhcpOptionVspCommand.java new file mode 100644 index 00000000000..c5ae11a21f3 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/UpdateDhcpOptionVspCommand.java @@ -0,0 +1,87 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.agent.api.guru; + +import java.util.List; +import java.util.Objects; + +import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption; +import net.nuage.vsp.acs.client.api.model.VspNetwork; + +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.cloud.agent.api.Command; + +public class UpdateDhcpOptionVspCommand extends Command { + + private final List _dhcpOptions; + private final VspNetwork _network; + + public UpdateDhcpOptionVspCommand(List dhcpOptions, VspNetwork network) { + this._dhcpOptions = dhcpOptions; + this._network = network; + } + + public List getDhcpOptions() { + return _dhcpOptions; + } + + public VspNetwork getNetwork() { + return _network; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof UpdateDhcpOptionVspCommand)) { + return false; + } + + UpdateDhcpOptionVspCommand that = (UpdateDhcpOptionVspCommand) o; + + return super.equals(that) + && Objects.equals(_network, that._network) + && Objects.equals(_dhcpOptions, that._dhcpOptions); + } + + @Override + public int hashCode() { + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_network) + .toHashCode(); + } + + public String toDetailString() { + return new ToStringBuilder(this) + .append("network", _network) + .append("dhcpOptions", _dhcpOptions) + .toString(); + } +} diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetApiDefaultsAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetApiDefaultsAnswer.java index c02eef1699f..e52b0e39b2d 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetApiDefaultsAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetApiDefaultsAnswer.java @@ -19,9 +19,14 @@ package com.cloud.agent.api.manager; -import com.cloud.agent.api.Answer; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspApiDefaults; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Answer; + public class GetApiDefaultsAnswer extends Answer { private VspApiDefaults _apiDefaults; @@ -41,21 +46,25 @@ public class GetApiDefaultsAnswer extends Answer { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof GetApiDefaultsAnswer)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof GetApiDefaultsAnswer)) { + return false; + } GetApiDefaultsAnswer that = (GetApiDefaultsAnswer) o; - if (_apiDefaults != null ? !_apiDefaults.equals(that._apiDefaults) : that._apiDefaults != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_apiDefaults, that._apiDefaults); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_apiDefaults != null ? _apiDefaults.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_apiDefaults) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java index 7a331d68013..6c57e852de9 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java @@ -19,6 +19,10 @@ package com.cloud.agent.api.manager; +import java.util.Objects; + +import org.apache.commons.lang.builder.HashCodeBuilder; + import com.cloud.agent.api.Command; public class SupportedApiVersionCommand extends Command { @@ -41,21 +45,26 @@ public class SupportedApiVersionCommand extends Command { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SupportedApiVersionCommand)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof SupportedApiVersionCommand)) { + return false; + } SupportedApiVersionCommand that = (SupportedApiVersionCommand) o; - if (_apiVersion != null ? !_apiVersion.equals(that._apiVersion) : that._apiVersion != null) return false; + return super.equals(that) + && Objects.equals(_apiVersion, that._apiVersion); - return true; } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_apiVersion != null ? _apiVersion.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_apiVersion) + .toHashCode(); } } \ No newline at end of file diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java index fd4822cfe66..26d8ad417cd 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java @@ -19,6 +19,8 @@ package com.cloud.agent.api.sync; +import org.apache.commons.lang.builder.HashCodeBuilder; + import com.cloud.agent.api.Answer; public class SyncDomainAnswer extends Answer { @@ -37,21 +39,26 @@ public class SyncDomainAnswer extends Answer { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SyncDomainAnswer)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof SyncDomainAnswer)) { + return false; + } SyncDomainAnswer that = (SyncDomainAnswer) o; - if (_success != that._success) return false; - - return true; + return super.equals(that) + && _success == that._success; } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_success ? 1 : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_success) + .toHashCode(); + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java index 90a30a4b3a4..024eaae7cca 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java @@ -19,32 +19,40 @@ package com.cloud.agent.api.sync; -import com.cloud.agent.api.Command; +import java.util.Objects; + import net.nuage.vsp.acs.client.api.model.VspDomain; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.cloud.agent.api.Command; + public class SyncDomainCommand extends Command { + public enum Type { ADD, REMOVE } private final VspDomain _domain; - private final boolean _toAdd; - private final boolean _toRemove; + private final Type _action; - public SyncDomainCommand(VspDomain domain, boolean toAdd, boolean toRemove) { + public SyncDomainCommand(VspDomain domain, Type action) { super(); this._domain = domain; - this._toAdd = toAdd; - this._toRemove = toRemove; + this._action = action; } public VspDomain getDomain() { return _domain; } + public Type getAction() { + return _action; + } + public boolean isToAdd() { - return _toAdd; + return Type.ADD.equals(_action); } public boolean isToRemove() { - return _toRemove; + return Type.REMOVE.equals(_action); } @Override @@ -60,19 +68,17 @@ public class SyncDomainCommand extends Command { SyncDomainCommand that = (SyncDomainCommand) o; - if (_toAdd != that._toAdd) return false; - if (_toRemove != that._toRemove) return false; - if (_domain != null ? !_domain.equals(that._domain) : that._domain != null) return false; - - return true; + return super.equals(that) + && Objects.equals(_action, that._action) + && Objects.equals(_domain, that._domain); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_domain != null ? _domain.hashCode() : 0); - result = 31 * result + (_toAdd ? 1 : 0); - result = 31 * result + (_toRemove ? 1 : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_domain) + .append(_action) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java index b0430e69158..289796fcc1c 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java @@ -19,6 +19,10 @@ package com.cloud.agent.api.sync; +import java.util.Objects; + +import org.apache.commons.lang.builder.HashCodeBuilder; + import com.cloud.agent.api.Answer; public class SyncNuageVspCmsIdAnswer extends Answer { @@ -48,26 +52,29 @@ public class SyncNuageVspCmsIdAnswer extends Answer { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SyncNuageVspCmsIdAnswer)) return false; - if (!super.equals(o)) return false; + if (this == o) { + return true; + } + + if (!(o instanceof SyncNuageVspCmsIdAnswer)) { + return false; + } SyncNuageVspCmsIdAnswer that = (SyncNuageVspCmsIdAnswer) o; - if (_success != that._success) return false; - if (_nuageVspCmsId != null ? !_nuageVspCmsId.equals(that._nuageVspCmsId) : that._nuageVspCmsId != null) - return false; - if (_syncType != that._syncType) return false; - - return true; + return super.equals(that) + && _success == that._success + && Objects.equals(_syncType, that._syncType) + && Objects.equals(_nuageVspCmsId, that._nuageVspCmsId); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_success ? 1 : 0); - result = 31 * result + (_nuageVspCmsId != null ? _nuageVspCmsId.hashCode() : 0); - result = 31 * result + (_syncType != null ? _syncType.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_syncType) + .append(_nuageVspCmsId) + .append(_success) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java index 48651ff4b33..40a0a455b45 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java @@ -19,6 +19,10 @@ package com.cloud.agent.api.sync; +import java.util.Objects; + +import org.apache.commons.lang.builder.HashCodeBuilder; + import com.cloud.agent.api.Command; public class SyncNuageVspCmsIdCommand extends Command { @@ -55,18 +59,17 @@ public class SyncNuageVspCmsIdCommand extends Command { SyncNuageVspCmsIdCommand that = (SyncNuageVspCmsIdCommand) o; - if (_nuageVspCmsId != null ? !_nuageVspCmsId.equals(that._nuageVspCmsId) : that._nuageVspCmsId != null) - return false; - if (_syncType != that._syncType) return false; - - return true; + return super.equals(that) + && Objects.equals(_syncType, that._syncType) + && Objects.equals(_nuageVspCmsId, that._nuageVspCmsId); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (_syncType != null ? _syncType.hashCode() : 0); - result = 31 * result + (_nuageVspCmsId != null ? _nuageVspCmsId.hashCode() : 0); - return result; + return new HashCodeBuilder() + .appendSuper(super.hashCode()) + .append(_syncType) + .append(_nuageVspCmsId) + .toHashCode(); } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java index 1f36ae0c3d3..aae16b89af6 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java @@ -19,6 +19,31 @@ package com.cloud.network.element; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.log4j.Logger; +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +import net.nuage.vsp.acs.client.api.model.VspAclRule; +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; +import net.nuage.vsp.acs.client.api.model.VspNetwork; +import net.nuage.vsp.acs.client.api.model.VspStaticNat; + +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.network.ExternalNetworkDeviceManager; +import org.apache.cloudstack.network.topology.NetworkTopologyContext; +import org.apache.cloudstack.resourcedetail.VpcDetailVO; +import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.StartupCommand; @@ -27,6 +52,7 @@ import com.cloud.agent.api.element.ApplyAclRuleVspCommand; import com.cloud.agent.api.element.ApplyStaticNatVspCommand; import com.cloud.agent.api.element.ImplementVspCommand; import com.cloud.agent.api.element.ShutDownVpcVspCommand; +import com.cloud.agent.api.element.ShutDownVspCommand; import com.cloud.dc.VlanVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; @@ -60,6 +86,7 @@ import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.manager.NuageVspManager; import com.cloud.network.manager.NuageVspManagerImpl; +import com.cloud.network.router.VpcVirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.FirewallRuleType; import com.cloud.network.rules.FirewallRuleVO; @@ -74,12 +101,14 @@ import com.cloud.network.vpc.VpcOfferingServiceMapVO; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; +import com.cloud.util.NuageVspEntityBuilder; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DomainRouterVO; @@ -89,28 +118,6 @@ import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import com.cloud.util.NuageVspEntityBuilder; -import net.nuage.vsp.acs.client.api.model.VspAclRule; -import net.nuage.vsp.acs.client.api.model.VspNetwork; -import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import org.apache.cloudstack.api.InternalIdentity; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.network.ExternalNetworkDeviceManager; -import org.apache.cloudstack.resourcedetail.VpcDetailVO; -import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; -import org.apache.commons.collections.CollectionUtils; -import org.apache.log4j.Logger; - -import javax.annotation.Nullable; -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; public class NuageVspElement extends AdapterBase implements ConnectivityProvider, IpDeployer, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider, DhcpServiceProvider, ResourceStateAdapter, VpcProvider, NetworkACLServiceProvider { @@ -169,8 +176,16 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider NuageVspEntityBuilder _nuageVspEntityBuilder; @Inject VpcDetailsDao _vpcDetailsDao; + + @Inject + NetworkModel _networkMgr; + @Inject + NetworkTopologyContext networkTopologyContext; @Inject DomainRouterDao _routerDao; + @Inject + VpcVirtualNetworkApplianceManager _routerMgr; + @Override public boolean applyIps(Network network, List ipAddress, Set service) throws ResourceUnavailableException { @@ -257,8 +272,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider } - VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network, false); - List dnsServers = _nuageVspManager.getDnsDetails(network); + VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network, true); List ingressFirewallRules = getFirewallRulesToApply(network, FirewallRule.TrafficType.Ingress); List egressFirewallRules = getFirewallRulesToApply(network, FirewallRule.TrafficType.Egress); @@ -267,9 +281,9 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider for (IPAddressVO ip : ips) { floatingIpUuids.add(ip.getUuid()); } - + VspDhcpDomainOption vspDhcpOptions = _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering); HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - ImplementVspCommand cmd = new ImplementVspCommand(vspNetwork, dnsServers, ingressFirewallRules, egressFirewallRules, floatingIpUuids); + ImplementVspCommand cmd = new ImplementVspCommand(vspNetwork, ingressFirewallRules, egressFirewallRules, floatingIpUuids, vspDhcpOptions); Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd); if (answer == null || !answer.getResult()) { s_logger.error("ImplementVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname")); @@ -277,7 +291,6 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId()); } } - return true; } @@ -335,7 +348,21 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider if (!canHandle(network, Service.Connectivity)) { return false; } - + if (cleanup && isDnsSupportedByVR(network)) { + // The network is restarted, possibly the domain name is changed, update the dhcpOptions as soon as possible + NetworkOfferingVO networkOfferingVO = _ntwkOfferingDao.findById(network.getNetworkOfferingId()); + VspDhcpDomainOption vspDhcpOptions = _nuageVspEntityBuilder.buildNetworkDhcpOption(network, networkOfferingVO); + VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network, false); + HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); + ShutDownVspCommand cmd = new ShutDownVspCommand(vspNetwork, vspDhcpOptions); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd); + if (answer == null || !answer.getResult()) { + s_logger.error("ShutDownVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname")); + if ((null != answer) && (null != answer.getDetails())) { + throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId()); + } + } + } return true; } @@ -436,11 +463,18 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider return true; } + private boolean isDnsSupportedByVR(Network network) { + return (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dns) && + ( _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, Provider.VirtualRouter) || + _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, Provider.VPCVirtualRouter))); + } + @Override public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException { return true; } + @Override public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { List vspStaticNatDetails = new ArrayList(); diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java index a6c17e3517f..aedf646ae1e 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java @@ -19,12 +19,33 @@ package com.cloud.network.guru; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption; +import net.nuage.vsp.acs.client.api.model.VspNetwork; +import net.nuage.vsp.acs.client.api.model.VspNic; +import net.nuage.vsp.acs.client.api.model.VspStaticNat; +import net.nuage.vsp.acs.client.api.model.VspVm; + +import org.apache.log4j.Logger; + +import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import org.apache.cloudstack.resourcedetail.VpcDetailVO; +import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; + import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.guru.DeallocateVmVspCommand; import com.cloud.agent.api.guru.ImplementNetworkVspCommand; import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; import com.cloud.agent.api.guru.TrashNetworkVspCommand; +import com.cloud.agent.api.guru.UpdateDhcpOptionVspCommand; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; @@ -59,25 +80,17 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.user.dao.AccountDao; +import com.cloud.util.NuageVspEntityBuilder; import com.cloud.utils.StringUtils; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import com.google.common.base.Strings; -import com.cloud.util.NuageVspEntityBuilder; -import net.nuage.vsp.acs.client.api.model.VspNetwork; -import net.nuage.vsp.acs.client.api.model.VspNic; -import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import net.nuage.vsp.acs.client.api.model.VspVm; -import org.apache.cloudstack.resourcedetail.VpcDetailVO; -import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; -import org.apache.log4j.Logger; - -import javax.inject.Inject; -import java.util.List; +import com.cloud.vm.dao.VMInstanceDao; public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { public static final Logger s_logger = Logger.getLogger(NuageVspGuestNetworkGuru.class); @@ -97,6 +110,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { @Inject VpcDao _vpcDao; @Inject + VMInstanceDao _vmInstanceDao; + @Inject AgentManager _agentMgr; @Inject NuageVspManager _nuageVspManager; @@ -184,8 +199,7 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { implemented.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp); HostVO nuageVspHost = getNuageVspHost(physicalNetworkId); - List dnsServers = _nuageVspManager.getDnsDetails(network); - ImplementNetworkVspCommand cmd = new ImplementNetworkVspCommand(vspNetwork, dnsServers); + ImplementNetworkVspCommand cmd = new ImplementNetworkVspCommand(vspNetwork, _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering)); Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd); if (answer == null || !answer.getResult()) { @@ -242,6 +256,20 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { throw new IllegalStateException("The broadcast URI path " + network.getBroadcastUri() + " is empty or in an incorrect format."); } + HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); + VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network, false); + + // Set flags for dhcp options + boolean networkHasDns = networkHasDns(network); + + Map networkHasDnsCache = Maps.newHashMap(); + networkHasDnsCache.put(network.getId(), networkHasDns); + + // Determine if dhcp options of the other nics in the network need to be updated + if (vm.getType() == VirtualMachine.Type.DomainRouter && network.getState() != State.Implementing) { + updateDhcpOptionsForExistingVms(network, nuageVspHost, vspNetwork, networkHasDns, networkHasDnsCache); + } + nic.setBroadcastUri(network.getBroadcastUri()); nic.setIsolationUri(network.getBroadcastUri()); @@ -250,7 +278,6 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { NicVO nicFromDb = _nicDao.findById(nic.getId()); IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(network.getId(), vm.getId()); - VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network, false); VspVm vspVm = _nuageVspEntityBuilder.buildVspVm(vm.getVirtualMachine(), network); VspNic vspNic = _nuageVspEntityBuilder.buildVspNic(nicFromDb.getUuid(), nic); VspStaticNat vspStaticNat = null; @@ -259,8 +286,9 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, null); } - HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat); + boolean defaultHasDns = getDefaultHasDns(networkHasDnsCache, nicFromDb); + VspDhcpVMOption dhcpOption = _nuageVspEntityBuilder.buildVmDhcpOption(nicFromDb, defaultHasDns, networkHasDns); + ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat, dhcpOption); Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd); if (answer == null || !answer.getResult()) { @@ -285,6 +313,34 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { } } + private void updateDhcpOptionsForExistingVms(Network network, HostVO nuageVspHost, VspNetwork vspNetwork, boolean networkHasDns, Map networkHasDnsCache) + throws InsufficientVirtualNetworkCapacityException { + // Update dhcp options if a VR is added when we are not initiating the network + if(s_logger.isDebugEnabled()) { + s_logger.debug(String.format("DomainRouter is added to an existing network: %s in state: %s", network.getName(), network.getState())); + } + List dhcpOptions = Lists.newLinkedList(); + for (NicVO userNic :_nicDao.listByNetworkId(network.getId())) { + if (userNic.getVmType() != VirtualMachine.Type.DomainRouter) { + boolean defaultHasDns = getDefaultHasDns(networkHasDnsCache, userNic); + dhcpOptions.add(_nuageVspEntityBuilder.buildVmDhcpOption(userNic, defaultHasDns, networkHasDns)); + } + } + + if (!dhcpOptions.isEmpty()) { + UpdateDhcpOptionVspCommand cmd = new UpdateDhcpOptionVspCommand(dhcpOptions, vspNetwork); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd); + + if (answer == null || !answer.getResult()) { + s_logger.error("UpdateDhcpOptionVspCommand failed at \"reserve\" for network " + vspNetwork.getName()); + if ((null != answer) && (null != answer.getDetails())) { + s_logger.error(answer.getDetails()); + } + throw new InsufficientVirtualNetworkCapacityException("Failed to reserve VM in Nuage VSP.", Network.class, network.getId()); + } + } + } + @Override protected boolean canHandle(NetworkOffering offering, final NetworkType networkType, final PhysicalNetwork physicalNetwork) { if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && (offering.getGuestType() == Network.GuestType.Isolated || offering.getGuestType() == Network.GuestType.Shared) @@ -403,4 +459,39 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { } return nuageVspHost; } + + private boolean networkHasDns(Network network) { + + if (network != null) { + List dnsProviders = _ntwkOfferingSrvcDao.listProvidersForServiceForNetworkOffering(network.getNetworkOfferingId(), Network.Service.Dns); + return dnsProviders.contains(Network.Provider.VirtualRouter.getName()) + || dnsProviders.contains(Network.Provider.VPCVirtualRouter.getName()); + + } + + return false; + } + + private boolean getDefaultHasDns(Map cache, Nic nic) { + Long networkId = nic.isDefaultNic() + ? Long.valueOf(nic.getNetworkId()) + : getDefaultNetwork(nic.getInstanceId()); + + Boolean hasDns = cache.get(networkId); + if (hasDns == null) { + hasDns = networkHasDns(_networkDao.findById(networkId)); + cache.put(networkId, hasDns); + } + return hasDns; + } + + private Long getDefaultNetwork(long vmId) { + NicVO defaultNic = _nicDao.findDefaultNicForVM(vmId); + if (defaultNic != null) { + return defaultNic.getNetworkId(); + } + return null; + } + + } \ No newline at end of file diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java index 04b1ccc9f94..b82b194be2d 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java @@ -191,7 +191,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, static { Set nuageVspProviders = ImmutableSet.of(Network.Provider.NuageVsp); - Set userDataProviders = ImmutableSet.of(Network.Provider.VPCVirtualRouter); + Set vrProviders = ImmutableSet.of(Network.Provider.VPCVirtualRouter); Set lbProviders = ImmutableSet.of(Network.Provider.InternalLbVm); NUAGE_VSP_VPC_SERVICE_MAP = ImmutableMap.>builder() .put(Network.Service.Connectivity, nuageVspProviders) @@ -200,8 +200,9 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, .put(Network.Service.StaticNat, nuageVspProviders) .put(Network.Service.SourceNat, nuageVspProviders) .put(Network.Service.NetworkACL, nuageVspProviders) - .put(Network.Service.UserData, userDataProviders) + .put(Network.Service.UserData, vrProviders) .put(Network.Service.Lb, lbProviders) + .put(Network.Service.Dns, vrProviders) .build(); } @@ -304,7 +305,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, resource.configure(cmd.getHostName(), Maps.newHashMap(resourceConfiguration.build())); if (matchingNuageVspDevice == null) { - auditDomainsOnVsp((HostVO) host, true, false); + auditDomainsOnVsp((HostVO) host, true); } return nuageVspDevice; @@ -486,7 +487,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, HostVO host = findNuageVspHost(nuageVspDevice.getHostId()); String nuageVspCmsId = findNuageVspCmsIdForDevice(nuageVspDevice.getId(), cmsIdConfig); if (matchingNuageVspDevice == null) { - if (!auditDomainsOnVsp(host, false, true)) { + if (!auditDomainsOnVsp(host, false)) { return false; } @@ -603,11 +604,11 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, } if (validateDomains) { - auditDomainsOnVsp(host, true, false); + auditDomainsOnVsp(host, true); } } - private boolean auditDomainsOnVsp(HostVO host, boolean add, boolean remove) { + private boolean auditDomainsOnVsp(HostVO host, boolean add) { List nuageVspDevices = _nuageVspDao.listByHost(host.getId()); if (CollectionUtils.isEmpty(nuageVspDevices)) { return true; @@ -617,7 +618,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, List allDomains = _domainDao.listAll(); for (DomainVO domain : allDomains) { VspDomain vspDomain = _nuageVspEntityBuilder.buildVspDomain(domain); - SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, add, remove); + SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, add ? SyncDomainCommand.Type.ADD : SyncDomainCommand.Type.REMOVE); SyncDomainAnswer answer = (SyncDomainAnswer) _agentMgr.easySend(host.getId(), cmd); return answer.getSuccess(); } @@ -714,10 +715,9 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, List nuageVspDevices = _nuageVspDao.listAll(); for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) { - HostVO host = findNuageVspHost(nuageVspDevice.getHostId()); VspDomain vspDomain = _nuageVspEntityBuilder.buildVspDomain(domain); - SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, true, false); - _agentMgr.easySend(host.getId(), cmd); + SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, SyncDomainCommand.Type.ADD); + _agentMgr.easySend(nuageVspDevice.getHostId(), cmd); } } finally { _domainDao.releaseFromLockTable(domain.getId()); @@ -732,10 +732,9 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, DomainVO domain = (DomainVO) args; List nuageVspDevices = _nuageVspDao.listAll(); for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) { - HostVO host = findNuageVspHost(nuageVspDevice.getHostId()); VspDomain vspDomain = _nuageVspEntityBuilder.buildVspDomain(domain); - SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, false, true); - _agentMgr.easySend(host.getId(), cmd); + SyncDomainCommand cmd = new SyncDomainCommand(vspDomain, SyncDomainCommand.Type.REMOVE); + _agentMgr.easySend(nuageVspDevice.getHostId(), cmd); } } }); diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java index bdcb481a013..5cb6683c2b5 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java @@ -19,6 +19,24 @@ package com.cloud.network.resource; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.regex.Pattern; + +import javax.naming.ConfigurationException; + +import net.nuage.vsp.acs.NuageVspPluginClientLoader; +import net.nuage.vsp.acs.client.api.NuageVspApiClient; +import net.nuage.vsp.acs.client.api.NuageVspElementClient; +import net.nuage.vsp.acs.client.api.NuageVspGuruClient; +import net.nuage.vsp.acs.client.api.NuageVspManagerClient; +import net.nuage.vsp.acs.client.common.model.Pair; + +import org.apache.log4j.Logger; + +import com.google.common.base.Strings; + import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; @@ -34,10 +52,12 @@ import com.cloud.agent.api.element.ApplyAclRuleVspCommand; import com.cloud.agent.api.element.ApplyStaticNatVspCommand; import com.cloud.agent.api.element.ImplementVspCommand; import com.cloud.agent.api.element.ShutDownVpcVspCommand; +import com.cloud.agent.api.element.ShutDownVspCommand; import com.cloud.agent.api.guru.DeallocateVmVspCommand; import com.cloud.agent.api.guru.ImplementNetworkVspCommand; import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; import com.cloud.agent.api.guru.TrashNetworkVspCommand; +import com.cloud.agent.api.guru.UpdateDhcpOptionVspCommand; import com.cloud.agent.api.manager.GetApiDefaultsAnswer; import com.cloud.agent.api.manager.GetApiDefaultsCommand; import com.cloud.agent.api.manager.SupportedApiVersionCommand; @@ -51,20 +71,6 @@ import com.cloud.util.NuageVspUtil; import com.cloud.utils.StringUtils; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.exception.CloudRuntimeException; -import com.google.common.base.Strings; -import net.nuage.vsp.acs.NuageVspPluginClientLoader; -import net.nuage.vsp.acs.client.api.NuageVspApiClient; -import net.nuage.vsp.acs.client.api.NuageVspElementClient; -import net.nuage.vsp.acs.client.api.NuageVspGuruClient; -import net.nuage.vsp.acs.client.api.NuageVspManagerClient; -import net.nuage.vsp.acs.client.common.model.Pair; -import org.apache.log4j.Logger; - -import javax.naming.ConfigurationException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.regex.Pattern; import static com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand.SyncType; @@ -291,6 +297,8 @@ public class NuageVspResource extends ManagerBase implements ServerResource { return executeRequest((DeallocateVmVspCommand)cmd); } else if (cmd instanceof TrashNetworkVspCommand) { return executeRequest((TrashNetworkVspCommand)cmd); + } else if (cmd instanceof UpdateDhcpOptionVspCommand) { + return executeRequest((UpdateDhcpOptionVspCommand)cmd); } //Element commands else if (cmd instanceof ImplementVspCommand) { @@ -301,6 +309,8 @@ public class NuageVspResource extends ManagerBase implements ServerResource { return executeRequest((ApplyStaticNatVspCommand)cmd); } else if (cmd instanceof ShutDownVpcVspCommand) { return executeRequest((ShutDownVpcVspCommand)cmd); + } else if (cmd instanceof ShutDownVspCommand) { + return executeRequest((ShutDownVspCommand)cmd); } //Sync Commands else if (cmd instanceof SyncNuageVspCmsIdCommand) { @@ -344,10 +354,10 @@ public class NuageVspResource extends ManagerBase implements ServerResource { private Answer executeRequest(ImplementNetworkVspCommand cmd) { try { isNuageVspGuruLoaded(); - _nuageVspGuruClient.implement(cmd.getNetwork(), cmd.getDnsServers()); + _nuageVspGuruClient.implement(cmd.getNetwork(), cmd.getDhcpOption()); return new Answer(cmd, true, "Created network mapping to " + cmd.getNetwork().getName() + " on Nuage VSD " + _hostName); } catch (ExecutionException | ConfigurationException e) { - s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + s_logger.error("Failure during " + cmd.toDetailString() + " on Nuage VSD " + _hostName, e); return new Answer(cmd, e); } } @@ -355,7 +365,7 @@ public class NuageVspResource extends ManagerBase implements ServerResource { private Answer executeRequest(ReserveVmInterfaceVspCommand cmd) { try { isNuageVspGuruLoaded(); - _nuageVspGuruClient.reserve(cmd.getNetwork(), cmd.getVm(), cmd.getNic(), cmd.getStaticNat()); + _nuageVspGuruClient.reserve(cmd.getNetwork(), cmd.getVm(), cmd.getNic(), cmd.getStaticNat(), cmd.getDhcpOption()); return new Answer(cmd, true, "Created NIC that maps to nicUuid" + cmd.getNic().getUuid() + " on Nuage VSD " + _hostName); } catch (ExecutionException | ConfigurationException e) { s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); @@ -386,6 +396,17 @@ public class NuageVspResource extends ManagerBase implements ServerResource { } } + private Answer executeRequest(UpdateDhcpOptionVspCommand cmd) { + try { + isNuageVspManagerLoaded(); + _nuageVspGuruClient.applyDhcpOptions(cmd.getDhcpOptions(), cmd.getNetwork()); + return new Answer(cmd, true, "Update DhcpOptions on VM's in network: " + cmd.getNetwork().getName() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd.toDetailString() + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); + } + } + private Answer executeRequest(ApplyStaticNatVspCommand cmd) { try { isNuageVspElementLoaded(); @@ -400,7 +421,7 @@ public class NuageVspResource extends ManagerBase implements ServerResource { private Answer executeRequest(ImplementVspCommand cmd) { try { isNuageVspElementLoaded(); - boolean success = _nuageVspElementClient.implement(cmd.getNetwork(), cmd.getDnsServers(), cmd.getIngressFirewallRules(), + boolean success = _nuageVspElementClient.implement(cmd.getNetwork(), cmd.getDhcpOption(), cmd.getIngressFirewallRules(), cmd.getEgressFirewallRules(), cmd.getFloatingIpUuids()); return new Answer(cmd, success, "Implemented network " + cmd.getNetwork().getUuid() + " on Nuage VSD " + _hostName); } catch (ExecutionException | ConfigurationException e) { @@ -431,6 +452,17 @@ public class NuageVspResource extends ManagerBase implements ServerResource { } } + private Answer executeRequest(ShutDownVspCommand cmd) { + try { + isNuageVspElementLoaded(); + _nuageVspElementClient.shutdownNetwork(cmd.getNetwork(), cmd.getDhcpOptions()); + return new Answer(cmd, true, "Shutdown VPC " + cmd.getNetwork().getUuid()+ " on Nuage VSD " + _hostName); + } catch (ConfigurationException e) { + s_logger.error("Failure during " + cmd.toDetailString() + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); + } + } + private Answer executeRequest(SyncNuageVspCmsIdCommand cmd) { try { isNuageVspManagerLoaded(); diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java index 8757ad02120..6b0e26ebec2 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java @@ -30,10 +30,12 @@ import com.cloud.network.NetworkModel; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.manager.NuageVspManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.VpcVO; import com.cloud.network.vpc.dao.VpcDao; +import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; @@ -43,10 +45,14 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; +import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; +import com.cloud.vm.dao.VMInstanceDao; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import net.nuage.vsp.acs.client.api.model.VspAclRule; +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; +import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption; import net.nuage.vsp.acs.client.api.model.VspDomain; import net.nuage.vsp.acs.client.api.model.VspNetwork; import net.nuage.vsp.acs.client.api.model.VspNic; @@ -87,6 +93,13 @@ public class NuageVspEntityBuilder { IPAddressDao _ipAddressDao; @Inject NetworkDetailsDao _networkDetailsDao; + @Inject + VMInstanceDao _vmInstanceDao; + @Inject + NuageVspManager _nuageVspManager; + @Inject + NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao; + public VspDomain buildVspDomain(Domain domain) { return new VspDomain.Builder() @@ -367,4 +380,32 @@ public class NuageVspEntityBuilder { return vspAclRuleBuilder.build(); } + + /** Build VspDhcpVMOption to put on the VM interface */ + public VspDhcpVMOption buildVmDhcpOption (NicVO userNic, boolean defaultHasDns, boolean networkHasDns) { + VMInstanceVO userVm = _vmInstanceDao.findById(userNic.getInstanceId()); + VspDhcpVMOption.Builder vspDhcpVMOptionBuilder = new VspDhcpVMOption.Builder() + .nicUuid(userNic.getUuid()) + .defaultHasDns(defaultHasDns) + .hostname(userVm.getHostName()) + .networkHasDns(networkHasDns) + .isDefaultInterface(userNic.isDefaultNic()) + .domainRouter(VirtualMachine.Type.DomainRouter.equals(userNic.getVmType())); + return vspDhcpVMOptionBuilder.build(); + } + + /** Build VspDhcpVMOption to put on the subnet */ + public VspDhcpDomainOption buildNetworkDhcpOption(Network network, NetworkOffering offering) { + List dnsProvider = _ntwkOfferingSrvcDao.listProvidersForServiceForNetworkOffering(offering.getId(), Network.Service.Dns); + boolean isVrDnsProvider = dnsProvider.contains("VirtualRouter") || dnsProvider.contains("VpcVirtualRouter"); + VspDhcpDomainOption.Builder vspDhcpDomainBuilder = new VspDhcpDomainOption.Builder() + .dnsServers(_nuageVspManager.getDnsDetails(network)) + .vrIsDnsProvider(isVrDnsProvider); + + if (isVrDnsProvider) { + vspDhcpDomainBuilder.networkDomain(network.getVpcId() != null ? _vpcDao.findById(network.getVpcId()).getNetworkDomain() : network.getNetworkDomain()); + } + + return vspDhcpDomainBuilder.build(); + } } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/NuageTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/NuageTest.java index 845a8be04f9..6522d2b39e5 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/NuageTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/NuageTest.java @@ -19,6 +19,26 @@ package com.cloud; +import java.util.ArrayList; + +import net.nuage.vsp.acs.client.api.model.VspAclRule; +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; +import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption; +import net.nuage.vsp.acs.client.api.model.VspDomain; +import net.nuage.vsp.acs.client.api.model.VspNetwork; +import net.nuage.vsp.acs.client.api.model.VspNic; +import net.nuage.vsp.acs.client.api.model.VspStaticNat; +import net.nuage.vsp.acs.client.api.model.VspVm; +import net.nuage.vsp.acs.client.common.model.Pair; + +import org.junit.Before; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.google.common.collect.Lists; + +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; + import com.cloud.dc.VlanVO; import com.cloud.domain.Domain; import com.cloud.network.Network; @@ -30,17 +50,6 @@ import com.cloud.util.NuageVspEntityBuilder; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.VirtualMachine; -import net.nuage.vsp.acs.client.api.model.VspAclRule; -import net.nuage.vsp.acs.client.api.model.VspDomain; -import net.nuage.vsp.acs.client.api.model.VspNetwork; -import net.nuage.vsp.acs.client.api.model.VspNic; -import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import net.nuage.vsp.acs.client.api.model.VspVm; -import net.nuage.vsp.acs.client.common.model.Pair; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.junit.Before; - -import java.util.ArrayList; import static com.cloud.network.manager.NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName; import static com.cloud.network.manager.NuageVspManager.NuageVspSharedNetworkDomainTemplateName; @@ -48,18 +57,20 @@ import static com.cloud.network.manager.NuageVspManager.NuageVspVpcDomainTemplat import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class NuageTest { protected static final long NETWORK_ID = 42L; - protected NetworkModel _networkModel = mock(NetworkModel.class); - protected ConfigurationDao _configurationDao = mock(ConfigurationDao.class); - protected NuageVspEntityBuilder _nuageVspEntityBuilder = mock(NuageVspEntityBuilder.class); + + @Mock protected NetworkModel _networkModel; + @Mock protected ConfigurationDao _configurationDao; + @Mock protected NuageVspEntityBuilder _nuageVspEntityBuilder; @Before public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + // Standard responses when(_networkModel.isProviderForNetwork(Network.Provider.NuageVsp, NETWORK_ID)).thenReturn(true); when(_configurationDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate"); @@ -154,4 +165,23 @@ public class NuageTest { .build(); } + protected VspDhcpDomainOption buildspDhcpDomainOption () { + return new VspDhcpDomainOption.Builder() + .vrIsDnsProvider(true) + .networkDomain("networkDomain") + .dnsServers(Lists.newArrayList("10.10.10.10", "20.20.20.20")) + .build(); + } + + protected VspDhcpVMOption buildspDhcpVMOption () { + return new VspDhcpVMOption.Builder() + .defaultHasDns(true) + .hostname("VMx") + .networkHasDns(true) + .isDefaultInterface(true) + .domainRouter(false) + .nicUuid("aaaa-bbbbbbbb-ccccccc") + .build(); + } + } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java index 85cbb361c9a..929aba71993 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java @@ -19,6 +19,23 @@ package com.cloud.network.element; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import com.google.common.collect.Lists; + +import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; + import com.cloud.NuageTest; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -63,18 +80,6 @@ import com.cloud.util.NuageVspEntityBuilder; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.dao.DomainRouterDao; -import com.google.common.collect.Lists; -import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; -import org.junit.Before; -import org.junit.Test; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -85,45 +90,29 @@ import static org.mockito.Mockito.when; public class NuageVspElementTest extends NuageTest { + @InjectMocks private NuageVspElement _nuageVspElement = new NuageVspElement(); - private NetworkServiceMapDao _networkServiceMapDao = mock(NetworkServiceMapDao.class); - private AgentManager _agentManager = mock(AgentManager.class); - private HostDao _hostDao = mock(HostDao.class); - private NuageVspDao _nuageVspDao = mock(NuageVspDao.class); - private DomainDao _domainDao = mock(DomainDao.class); - private NetworkOfferingDao _networkOfferingDao = mock(NetworkOfferingDao.class); - private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao = mock(NetworkOfferingServiceMapDao.class); - private NuageVspManager _nuageVspManager = mock(NuageVspManager.class); - private FirewallRulesDao _firewallRulesDao = mock(FirewallRulesDao.class); - private IPAddressDao _ipAddressDao = mock(IPAddressDao.class); - private PhysicalNetworkDao _physicalNetworkDao = mock(PhysicalNetworkDao.class); - private NuageVspEntityBuilder _nuageVspEntityBuilder = mock(NuageVspEntityBuilder.class); - private VpcDetailsDao _vpcDetailsDao = mock(VpcDetailsDao.class); - private DomainRouterDao _domainRouterDao = mock(DomainRouterDao.class); + @Mock private NetworkServiceMapDao _networkServiceMapDao; + @Mock private AgentManager _agentManager; + @Mock private HostDao _hostDao; + @Mock private NuageVspDao _nuageVspDao; + @Mock private DomainDao _domainDao; + @Mock private NetworkOfferingDao _networkOfferingDao; + @Mock private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao; + @Mock private NuageVspManager _nuageVspManager; + @Mock private FirewallRulesDao _firewallRulesDao; + @Mock private IPAddressDao _ipAddressDao; + @Mock private PhysicalNetworkDao _physicalNetworkDao; + @Mock private NuageVspEntityBuilder _nuageVspEntityBuilder; + @Mock private VpcDetailsDao _vpcDetailsDao; + @Mock private DomainRouterDao _domainRouterDao; + @Mock private ResourceManager _resourceManager; @Before public void setUp() throws Exception { super.setUp(); - - _nuageVspElement._resourceMgr = mock(ResourceManager.class); - _nuageVspElement._ntwkSrvcDao = _networkServiceMapDao; - _nuageVspElement._networkModel = _networkModel; - _nuageVspElement._agentMgr = _agentManager; - _nuageVspElement._hostDao = _hostDao; - _nuageVspElement._nuageVspDao = _nuageVspDao; - _nuageVspElement._ntwkOfferingSrvcDao = _networkOfferingServiceMapDao; - _nuageVspElement._domainDao = _domainDao; - _nuageVspElement._ntwkOfferingDao = _networkOfferingDao; - _nuageVspElement._configDao = _configurationDao; - _nuageVspElement._nuageVspManager = _nuageVspManager; - _nuageVspElement._firewallRulesDao = _firewallRulesDao; - _nuageVspElement._ipAddressDao = _ipAddressDao; - _nuageVspElement._physicalNetworkDao = _physicalNetworkDao; _nuageVspElement._nuageVspEntityBuilder = _nuageVspEntityBuilder; - _nuageVspElement._vpcDetailsDao = _vpcDetailsDao; - _nuageVspElement._routerDao = _domainRouterDao; - _nuageVspElement.configure("NuageVspTestElement", Collections.emptyMap()); } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java index f101e1e1a27..d0de4475cb1 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java @@ -19,6 +19,19 @@ package com.cloud.network.guru; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; + import com.cloud.NuageTest; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -66,21 +79,15 @@ import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.NicDao; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.junit.Before; -import org.junit.Test; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import static com.cloud.network.manager.NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName; import static com.cloud.network.manager.NuageVspManager.NuageVspSharedNetworkDomainTemplateName; import static com.cloud.network.manager.NuageVspManager.NuageVspVpcDomainTemplateName; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; @@ -89,49 +96,35 @@ import static org.mockito.Mockito.when; public class NuageVspGuestNetworkGuruTest extends NuageTest { private static final long NETWORK_ID = 42L; - private PhysicalNetworkDao _physicalNetworkDao = mock(PhysicalNetworkDao.class); - private DataCenterDao _dataCenterDao = mock(DataCenterDao.class); - private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao = mock(NetworkOfferingServiceMapDao.class); - private AgentManager _agentManager = mock(AgentManager.class); - private NetworkModel _networkModel = mock(NetworkModel.class); - private AccountDao _accountDao = mock(AccountDao.class); - private DomainDao _domainDao = mock(DomainDao.class); - private NicDao _nicDao = mock(NicDao.class); - private NetworkOfferingDao _networkOfferingDao = mock(NetworkOfferingDao.class); - private NuageVspDao _nuageVspDao = mock(NuageVspDao.class); - private HostDao _hostDao = mock(HostDao.class); - private NetworkDao _networkDao = mock(NetworkDao.class); - private ConfigurationDao _configurationDao = mock(ConfigurationDao.class); - private IPAddressDao _ipAddressDao = mock(IPAddressDao.class); - private NuageVspManager _nuageVspManager = mock(NuageVspManager.class); - private ConfigurationManager _configurationManager = mock(ConfigurationManager.class); - private NetworkDetailsDao _networkDetailsDao = mock(NetworkDetailsDao.class); + @Mock private PhysicalNetworkDao _physicalNetworkDao; + @Mock private DataCenterDao _dataCenterDao; + @Mock private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao; + @Mock private AgentManager _agentManager; + @Mock private NetworkModel _networkModel; + @Mock private AccountDao _accountDao; + @Mock private DomainDao _domainDao; + @Mock private NicDao _nicDao; + @Mock private NetworkOfferingDao _networkOfferingDao; + @Mock private NuageVspDao _nuageVspDao; + @Mock private HostDao _hostDao; + @Mock private NetworkDao _networkDao; + @Mock private ConfigurationDao _configurationDao; + @Mock private IPAddressDao _ipAddressDao; + @Mock private NuageVspManager _nuageVspManager; + @Mock private ConfigurationManager _configurationManager; + @Mock private NetworkDetailsDao _networkDetailsDao; + @Mock private PhysicalNetworkVO physnet; + + @InjectMocks private NuageVspGuestNetworkGuru _nuageVspGuestNetworkGuru; @Before public void setUp() throws Exception { + _nuageVspGuestNetworkGuru = new NuageVspGuestNetworkGuru(); + super.setUp(); - _nuageVspGuestNetworkGuru = new NuageVspGuestNetworkGuru(); - _nuageVspGuestNetworkGuru._physicalNetworkDao = _physicalNetworkDao; - _nuageVspGuestNetworkGuru._physicalNetworkDao = _physicalNetworkDao; - _nuageVspGuestNetworkGuru._nuageVspDao = _nuageVspDao; - _nuageVspGuestNetworkGuru._dcDao = _dataCenterDao; - _nuageVspGuestNetworkGuru._ntwkOfferingSrvcDao = _networkOfferingServiceMapDao; - _nuageVspGuestNetworkGuru._networkModel = _networkModel; - _nuageVspGuestNetworkGuru._hostDao = _hostDao; - _nuageVspGuestNetworkGuru._agentMgr = _agentManager; - _nuageVspGuestNetworkGuru._networkDao = _networkDao; - _nuageVspGuestNetworkGuru._accountDao = _accountDao; - _nuageVspGuestNetworkGuru._domainDao = _domainDao; - _nuageVspGuestNetworkGuru._nicDao = _nicDao; - _nuageVspGuestNetworkGuru._ntwkOfferingDao = _networkOfferingDao; - _nuageVspGuestNetworkGuru._configDao = _configurationDao; - _nuageVspGuestNetworkGuru._ipAddressDao = _ipAddressDao; - _nuageVspGuestNetworkGuru._nuageVspManager = _nuageVspManager; - _nuageVspGuestNetworkGuru._configMgr = _configurationManager; _nuageVspGuestNetworkGuru._nuageVspEntityBuilder = _nuageVspEntityBuilder; - _nuageVspGuestNetworkGuru._networkDetailsDao = _networkDetailsDao; final DataCenterVO dc = mock(DataCenterVO.class); when(dc.getNetworkType()).thenReturn(NetworkType.Advanced); @@ -142,41 +135,51 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { when(_configurationDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate"); when(_configurationDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate"); when(_configurationDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate"); + + when(_physicalNetworkDao.findById(any(Long.class))).thenReturn(physnet); + when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VSP")); + when(physnet.getId()).thenReturn(NETWORK_ID); + + final HostVO host = mock(HostVO.class); + when(_hostDao.findById(NETWORK_ID)).thenReturn(host); + when(host.getId()).thenReturn(NETWORK_ID); + when(_agentManager.easySend(eq(NETWORK_ID), any(Command.class))).thenReturn(new Answer(null)); + + final NuageVspDeviceVO device = mock(NuageVspDeviceVO.class); + when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(device)); + when(device.getId()).thenReturn(1L); + when(device.getHostId()).thenReturn(NETWORK_ID); } @Test public void testCanHandle() { final NetworkOffering offering = mock(NetworkOffering.class); when(offering.getId()).thenReturn(NETWORK_ID); - when(offering.getTrafficType()).thenReturn(TrafficType.Guest); - when(offering.getGuestType()).thenReturn(GuestType.Isolated); when(offering.getIsPersistent()).thenReturn(false); when(_configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(false); - final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class); - when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VSP"})); - when(physnet.getId()).thenReturn(NETWORK_ID); - when(_networkOfferingServiceMapDao.areServicesSupportedByNetworkOffering(NETWORK_ID, Service.Connectivity)).thenReturn(true); - assertTrue(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet) == true); + when(offering.getTrafficType()).thenReturn(TrafficType.Guest); + when(offering.getGuestType()).thenReturn(GuestType.Isolated); + assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet), is(true)); // Not supported TrafficType != Guest when(offering.getTrafficType()).thenReturn(TrafficType.Management); - assertFalse(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet) == true); + assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet), is(false)); // Supported: GuestType Shared when(offering.getTrafficType()).thenReturn(TrafficType.Guest); when(offering.getGuestType()).thenReturn(GuestType.Shared); - assertTrue(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet) == true); + assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet), is(true)); // Not supported: Basic networking when(offering.getGuestType()).thenReturn(GuestType.Isolated); - assertFalse(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Basic, physnet) == true); + assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Basic, physnet), is(false)); // Not supported: IsolationMethod != STT - when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VLAN"})); - assertFalse(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Advanced, physnet) == true); + when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VLAN")); + assertThat(_nuageVspGuestNetworkGuru.canHandle(offering, NetworkType.Basic, physnet), is(false)); // Not supported: Non-persistent VPC tier when(_configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(true); @@ -185,13 +188,8 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { @Test public void testDesign() { - final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class); - when(_physicalNetworkDao.findById((Long)any())).thenReturn(physnet); - when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VSP"})); - when(physnet.getId()).thenReturn(NETWORK_ID); - final NuageVspDeviceVO device = mock(NuageVspDeviceVO.class); - when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[]{device})); + when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(device)); when(device.getId()).thenReturn(1L); final NetworkOffering offering = mock(NetworkOffering.class); @@ -208,22 +206,17 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { final Account account = mock(Account.class); final Network designednetwork = _nuageVspGuestNetworkGuru.design(offering, plan, network, account); - assertTrue(designednetwork != null); - assertTrue(designednetwork.getBroadcastDomainType() == BroadcastDomainType.Vsp); + assertThat(designednetwork, notNullValue(Network.class)); + assertThat(designednetwork.getBroadcastDomainType(), is(BroadcastDomainType.Vsp)); // Can't design non-persistent VPC tier when(_configurationManager.isOfferingForVpc(any(NetworkOffering.class))).thenReturn(true); - assertNull(_nuageVspGuestNetworkGuru.design(offering, plan, network, account)); + assertThat(_nuageVspGuestNetworkGuru.design(offering, plan, network, account), nullValue(Network.class)); } @Test public void testDesignNoElementOnPhysicalNetwork() { - final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class); - when(_physicalNetworkDao.findById((Long)any())).thenReturn(physnet); - when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"STT"})); - when(physnet.getId()).thenReturn(NETWORK_ID); - - mock(NuageVspDeviceVO.class); + when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("STT")); when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.emptyList()); final NetworkOffering offering = mock(NetworkOffering.class); @@ -241,12 +234,7 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { @Test public void testDesignNoIsolationMethodVSP() { - final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class); - when(_physicalNetworkDao.findById((Long)any())).thenReturn(physnet); - when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VLAN"})); - when(physnet.getId()).thenReturn(NETWORK_ID); - - mock(NuageVspDeviceVO.class); + when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VLAN")); when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.emptyList()); final NetworkOffering offering = mock(NetworkOffering.class); @@ -289,7 +277,10 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { when(nicvo.getId()).thenReturn(NETWORK_ID); when(nicvo.getMacAddress()).thenReturn("aa-aa-aa-aa-aa-aa"); when(nicvo.getUuid()).thenReturn("aaaa-fffff"); + when(nicvo.getNetworkId()).thenReturn(NETWORK_ID); + when(nicvo.getInstanceId()).thenReturn(NETWORK_ID); when(_nicDao.findById(NETWORK_ID)).thenReturn(nicvo); + when(_nicDao.findDefaultNicForVM(NETWORK_ID)).thenReturn(nicvo); final VirtualMachine vm = mock(VirtualMachine.class); when(vm.getId()).thenReturn(NETWORK_ID); @@ -310,21 +301,10 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { when(ntwkoffering.getId()).thenReturn(NETWORK_ID); when(_networkOfferingDao.findById(NETWORK_ID)).thenReturn(ntwkoffering); - final HostVO host = mock(HostVO.class); - when(host.getId()).thenReturn(NETWORK_ID); - final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class); - when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID); - when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[]{nuageVspDevice})); - when(_hostDao.findById(NETWORK_ID)).thenReturn(host); - when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network); when(_ipAddressDao.findByVmIdAndNetworkId(NETWORK_ID, NETWORK_ID)).thenReturn(null); when(_domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class)); - final Answer answer = mock(Answer.class); - when(answer.getResult()).thenReturn(true); - when(_agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); - _nuageVspGuestNetworkGuru.reserve(nicProfile, network, vmProfile, mock(DeployDestination.class), mock(ReservationContext.class)); } @@ -368,20 +348,10 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { final AccountVO accountVo = mock(AccountVO.class); when(_accountDao.findById(NETWORK_ID)).thenReturn(accountVo); - final HostVO host = mock(HostVO.class); - when(host.getId()).thenReturn(NETWORK_ID); - final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class); - when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID); - when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[]{nuageVspDevice})); - when(_hostDao.findById(NETWORK_ID)).thenReturn(host); when(_networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network); when(_nuageVspManager.getDnsDetails(network)).thenReturn(new ArrayList()); when(_nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList()); - final Answer answer = mock(Answer.class); - when(answer.getResult()).thenReturn(true); - when(_agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); - final DataCenter dc = mock(DataCenter.class); when(dc.getId()).thenReturn(NETWORK_ID); final DeployDestination deployDest = mock(DeployDestination.class); @@ -429,17 +399,6 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { when(vmProfile.getInstanceName()).thenReturn("Test-VM"); when(vmProfile.getVirtualMachine()).thenReturn(vm); - final HostVO host = mock(HostVO.class); - when(host.getId()).thenReturn(NETWORK_ID); - final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class); - when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID); - when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[]{nuageVspDevice})); - when(_hostDao.findById(NETWORK_ID)).thenReturn(host); - - final Answer answer = mock(Answer.class); - when(answer.getResult()).thenReturn(true); - when(_agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); - _nuageVspGuestNetworkGuru.deallocate(network, nicProfile, vmProfile); } @@ -464,19 +423,9 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest { when(domain.getUuid()).thenReturn("aaaaaa"); when(_domainDao.findById(NETWORK_ID)).thenReturn(domain); - final HostVO host = mock(HostVO.class); - when(host.getId()).thenReturn(NETWORK_ID); - final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class); - when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID); - when(_nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[]{nuageVspDevice})); - when(_hostDao.findById(NETWORK_ID)).thenReturn(host); when(_nuageVspManager.getDnsDetails(network)).thenReturn(new ArrayList()); when(_nuageVspManager.getGatewaySystemIds()).thenReturn(new ArrayList()); - final Answer answer = mock(Answer.class); - when(answer.getResult()).thenReturn(true); - when(_agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); - assertTrue(_nuageVspGuestNetworkGuru.trash(network, offering)); } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java index 66d26323aa0..0983ab65d93 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java @@ -19,6 +19,30 @@ package com.cloud.network.resource; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import javax.naming.ConfigurationException; + +import net.nuage.vsp.acs.client.api.NuageVspApiClient; +import net.nuage.vsp.acs.client.api.NuageVspElementClient; +import net.nuage.vsp.acs.client.api.NuageVspGuruClient; +import net.nuage.vsp.acs.client.api.model.VspAclRule; +import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; +import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption; +import net.nuage.vsp.acs.client.api.model.VspNetwork; +import net.nuage.vsp.acs.client.api.model.VspNic; +import net.nuage.vsp.acs.client.api.model.VspStaticNat; +import net.nuage.vsp.acs.client.api.model.VspVm; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import com.cloud.NuageTest; import com.cloud.agent.api.Answer; import com.cloud.agent.api.PingCommand; @@ -31,25 +55,6 @@ import com.cloud.agent.api.guru.ImplementNetworkVspCommand; import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; import com.cloud.agent.api.guru.TrashNetworkVspCommand; import com.cloud.host.Host; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import net.nuage.vsp.acs.client.api.NuageVspApiClient; -import net.nuage.vsp.acs.client.api.NuageVspElementClient; -import net.nuage.vsp.acs.client.api.NuageVspGuruClient; -import net.nuage.vsp.acs.client.api.model.VspAclRule; -import net.nuage.vsp.acs.client.api.model.VspNetwork; -import net.nuage.vsp.acs.client.api.model.VspNic; -import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import net.nuage.vsp.acs.client.api.model.VspVm; -import org.junit.Before; -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; - -import javax.naming.ConfigurationException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doAnswer; @@ -151,8 +156,9 @@ public class NuageVspResourceTest extends NuageTest { _resource.configure("NuageVspResource", _hostDetails); VspNetwork vspNetwork = buildVspNetwork(); - ImplementNetworkVspCommand cmd = new ImplementNetworkVspCommand(vspNetwork, new ArrayList()); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement(vspNetwork, new ArrayList()); + VspDhcpDomainOption vspDhcpOptions = buildspDhcpDomainOption(); + ImplementNetworkVspCommand cmd = new ImplementNetworkVspCommand(vspNetwork, vspDhcpOptions); + doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement(vspNetwork, vspDhcpOptions); com.cloud.agent.api.Answer implNtwkAns = _resource.executeRequest(cmd); assertTrue(implNtwkAns.getResult()); } @@ -165,8 +171,9 @@ public class NuageVspResourceTest extends NuageTest { VspVm vspVm = buildVspVm(); VspNic vspNic = buildVspNic(); VspStaticNat vspStaticNat = buildVspStaticNat(); - ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).reserve(vspNetwork, vspVm, vspNic, vspStaticNat); + VspDhcpVMOption vspDhcpOption = buildspDhcpVMOption(); + ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat, vspDhcpOption); + doAnswer(genericAnswer).when(_mockNuageVspGuruClient).reserve(vspNetwork, vspVm, vspNic, vspStaticNat, vspDhcpOption); Answer rsrvVmInfAns = _resource.executeRequest(cmd); assertTrue(rsrvVmInfAns.getResult()); } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 03d19588af3..0510746b44a 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -24,9 +24,22 @@ import java.util.Set; import javax.inject.Inject; -import com.cloud.network.dao.NetworkDetailVO; -import com.cloud.network.dao.NetworkDetailsDao; -import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.log4j.Logger; +import org.cloud.network.router.deployment.RouterDeploymentDefinition; +import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder; + +import com.google.gson.Gson; + +import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd; +import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd; +import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd; +import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd; +import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.network.topology.NetworkTopology; +import org.apache.cloudstack.network.topology.NetworkTopologyContext; + import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; @@ -60,6 +73,8 @@ import com.cloud.network.as.AutoScaleCounter.AutoScaleCounterType; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.dao.OvsProviderDao; import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.lb.LoadBalancingRule; @@ -85,6 +100,7 @@ import com.cloud.utils.component.AdapterBase; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; @@ -96,23 +112,10 @@ import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; -import com.google.gson.Gson; - -import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd; -import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd; -import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd; -import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd; -import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.network.topology.NetworkTopology; -import org.apache.cloudstack.network.topology.NetworkTopologyContext; -import org.apache.log4j.Logger; -import org.cloud.network.router.deployment.RouterDeploymentDefinition; -import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder; public class VirtualRouterElement extends AdapterBase implements VirtualRouterElementService, DhcpServiceProvider, UserDataServiceProvider, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer, -NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource { +NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource, DnsServiceProvider { private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class); public static final AutoScaleCounterType AutoScaleCounterCpu = new AutoScaleCounterType("cpu"); public static final AutoScaleCounterType AutoScaleCounterMemory = new AutoScaleCounterType("memory"); @@ -968,10 +971,24 @@ NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource { return true; } + @Override public boolean configDhcpSupportForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, - final ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { - if (canHandle(network, Service.Dhcp)) { + final ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + return configureDhcpSupport(network, nic, vm, dest, Service.Dhcp); + } + + @Override + public boolean configDnsSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + // Ignore if virtual router is already dhcp provider + if (_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, getProvider())) { + return true; + } + return configureDhcpSupport(network, nic, vm, dest, Service.Dns); + } + + protected boolean configureDhcpSupport(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, Service service) throws ResourceUnavailableException { + if (canHandle(network, service)) { if (vm.getType() != VirtualMachine.Type.User) { return false; } @@ -994,15 +1011,30 @@ NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource { @Override public boolean removeDhcpSupportForSubnet(final Network network) throws ResourceUnavailableException { - if (canHandle(network, Service.Dhcp)) { + return removeDhcpSupportForSubnet(network, Service.Dhcp); + } + + @Override + public boolean removeDnsSupportForSubnet(Network network) throws ResourceUnavailableException { + // Ignore if virtual router is already dhcp provider + if (_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, getProvider())) { + return true; + } else { + return removeDhcpSupportForSubnet(network, Service.Dns); + } + } + + protected boolean removeDhcpSupportForSubnet(Network network, Network.Service service) throws ResourceUnavailableException { + if (canHandle(network, service)) { final List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); - if (routers == null || routers.size() == 0) { + + if (CollectionUtils.isEmpty(routers)) { throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId()); } try { return _routerMgr.removeDhcpSupportForSubnet(network, routers); } catch (final ResourceUnavailableException e) { - s_logger.debug("Router resource unavailable "); + s_logger.info("Router resource unavailable ", e); } } return false; @@ -1011,8 +1043,23 @@ NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource { @Override public boolean addDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + return applyDhcpEntries(network, nic, vm, dest, Service.Dhcp); + } + + @Override + public boolean addDnsEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + // Ignore if virtual router is already dhcp provider + if (_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, getProvider())) { + return true; + } + + return applyDhcpEntries(network, nic, vm, dest, Service.Dns); + } + + protected boolean applyDhcpEntries (final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final Network.Service service) throws ResourceUnavailableException { + boolean result = true; - if (canHandle(network, Service.Dhcp)) { + if (canHandle(network, service)) { if (vm.getType() != VirtualMachine.Type.User) { return false; } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index b6c8cf091ae..a488c2b29c9 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -42,6 +42,11 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.log4j.Logger; +import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + import org.apache.cloudstack.alert.AlertService; import org.apache.cloudstack.alert.AlertService.AlertType; import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd; @@ -61,10 +66,6 @@ import org.apache.cloudstack.network.topology.NetworkTopology; import org.apache.cloudstack.network.topology.NetworkTopologyContext; import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.cloudstack.utils.usage.UsageUtils; -import org.apache.log4j.Logger; -import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -1758,7 +1759,8 @@ Configurable, StateListener