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 extends PublicIpAddress> 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 extends StaticNat> 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