From 645f8758df3a2d22d4583d385492187285393a89 Mon Sep 17 00:00:00 2001 From: Nick Livens Date: Tue, 27 Oct 2015 14:56:57 +0100 Subject: [PATCH] CLOUDSTACK-8832 : Update Nuage VSP plugin to work with Nuage VSP release 3.2 --- api/src/com/cloud/agent/api/Answer.java | 22 + api/src/com/cloud/agent/api/Command.java | 20 + api/src/com/cloud/event/EventTypes.java | 1 + api/src/com/cloud/network/Network.java | 1 - client/tomcatconf/commands.properties.in | 1 + core/src/com/cloud/agent/api/PingCommand.java | 22 + .../com/cloud/network/dao/IPAddressDao.java | 2 + .../cloud/network/dao/IPAddressDaoImpl.java | 8 + .../cloud/network/vpc/NetworkACLItemDao.java | 2 +- .../com/cloud/network/vpc/VpcOfferingVO.java | 8 + .../vpc/dao/NetworkACLItemDaoImpl.java | 5 +- plugins/network-elements/nuage-vsp/pom.xml | 7 + .../SyncVspAnswer.java => CmdBuilder.java} | 16 +- .../cloud/agent/api/PingNuageVspCommand.java | 56 ++ .../cloud/agent/api/StartupVspCommand.java | 5 + .../cloud/agent/api/VspResourceAnswer.java | 20 +- .../cloud/agent/api/VspResourceCommand.java | 53 +- .../api/element/ApplyAclRuleVspAnswer.java | 34 - .../api/element/ApplyAclRuleVspCommand.java | 195 ++++- .../api/element/ApplyStaticNatVspAnswer.java | 34 - .../api/element/ApplyStaticNatVspCommand.java | 104 ++- .../api/element/ImplementVspCommand.java | 297 +++++++ .../api/element/ShutDownVpcVspAnswer.java | 34 - .../api/element/ShutDownVpcVspCommand.java | 63 +- .../agent/api/guru/DeallocateVmVspAnswer.java | 34 - .../api/guru/DeallocateVmVspCommand.java | 160 +++- .../api/guru/ImplementNetworkVspCommand.java | 276 ++++++- .../agent/api/guru/ReleaseVmVspAnswer.java | 34 - .../guru/ReserveVmInterfaceVspCommand.java | 325 +++++++- .../agent/api/guru/TrashNetworkVspAnswer.java | 34 - .../api/guru/TrashNetworkVspCommand.java | 97 ++- .../api/manager/GetClientDefaultsAnswer.java | 81 ++ .../GetClientDefaultsCommand.java} | 21 +- .../manager/SupportedApiVersionCommand.java | 61 ++ .../SyncDomainAnswer.java} | 43 +- .../agent/api/sync/SyncDomainCommand.java | 93 +++ .../api/sync/SyncNuageVspCmsIdAnswer.java | 73 ++ .../api/sync/SyncNuageVspCmsIdCommand.java | 72 ++ .../cloud/agent/api/sync/SyncVspCommand.java | 22 +- .../api/commands/AddNuageVspDeviceCmd.java | 25 +- .../api/commands/DeleteNuageVspDeviceCmd.java | 21 +- .../IssueNuageVspResourceRequestCmd.java | 34 +- .../api/commands/ListNuageVspDevicesCmd.java | 28 +- .../api/commands/UpdateNuageVspDeviceCmd.java | 180 +++++ .../api/response/NuageVspDeviceResponse.java | 5 +- .../response/NuageVspResourceResponse.java | 3 +- .../com/cloud/network/NuageVspDeviceVO.java | 5 +- .../com/cloud/network/dao/NuageVspDao.java | 8 + .../cloud/network/dao/NuageVspDaoImpl.java | 20 +- .../network/element/NuageVspElement.java | 346 ++++++-- .../guru/NuageVspGuestNetworkGuru.java | 552 ++++++++----- .../network/manager/NuageVspManager.java | 53 +- .../network/manager/NuageVspManagerImpl.java | 752 +++++++++++++++--- .../network/resource/NuageVspResource.java | 545 +++++++++---- .../cloud/network/sync/NuageVspSyncImpl.java | 35 +- .../src/com/cloud/util/NuageVspUtil.java | 40 + .../vsp/acs/NuageVspPluginClientLoader.java | 89 ++- .../vsp/acs/client/NuageVspApiClient.java | 10 +- .../vsp/acs/client/NuageVspElementClient.java | 16 +- .../vsp/acs/client/NuageVspGuruClient.java | 23 +- .../acs/client/NuageVspManagerClient.java} | 30 +- .../vsp/acs/client/NuageVspSyncClient.java | 6 +- .../com/cloud/agent/api/CommandsTest.java | 151 ++++ .../network/element/NuageVspElementTest.java | 137 +++- .../guru/NuageVspGuestNetworkGuruTest.java | 212 +++-- .../network/manager/NuageVspManagerTest.java | 37 +- .../resource/NuageVspResourceTest.java | 197 +++-- .../cloud/network/sync/NuageVspSyncTest.java | 23 +- .../ConfigurationManagerImpl.java | 7 +- .../cloud/network/guru/DirectNetworkGuru.java | 6 +- test/integration/component/test_nuage_vsp.py | 61 +- .../component/test_vpcnetwork_nuage.py | 295 +++++++ 72 files changed, 5096 insertions(+), 1292 deletions(-) rename plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/{sync/SyncVspAnswer.java => CmdBuilder.java} (71%) create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java delete mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java delete mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java delete mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java delete mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java delete mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java delete mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java rename plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/{guru/ImplementNetworkVspAnswer.java => manager/GetClientDefaultsCommand.java} (68%) create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java rename plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/{guru/ReleaseVmVspCommand.java => sync/SyncDomainAnswer.java} (53%) create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java create mode 100755 plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java create mode 100644 plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java rename plugins/network-elements/nuage-vsp/src/{com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java => net/nuage/vsp/acs/client/NuageVspManagerClient.java} (51%) create mode 100644 plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java create mode 100644 test/integration/component/test_vpcnetwork_nuage.py diff --git a/api/src/com/cloud/agent/api/Answer.java b/api/src/com/cloud/agent/api/Answer.java index fd6a0d1b46a..17bba76e14d 100644 --- a/api/src/com/cloud/agent/api/Answer.java +++ b/api/src/com/cloud/agent/api/Answer.java @@ -59,4 +59,26 @@ public class Answer extends Command { public static UnsupportedAnswer createUnsupportedVersionAnswer(final Command cmd) { return new UnsupportedAnswer(cmd, "Unsuppored Version."); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Answer)) return false; + if (!super.equals(o)) return false; + + Answer answer = (Answer) o; + + if (result != answer.result) return false; + if (details != null ? !details.equals(answer.details) : answer.details != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result1 = super.hashCode(); + result1 = 31 * result1 + (result ? 1 : 0); + result1 = 31 * result1 + (details != null ? details.hashCode() : 0); + return result1; + } } \ No newline at end of file diff --git a/api/src/com/cloud/agent/api/Command.java b/api/src/com/cloud/agent/api/Command.java index 2341a994dbd..4a698e46bde 100644 --- a/api/src/com/cloud/agent/api/Command.java +++ b/api/src/com/cloud/agent/api/Command.java @@ -73,4 +73,24 @@ public abstract class Command { public boolean allowCaching() { return true; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Command)) return false; + + Command command = (Command) o; + + if (wait != command.wait) return false; + if (contextMap != null ? !contextMap.equals(command.contextMap) : command.contextMap != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = contextMap != null ? contextMap.hashCode() : 0; + result = 31 * result + wait; + return result; + } } diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 9a264a50e82..7349c1f5413 100644 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -434,6 +434,7 @@ public class EventTypes { // external network mapping events public static final String EVENT_EXTERNAL_VSP_VSD_ADD = "PHYSICAL.NUAGE.VSD.ADD"; + public static final String EVENT_EXTERNAL_VSP_VSD_UPDATE = "PHYSICAL.NUAGE.VSD.UPDATE"; public static final String EVENT_EXTERNAL_VSP_VSD_DELETE = "PHYSICAL.NUAGE.VSD.DELETE"; // AutoScale public static final String EVENT_COUNTER_CREATE = "COUNTER.CREATE"; diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index d39489ee0de..7cc5441603a 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -134,7 +134,6 @@ public interface Network extends ControlledEntity, StateObject, I public static final Provider Opendaylight = new Provider("Opendaylight", false); // add Nuage Vsp Providers public static final Provider NuageVsp = new Provider("NuageVsp", false); - public static final Provider NuageVspVpc = new Provider("NuageVspVpc", false); public static final Provider BrocadeVcs = new Provider("BrocadeVcs", false); // add GloboDns provider public static final Provider GloboDns = new Provider("GloboDns", true); diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 473c6354a8f..4f93b977733 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -644,6 +644,7 @@ deleteStratoshereSsp=1 #### nuage vsp commands addNuageVspDevice=1 +updateNuageVspDevice=1 deleteNuageVspDevice=1 listNuageVspDevices=1 issueNuageVspResourceRequest=15 diff --git a/core/src/com/cloud/agent/api/PingCommand.java b/core/src/com/cloud/agent/api/PingCommand.java index 8136c3d8b2e..1d62c5d1359 100644 --- a/core/src/com/cloud/agent/api/PingCommand.java +++ b/core/src/com/cloud/agent/api/PingCommand.java @@ -45,4 +45,26 @@ public class PingCommand extends Command { public boolean executeInSequence() { return false; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PingCommand)) return false; + if (!super.equals(o)) return false; + + PingCommand that = (PingCommand) o; + + if (hostId != that.hostId) return false; + if (hostType != that.hostType) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (hostType != null ? hostType.hashCode() : 0); + result = 31 * result + (int) (hostId ^ (hostId >>> 32)); + return result; + } } diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java index fbf5c576855..24d77db711a 100644 --- a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java +++ b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java @@ -87,4 +87,6 @@ public interface IPAddressDao extends GenericDao { void lockRange(long vlandbId); List listByAssociatedVmId(long vmId); + + IPAddressVO findByVmIdAndNetworkId(long networkId, long vmId); } diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java index 61bc1b7b27c..63278c2e93c 100644 --- a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -458,6 +458,14 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen return listBy(sc); } + @Override + public IPAddressVO findByVmIdAndNetworkId(long networkId, long vmId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("associatedWithVmId", vmId); + return findOneBy(sc); + } + @Override public void lockRange(long vlandbId) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java index 9ab6365df18..21794cba649 100644 --- a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java +++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java @@ -29,7 +29,7 @@ public interface NetworkACLItemDao extends GenericDao { boolean revoke(NetworkACLItemVO rule); - List listByACL(long aclId); + List listByACL(Long aclId); int getMaxNumberByACL(long aclId); diff --git a/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java b/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java index bd13a02d90a..62e8cf3ae2a 100644 --- a/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java +++ b/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java @@ -99,6 +99,14 @@ public class VpcOfferingVO implements VpcOffering { this.redundantRouter = redundantRouter; } + public VpcOfferingVO(String name, String displayText, boolean isDefault, Long serviceOfferingId, + boolean supportsDistributedRouter, boolean offersRegionLevelVPC) { + this(name, displayText, serviceOfferingId); + this.isDefault = isDefault; + this.supportsDistributedRouter = supportsDistributedRouter; + this.offersRegionLevelVPC = offersRegionLevelVPC; + } + @Override public long getId() { return id; diff --git a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java index 201197c93f2..15f9014130f 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java @@ -21,6 +21,7 @@ import java.util.List; import javax.ejb.Local; import javax.inject.Inject; +import com.google.common.collect.Lists; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -115,7 +116,9 @@ public class NetworkACLItemDaoImpl extends GenericDaoBase listByACL(long aclId) { + public List listByACL(Long aclId) { + if (aclId == null) return Lists.newArrayList(); + SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("aclId", aclId); List list = listBy(sc); diff --git a/plugins/network-elements/nuage-vsp/pom.xml b/plugins/network-elements/nuage-vsp/pom.xml index 36b53f78895..fb258f89919 100644 --- a/plugins/network-elements/nuage-vsp/pom.xml +++ b/plugins/network-elements/nuage-vsp/pom.xml @@ -28,6 +28,13 @@ 4.6.0-SNAPSHOT ../../pom.xml + + + org.apache.commons + commons-lang3 + ${cs.lang3.version} + + diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java similarity index 71% rename from plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java rename to plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java index 52848e558a0..514afb6c331 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/CmdBuilder.java @@ -17,18 +17,8 @@ // under the License. // -package com.cloud.agent.api.sync; - -import com.cloud.agent.api.Answer; - -public class SyncVspAnswer extends Answer { - - public SyncVspAnswer(SyncVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } - - public SyncVspAnswer(SyncVspCommand cmd, Exception e) { - super(cmd, e); - } +package com.cloud.agent.api; +public interface CmdBuilder { + T build(); } 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 new file mode 100644 index 00000000000..c7505d9e3c4 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/PingNuageVspCommand.java @@ -0,0 +1,56 @@ +// +// 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; + +import com.cloud.host.Host; + +public class PingNuageVspCommand extends PingCommand { + + private final boolean shouldAudit; + + public PingNuageVspCommand(Host.Type type, long id, boolean shouldAudit) { + super(type, id); + this.shouldAudit = shouldAudit; + } + + public boolean shouldAudit() { + return shouldAudit; + } + + @Override + 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; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (shouldAudit ? 1 : 0); + return result; + } +} diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java index 6dba8820a87..2e289fbb421 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java @@ -21,9 +21,14 @@ package com.cloud.agent.api; import com.cloud.host.Host; +/** + * The super class implementations for equals and hashCode are acceptable because this class does not track any state + * in addition to the super class. + */ public class StartupVspCommand extends StartupCommand { public StartupVspCommand() { super(Host.Type.L2Networking); } + } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java index 9327809a0eb..979dcd315f2 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java @@ -21,7 +21,7 @@ package com.cloud.agent.api; public class VspResourceAnswer extends Answer { - String _resourceInfo; + private String _resourceInfo; public VspResourceAnswer(Command cmd, String resourceInfo, String details) { super(cmd, true, details); @@ -39,4 +39,22 @@ public class VspResourceAnswer extends Answer { public String getResourceInfo() { return this._resourceInfo; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + VspResourceAnswer that = (VspResourceAnswer) o; + + if (_resourceInfo != null ? !_resourceInfo.equals(that._resourceInfo) : that._resourceInfo != null) + return false; + + return true; + } + + @Override + public int hashCode() { + return _resourceInfo != null ? _resourceInfo.hashCode() : 0; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java index f7e1417aed9..6e03dabc1be 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java @@ -21,14 +21,14 @@ package com.cloud.agent.api; public class VspResourceCommand extends Command { - String _method; - String _resource; - String _resourceId; - String _childResource; - Object _entityDetails; - String _resourceFilter; - String _proxyUserUuid; - String _proxyUserDomainuuid; + private final String _method; + private final String _resource; + private final String _resourceId; + private final String _childResource; + private final Object _entityDetails; + private final String _resourceFilter; + private final String _proxyUserUuid; + private final String _proxyUserDomainuuid; public VspResourceCommand(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid, String proxyUserDomainuuid) { @@ -79,4 +79,41 @@ public class VspResourceCommand extends Command { public boolean executeInSequence() { return false; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + VspResourceCommand that = (VspResourceCommand) o; + + if (_childResource != null ? !_childResource.equals(that._childResource) : that._childResource != null) + return false; + if (_entityDetails != null ? !_entityDetails.equals(that._entityDetails) : that._entityDetails != null) + return false; + if (_method != null ? !_method.equals(that._method) : that._method != null) return false; + if (_proxyUserDomainuuid != null ? !_proxyUserDomainuuid.equals(that._proxyUserDomainuuid) : that._proxyUserDomainuuid != null) + return false; + if (_proxyUserUuid != null ? !_proxyUserUuid.equals(that._proxyUserUuid) : that._proxyUserUuid != null) + return false; + if (_resource != null ? !_resource.equals(that._resource) : that._resource != null) return false; + if (_resourceFilter != null ? !_resourceFilter.equals(that._resourceFilter) : that._resourceFilter != null) + return false; + if (_resourceId != null ? !_resourceId.equals(that._resourceId) : that._resourceId != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = _method != null ? _method.hashCode() : 0; + result = 31 * result + (_resource != null ? _resource.hashCode() : 0); + result = 31 * result + (_resourceId != null ? _resourceId.hashCode() : 0); + result = 31 * result + (_childResource != null ? _childResource.hashCode() : 0); + result = 31 * result + (_entityDetails != null ? _entityDetails.hashCode() : 0); + result = 31 * result + (_resourceFilter != null ? _resourceFilter.hashCode() : 0); + result = 31 * result + (_proxyUserUuid != null ? _proxyUserUuid.hashCode() : 0); + result = 31 * result + (_proxyUserDomainuuid != null ? _proxyUserDomainuuid.hashCode() : 0); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java deleted file mode 100644 index 2b41266f02c..00000000000 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.agent.api.Answer; - -public class ApplyAclRuleVspAnswer extends Answer { - - public ApplyAclRuleVspAnswer(ApplyAclRuleVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } - - public ApplyAclRuleVspAnswer(ApplyAclRuleVspCommand cmd, Exception e) { - super(cmd, e); - } - -} 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 53764669378..7b1d40bc097 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,31 +19,46 @@ package com.cloud.agent.api.element; +import com.cloud.agent.api.CmdBuilder; +import com.cloud.agent.api.Command; + import java.util.List; import java.util.Map; -import com.cloud.agent.api.Command; - public class ApplyAclRuleVspCommand extends Command { - String _networkUuid; - String _networkDomainUuid; - String _vpcOrSubnetUuid; - boolean _isL3Network; - List> _aclRules; - boolean _isVpc; - long _networkId; + private final boolean _networkAcl; + private final String _networkUuid; + private final String _networkDomainUuid; + private final String _vpcOrSubnetUuid; + private final String _networkName; + private final boolean _isL2Network; + private final List> _aclRules; + private final long _networkId; + private final boolean _egressDefaultPolicy; + private final Boolean _acsIngressAcl; + private final boolean _networkReset; + private final String _domainTemplateName; - public ApplyAclRuleVspCommand(String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List> aclRules, boolean isVpc, - long networkId) { + private ApplyAclRuleVspCommand(boolean networkAcl, String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, String networkName, boolean isL2Network, + List> aclRules, long networkId, boolean egressDefaultPolicy, Boolean acsIngressAcl, boolean networkReset, String domainTemplateName) { super(); + this._networkAcl = networkAcl; this._networkUuid = networkUuid; this._networkDomainUuid = networkDomainUuid; this._vpcOrSubnetUuid = vpcOrSubnetUuid; - this._isL3Network = isL3Network; + this._networkName = networkName; + this._isL2Network = isL2Network; this._aclRules = aclRules; - this._isVpc = isVpc; this._networkId = networkId; + this._egressDefaultPolicy = egressDefaultPolicy; + this._acsIngressAcl = acsIngressAcl; + this._networkReset = networkReset; + this._domainTemplateName = domainTemplateName; + } + + public boolean isNetworkAcl() { + return _networkAcl; } public String getNetworkUuid() { @@ -58,20 +73,117 @@ public class ApplyAclRuleVspCommand extends Command { return _vpcOrSubnetUuid; } - public boolean isL3Network() { - return _isL3Network; + public String getNetworkName() { + return _networkName; + } + + public boolean isL2Network() { + return _isL2Network; } public List> getAclRules() { return _aclRules; } - public boolean isVpc() { - return _isVpc; + public long getNetworkId() { + return _networkId; } - public long getNetworkId() { - return this._networkId; + public boolean isEgressDefaultPolicy() { + return _egressDefaultPolicy; + } + + public Boolean getAcsIngressAcl() { + return _acsIngressAcl; + } + + public boolean isNetworkReset() { + return _networkReset; + } + + public String getDomainTemplateName() { + return _domainTemplateName; + } + + public static class Builder implements CmdBuilder { + private boolean _networkAcl; + private String _networkUuid; + private String _networkDomainUuid; + private String _vpcOrSubnetUuid; + private String _networkName; + private boolean _isL2Network; + private List> _aclRules; + private long _networkId; + private boolean _egressDefaultPolicy; + private Boolean _acsIngressAcl; + private boolean _networkReset; + private String _domainTemplateName; + + public Builder networkAcl(boolean networkAcl) { + this._networkAcl = networkAcl; + return this; + } + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder networkDomainUuid(String networkDomainUuid) { + this._networkDomainUuid = networkDomainUuid; + return this; + } + + public Builder vpcOrSubnetUuid(String vpcOrSubnetUuid) { + this._vpcOrSubnetUuid = vpcOrSubnetUuid; + return this; + } + + public Builder networkName(String networkName) { + this._networkName = networkName; + return this; + } + + public Builder isL2Network(boolean isL2Network) { + this._isL2Network = isL2Network; + return this; + } + + public Builder aclRules(List> aclRules) { + this._aclRules = aclRules; + return this; + } + + public Builder networkId(long networkId) { + this._networkId = networkId; + return this; + } + + public Builder egressDefaultPolicy(boolean egressDefaultPolicy) { + this._egressDefaultPolicy = egressDefaultPolicy; + return this; + } + + public Builder acsIngressAcl(Boolean acsIngressAcl) { + this._acsIngressAcl = acsIngressAcl; + return this; + } + + public Builder networkReset(boolean networkReset) { + this._networkReset = networkReset; + return this; + } + + public Builder domainTemplateName(String domainTemplateName) { + this._domainTemplateName = domainTemplateName; + return this; + } + + @Override + public ApplyAclRuleVspCommand build() { + return new ApplyAclRuleVspCommand(_networkAcl, _networkUuid, _networkDomainUuid, _vpcOrSubnetUuid, _networkName, _isL2Network, _aclRules, + _networkId, _egressDefaultPolicy, _acsIngressAcl, _networkReset, _domainTemplateName); + } } @Override @@ -79,4 +191,49 @@ public class ApplyAclRuleVspCommand extends Command { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ApplyAclRuleVspCommand)) return false; + if (!super.equals(o)) return false; + + ApplyAclRuleVspCommand that = (ApplyAclRuleVspCommand) o; + + if (_egressDefaultPolicy != that._egressDefaultPolicy) return false; + if (_isL2Network != that._isL2Network) return false; + if (_networkAcl != that._networkAcl) return false; + if (_networkId != that._networkId) return false; + if (_networkReset != that._networkReset) return false; + if (_aclRules != null ? !_aclRules.equals(that._aclRules) : that._aclRules != null) return false; + if (_acsIngressAcl != null ? !_acsIngressAcl.equals(that._acsIngressAcl) : that._acsIngressAcl != null) + return false; + if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null) + return false; + if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null) + return false; + if (_networkName != null ? !_networkName.equals(that._networkName) : that._networkName != null) return false; + if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_vpcOrSubnetUuid != null ? !_vpcOrSubnetUuid.equals(that._vpcOrSubnetUuid) : that._vpcOrSubnetUuid != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_networkAcl ? 1 : 0); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0); + result = 31 * result + (_vpcOrSubnetUuid != null ? _vpcOrSubnetUuid.hashCode() : 0); + result = 31 * result + (_networkName != null ? _networkName.hashCode() : 0); + result = 31 * result + (_isL2Network ? 1 : 0); + result = 31 * result + (_aclRules != null ? _aclRules.hashCode() : 0); + result = 31 * result + (int) (_networkId ^ (_networkId >>> 32)); + result = 31 * result + (_egressDefaultPolicy ? 1 : 0); + result = 31 * result + (_acsIngressAcl != null ? _acsIngressAcl.hashCode() : 0); + result = 31 * result + (_networkReset ? 1 : 0); + result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java deleted file mode 100644 index c40c1a312f2..00000000000 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.agent.api.Answer; - -public class ApplyStaticNatVspAnswer extends Answer { - - public ApplyStaticNatVspAnswer(ApplyStaticNatVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } - - public ApplyStaticNatVspAnswer(ApplyStaticNatVspCommand cmd, Exception e) { - super(cmd, e); - } - -} 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 b013634e372..cc4e9300c94 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,23 +19,29 @@ package com.cloud.agent.api.element; +import com.cloud.agent.api.CmdBuilder; +import com.cloud.agent.api.Command; + import java.util.List; import java.util.Map; -import com.cloud.agent.api.Command; - public class ApplyStaticNatVspCommand extends Command { - String _networkDomainUuid; - String _vpcOrSubnetUuid; - boolean _isL3Network; - List> _staticNatDetails; + private final String _networkDomainUuid; + private final String _networkUuid; + private final String _vpcOrSubnetUuid; + private final boolean _isL3Network; + private final boolean _isVpc; + private final List> _staticNatDetails; - public ApplyStaticNatVspCommand(String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List> staticNatDetails) { + private ApplyStaticNatVspCommand(String networkDomainUuid, String networkUuid, String vpcOrSubnetUuid, boolean isL3Network, boolean isVpc, + List> staticNatDetails) { super(); this._networkDomainUuid = networkDomainUuid; + this._networkUuid = networkUuid; this._vpcOrSubnetUuid = vpcOrSubnetUuid; this._isL3Network = isL3Network; + this._isVpc = isVpc; this._staticNatDetails = staticNatDetails; } @@ -43,6 +49,10 @@ public class ApplyStaticNatVspCommand extends Command { return _networkDomainUuid; } + public String getNetworkUuid() { + return _networkUuid; + } + public String getVpcOrSubnetUuid() { return _vpcOrSubnetUuid; } @@ -51,13 +61,93 @@ public class ApplyStaticNatVspCommand extends Command { return _isL3Network; } + public boolean isVpc() { + return _isVpc; + } + public List> getStaticNatDetails() { return _staticNatDetails; } + public static class Builder implements CmdBuilder { + private String _networkDomainUuid; + private String _networkUuid; + private String _vpcOrSubnetUuid; + private boolean _isL3Network; + private boolean _isVpc; + private List> _staticNatDetails; + + public Builder networkDomainUuid(String networkDomainUuid) { + this._networkDomainUuid = networkDomainUuid; + return this; + } + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder vpcOrSubnetUuid(String vpcOrSubnetUuid) { + this._vpcOrSubnetUuid = vpcOrSubnetUuid; + return this; + } + + public Builder isL3Network(boolean isL3Network) { + this._isL3Network = isL3Network; + return this; + } + + public Builder isVpc(boolean isVpc) { + this._isVpc = isVpc; + return this; + } + + public Builder staticNatDetails(List> staticNatDetails) { + this._staticNatDetails = staticNatDetails; + return this; + } + + @Override + public ApplyStaticNatVspCommand build() { + return new ApplyStaticNatVspCommand(_networkDomainUuid, _networkUuid, _vpcOrSubnetUuid, _isL3Network, _isVpc, _staticNatDetails); + } + } + @Override public boolean executeInSequence() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ApplyStaticNatVspCommand)) return false; + if (!super.equals(o)) return false; + + ApplyStaticNatVspCommand that = (ApplyStaticNatVspCommand) o; + + if (_isL3Network != that._isL3Network) return false; + if (_isVpc != that._isVpc) return false; + if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null) + return false; + if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_staticNatDetails != null ? !_staticNatDetails.equals(that._staticNatDetails) : that._staticNatDetails != null) + return false; + if (_vpcOrSubnetUuid != null ? !_vpcOrSubnetUuid.equals(that._vpcOrSubnetUuid) : that._vpcOrSubnetUuid != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_vpcOrSubnetUuid != null ? _vpcOrSubnetUuid.hashCode() : 0); + result = 31 * result + (_isL3Network ? 1 : 0); + result = 31 * result + (_isVpc ? 1 : 0); + result = 31 * result + (_staticNatDetails != null ? _staticNatDetails.hashCode() : 0); + return result; + } } 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 new file mode 100644 index 00000000000..c1de6b9de82 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ImplementVspCommand.java @@ -0,0 +1,297 @@ +// +// 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 com.cloud.agent.api.CmdBuilder; +import com.cloud.agent.api.Command; + +import java.util.List; +import java.util.Map; + +public class ImplementVspCommand extends Command { + + private final long _networkId; + private final String _networkDomainUuid; + private final String _networkUuid; + private final String _networkName; + private final String _vpcOrSubnetUuid; + private final boolean _isL2Network; + private final boolean _isL3Network; + private final boolean _isVpc; + private final boolean _isShared; + private final String _domainTemplateName; + private final boolean _isFirewallServiceSupported; + private final List _dnsServers; + private final List> _ingressFirewallRules; + private final List> _egressFirewallRules; + private final List _acsFipUuid; + private final boolean _egressDefaultPolicy; + + private ImplementVspCommand(long networkId, String networkDomainUuid, String networkUuid, String networkName, String vpcOrSubnetUuid, boolean isL2Network, boolean isL3Network, + boolean isVpc, boolean isShared, String domainTemplateName, boolean isFirewallServiceSupported, List dnsServers, List> ingressFirewallRules, + List> egressFirewallRules, List acsFipUuid, boolean egressDefaultPolicy) { + super(); + this._networkId = networkId; + this._networkDomainUuid = networkDomainUuid; + this._networkUuid = networkUuid; + this._networkName = networkName; + this._vpcOrSubnetUuid = vpcOrSubnetUuid; + this._isL2Network = isL2Network; + this._isL3Network = isL3Network; + this._isVpc = isVpc; + this._isShared = isShared; + this._domainTemplateName = domainTemplateName; + this._isFirewallServiceSupported = isFirewallServiceSupported; + this._dnsServers = dnsServers; + this._ingressFirewallRules = ingressFirewallRules; + this._egressFirewallRules = egressFirewallRules; + this._acsFipUuid = acsFipUuid; + this._egressDefaultPolicy = egressDefaultPolicy; + } + + public long getNetworkId() { + return _networkId; + } + + public String getNetworkDomainUuid() { + return _networkDomainUuid; + } + + public String getNetworkUuid() { + return _networkUuid; + } + + public String getNetworkName() { + return _networkName; + } + + public String getVpcOrSubnetUuid() { + return _vpcOrSubnetUuid; + } + + public boolean isL2Network() { + return _isL2Network; + } + + public boolean isL3Network() { + return _isL3Network; + } + + public boolean isVpc() { + return _isVpc; + } + + public boolean isShared() { + return _isShared; + } + + public String getDomainTemplateName() { + return _domainTemplateName; + } + + public boolean isFirewallServiceSupported() { + return _isFirewallServiceSupported; + } + + public List getDnsServers() { + return _dnsServers; + } + + public List> getIngressFirewallRules() { + return _ingressFirewallRules; + } + + public List> getEgressFirewallRules() { + return _egressFirewallRules; + } + + public List getAcsFipUuid() { + return _acsFipUuid; + } + + public boolean isEgressDefaultPolicy() { + return _egressDefaultPolicy; + } + + public static class Builder implements CmdBuilder { + private long _networkId; + private String _networkDomainUuid; + private String _networkUuid; + private String _networkName; + private String _vpcOrSubnetUuid; + private boolean _isL2Network; + private boolean _isL3Network; + private boolean _isVpc; + private boolean _isShared; + private String _domainTemplateName; + private boolean _isFirewallServiceSupported; + private List _dnsServers; + private List> _ingressFirewallRules; + private List> _egressFirewallRules; + private List _acsFipUuid; + private boolean _egressDefaultPolicy; + + public Builder networkId(long networkId) { + this._networkId = networkId; + return this; + } + + public Builder networkDomainUuid(String networkDomainUuid) { + this._networkDomainUuid = networkDomainUuid; + return this; + } + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder networkName(String networkName) { + this._networkName = networkName; + return this; + } + + public Builder vpcOrSubnetUuid(String vpcOrSubnetUuid) { + this._vpcOrSubnetUuid = vpcOrSubnetUuid; + return this; + } + + public Builder isL2Network(boolean isL2Network) { + this._isL2Network = isL2Network; + return this; + } + + public Builder isL3Network(boolean isL3Network) { + this._isL3Network = isL3Network; + return this; + } + + public Builder isVpc(boolean isVpc) { + this._isVpc = isVpc; + return this; + } + + public Builder isShared(boolean isShared) { + this._isShared = isShared; + return this; + } + + public Builder domainTemplateName(String domainTemplateName) { + this._domainTemplateName = domainTemplateName; + return this; + } + + public Builder isFirewallServiceSupported(boolean isFirewallServiceSupported) { + this._isFirewallServiceSupported = isFirewallServiceSupported; + return this; + } + + public Builder dnsServers(List dnsServers) { + this._dnsServers = dnsServers; + return this; + } + + public Builder ingressFirewallRules(List> ingressFirewallRules) { + this._ingressFirewallRules = ingressFirewallRules; + return this; + } + + public Builder egressFirewallRules(List> egressFirewallRules) { + this._egressFirewallRules = egressFirewallRules; + return this; + } + + public Builder acsFipUuid(List acsFipUuid) { + this._acsFipUuid = acsFipUuid; + return this; + } + + public Builder egressDefaultPolicy(boolean egressDefaultPolicy) { + this._egressDefaultPolicy = egressDefaultPolicy; + return this; + } + + @Override + public ImplementVspCommand build() { + return new ImplementVspCommand(_networkId, _networkDomainUuid, _networkUuid, _networkName, _vpcOrSubnetUuid, _isL2Network, _isL3Network, _isVpc, _isShared, + _domainTemplateName, _isFirewallServiceSupported, _dnsServers, _ingressFirewallRules, _egressFirewallRules, _acsFipUuid, _egressDefaultPolicy); + } + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ImplementVspCommand)) return false; + if (!super.equals(o)) return false; + + ImplementVspCommand that = (ImplementVspCommand) o; + + if (_egressDefaultPolicy != that._egressDefaultPolicy) return false; + if (_isFirewallServiceSupported != that._isFirewallServiceSupported) return false; + if (_isL2Network != that._isL2Network) return false; + if (_isL3Network != that._isL3Network) return false; + if (_isShared != that._isShared) return false; + if (_isVpc != that._isVpc) return false; + if (_networkId != that._networkId) return false; + if (_acsFipUuid != null ? !_acsFipUuid.equals(that._acsFipUuid) : that._acsFipUuid != null) return false; + if (_dnsServers != null ? !_dnsServers.equals(that._dnsServers) : that._dnsServers != null) return false; + if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null) + return false; + if (_egressFirewallRules != null ? !_egressFirewallRules.equals(that._egressFirewallRules) : that._egressFirewallRules != null) + return false; + if (_ingressFirewallRules != null ? !_ingressFirewallRules.equals(that._ingressFirewallRules) : that._ingressFirewallRules != null) + return false; + if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null) + return false; + if (_networkName != null ? !_networkName.equals(that._networkName) : that._networkName != null) return false; + if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_vpcOrSubnetUuid != null ? !_vpcOrSubnetUuid.equals(that._vpcOrSubnetUuid) : that._vpcOrSubnetUuid != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (int) (_networkId ^ (_networkId >>> 32)); + result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_networkName != null ? _networkName.hashCode() : 0); + result = 31 * result + (_vpcOrSubnetUuid != null ? _vpcOrSubnetUuid.hashCode() : 0); + result = 31 * result + (_isL2Network ? 1 : 0); + result = 31 * result + (_isL3Network ? 1 : 0); + result = 31 * result + (_isVpc ? 1 : 0); + result = 31 * result + (_isShared ? 1 : 0); + result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0); + result = 31 * result + (_isFirewallServiceSupported ? 1 : 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 + (_acsFipUuid != null ? _acsFipUuid.hashCode() : 0); + result = 31 * result + (_egressDefaultPolicy ? 1 : 0); + return result; + } +} diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java deleted file mode 100644 index 592216e12ee..00000000000 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.agent.api.Answer; - -public class ShutDownVpcVspAnswer extends Answer { - - public ShutDownVpcVspAnswer(ShutDownVpcVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } - - public ShutDownVpcVspAnswer(ShutDownVpcVspCommand cmd, Exception e) { - super(cmd, e); - } - -} 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 fc05559514c..4c41e5140ae 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,17 +19,20 @@ package com.cloud.agent.api.element; +import com.cloud.agent.api.CmdBuilder; import com.cloud.agent.api.Command; public class ShutDownVpcVspCommand extends Command { - String _domainUuid; - String _vpcUuid; + private final String _domainUuid; + private final String _vpcUuid; + private final String _domainTemplateName; - public ShutDownVpcVspCommand(String domainUuid, String vpcUuid) { + private ShutDownVpcVspCommand(String domainUuid, String vpcUuid, String domainTemplateName) { super(); this._domainUuid = domainUuid; this._vpcUuid = vpcUuid; + this._domainTemplateName = domainTemplateName; } public String getDomainUuid() { @@ -40,9 +43,63 @@ public class ShutDownVpcVspCommand extends Command { return _vpcUuid; } + public String getDomainTemplateName() { + return _domainTemplateName; + } + + public static class Builder implements CmdBuilder { + private String _domainUuid; + private String _vpcUuid; + private String _domainTemplateName; + + public Builder domainUuid(String domainUuid) { + this._domainUuid = domainUuid; + return this; + } + + public Builder vpcUuid(String vpcUuid) { + this._vpcUuid = vpcUuid; + return this; + } + + public Builder domainTemplateName(String domainTemplateName) { + this._domainTemplateName = domainTemplateName; + return this; + } + + @Override + public ShutDownVpcVspCommand build() { + return new ShutDownVpcVspCommand(_domainUuid, _vpcUuid, _domainTemplateName); + } + } + @Override public boolean executeInSequence() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ShutDownVpcVspCommand)) return false; + if (!super.equals(o)) return false; + + ShutDownVpcVspCommand that = (ShutDownVpcVspCommand) o; + + 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; + } + + @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); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java deleted file mode 100644 index 57ecf296cd9..00000000000 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; - -public class DeallocateVmVspAnswer extends Answer { - - public DeallocateVmVspAnswer(Command command, Exception e) { - super(command, e); - } - - public DeallocateVmVspAnswer(DeallocateVmVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } -} 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 19c904f9f20..421fa4c6896 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,40 +19,45 @@ package com.cloud.agent.api.guru; +import com.cloud.agent.api.CmdBuilder; import com.cloud.agent.api.Command; public class DeallocateVmVspCommand extends Command { - String _networkUuid; - String _nicFrmDdUuid; - String _nicMacAddress; - String _nicIp4Address; - boolean _isL3Network; - String _vpcUuid; - String _networksDomainUuid; - String _vmInstanceName; - String _vmUuid; + private final String _networkUuid; + private final String _nicFromDdUuid; + private final String _nicMacAddress; + private final String _nicIp4Address; + private final boolean _isL3Network; + private final boolean _isSharedNetwork; + private final String _vpcUuid; + private final String _networksDomainUuid; + private final String _vmInstanceName; + private final String _vmUuid; + private final boolean _isExpungingState; - public DeallocateVmVspCommand(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, String vpcUuid, - String networksDomainUuid, String vmInstanceName, String vmUuid) { + private DeallocateVmVspCommand(String networkUuid, String nicFromDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, + String networksDomainUuid, String vmInstanceName, String vmUuid, boolean isExpungingState) { super(); this._networkUuid = networkUuid; - this._nicFrmDdUuid = nicFrmDdUuid; + this._nicFromDdUuid = nicFromDdUuid; this._nicMacAddress = nicMacAddress; this._nicIp4Address = nicIp4Address; this._isL3Network = isL3Network; + this._isSharedNetwork = isSharedNetwork; this._vpcUuid = vpcUuid; this._networksDomainUuid = networksDomainUuid; this._vmInstanceName = vmInstanceName; this._vmUuid = vmUuid; + this._isExpungingState = isExpungingState; } public String getNetworkUuid() { return _networkUuid; } - public String getNicFrmDdUuid() { - return _nicFrmDdUuid; + public String getNicFromDdUuid() { + return _nicFromDdUuid; } public String getNicMacAddress() { @@ -67,6 +72,10 @@ public class DeallocateVmVspCommand extends Command { return _isL3Network; } + public boolean isSharedNetwork() { + return _isSharedNetwork; + } + public String getVpcUuid() { return _vpcUuid; } @@ -83,9 +92,132 @@ public class DeallocateVmVspCommand extends Command { return _vmUuid; } + public boolean isExpungingState() { + return _isExpungingState; + } + + public static class Builder implements CmdBuilder { + private String _networkUuid; + private String _nicFromDdUuid; + private String _nicMacAddress; + private String _nicIp4Address; + private boolean _isL3Network; + private boolean _isSharedNetwork; + private String _vpcUuid; + private String _networksDomainUuid; + private String _vmInstanceName; + private String _vmUuid; + private boolean _isExpungingState; + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder nicFromDbUuid(String nicFromDbUuid) { + this._nicFromDdUuid = nicFromDbUuid; + return this; + } + + public Builder nicMacAddress(String nicMacAddress) { + this._nicMacAddress = nicMacAddress; + return this; + } + + public Builder nicIp4Address(String nicIp4Address) { + this._nicIp4Address = nicIp4Address; + return this; + } + + public Builder isL3Network(boolean isL3Network) { + this._isL3Network = isL3Network; + return this; + } + + public Builder isSharedNetwork(boolean isSharedNetwork) { + this._isSharedNetwork = isSharedNetwork; + return this; + } + + public Builder vpcUuid(String vpcUuid) { + this._vpcUuid = vpcUuid; + return this; + } + + public Builder networksDomainUuid(String networksDomainUuid) { + this._networksDomainUuid = networksDomainUuid; + return this; + } + + public Builder vmInstanceName(String vmInstanceName) { + this._vmInstanceName = vmInstanceName; + return this; + } + + public Builder vmUuid(String vmUuid) { + this._vmUuid = vmUuid; + return this; + } + + public Builder isExpungingState(boolean isExpungingState) { + this._isExpungingState = isExpungingState; + return this; + } + + @Override + public DeallocateVmVspCommand build() { + return new DeallocateVmVspCommand(_networkUuid,_nicFromDdUuid, _nicMacAddress, _nicIp4Address, _isL3Network, _isSharedNetwork, _vpcUuid, + _networksDomainUuid, _vmInstanceName, _vmUuid, _isExpungingState); + } + } + @Override public boolean executeInSequence() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DeallocateVmVspCommand)) return false; + if (!super.equals(o)) return false; + + DeallocateVmVspCommand that = (DeallocateVmVspCommand) o; + + if (_isExpungingState != that._isExpungingState) return false; + if (_isL3Network != that._isL3Network) return false; + if (_isSharedNetwork != that._isSharedNetwork) return false; + if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_networksDomainUuid != null ? !_networksDomainUuid.equals(that._networksDomainUuid) : that._networksDomainUuid != null) + return false; + if (_nicFromDdUuid != null ? !_nicFromDdUuid.equals(that._nicFromDdUuid) : that._nicFromDdUuid != null) + return false; + if (_nicIp4Address != null ? !_nicIp4Address.equals(that._nicIp4Address) : that._nicIp4Address != null) + return false; + if (_nicMacAddress != null ? !_nicMacAddress.equals(that._nicMacAddress) : that._nicMacAddress != null) + return false; + if (_vmInstanceName != null ? !_vmInstanceName.equals(that._vmInstanceName) : that._vmInstanceName != null) + return false; + if (_vmUuid != null ? !_vmUuid.equals(that._vmUuid) : that._vmUuid != null) return false; + if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_nicFromDdUuid != null ? _nicFromDdUuid.hashCode() : 0); + result = 31 * result + (_nicMacAddress != null ? _nicMacAddress.hashCode() : 0); + result = 31 * result + (_nicIp4Address != null ? _nicIp4Address.hashCode() : 0); + result = 31 * result + (_isL3Network ? 1 : 0); + result = 31 * result + (_isSharedNetwork ? 1 : 0); + result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0); + result = 31 * result + (_networksDomainUuid != null ? _networksDomainUuid.hashCode() : 0); + result = 31 * result + (_vmInstanceName != null ? _vmInstanceName.hashCode() : 0); + result = 31 * result + (_vmUuid != null ? _vmUuid.hashCode() : 0); + result = 31 * result + (_isExpungingState ? 1 : 0); + return result; + } } 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 0ffbda42a37..575e57d3623 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,30 +19,39 @@ package com.cloud.agent.api.guru; -import java.util.Collection; - +import com.cloud.agent.api.CmdBuilder; import com.cloud.agent.api.Command; +import java.util.Collection; +import java.util.List; + public class ImplementNetworkVspCommand extends Command { - String _networkDomainName; - String _networkDomainPath; - String _networkDomainUuid; - String _networkAccountName; - String _networkAccountUuid; - String _networkName; - String _networkCidr; - String _networkGateway; - String _networkUuid; - boolean _isL3Network; - String _vpcName; - String _vpcUuid; - boolean _defaultEgressPolicy; - Collection _ipAddressRange; + private final String _networkDomainName; + private final String _networkDomainPath; + private final String _networkDomainUuid; + private final String _networkAccountName; + private final String _networkAccountUuid; + private final String _networkName; + private final String _networkCidr; + private final String _networkGateway; + private final Long _networkAclId; + private final List _dnsServers; + private final List _gatewaySystemIds; + private final String _networkUuid; + private final boolean _isL3Network; + private final boolean _isVpc; + private final boolean _isSharedNetwork; + private final String _vpcName; + private final String _vpcUuid; + private final boolean _defaultEgressPolicy; + private final List _ipAddressRange; + private final String _domainTemplateName; - public ImplementNetworkVspCommand(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid, - String networkName, String networkCidr, String networkGateway, String networkUuid, boolean isL3Network, String vpcName, String vpcUuid, boolean defaultEgressPolicy, - Collection ipAddressRange) { + private ImplementNetworkVspCommand(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid, + String networkName, String networkCidr, String networkGateway, Long networkAclId, List dnsServers, List gatewaySystemIds, String networkUuid, + boolean isL3Network, boolean isVpc, boolean isSharedNetwork, String vpcName, String vpcUuid, boolean defaultEgressPolicy, List ipAddressRange, + String domainTemplateName) { super(); this._networkDomainName = networkDomainName; this._networkDomainPath = networkDomainPath; @@ -52,12 +61,18 @@ public class ImplementNetworkVspCommand extends Command { this._networkName = networkName; this._networkCidr = networkCidr; this._networkGateway = networkGateway; + this._networkAclId = networkAclId; + this._dnsServers = dnsServers; + this._gatewaySystemIds = gatewaySystemIds; this._networkUuid = networkUuid; this._isL3Network = isL3Network; + this._isVpc = isVpc; + this._isSharedNetwork = isSharedNetwork; this._vpcName = vpcName; this._vpcUuid = vpcUuid; this._defaultEgressPolicy = defaultEgressPolicy; this._ipAddressRange = ipAddressRange; + this._domainTemplateName = domainTemplateName; } public String getNetworkDomainName() { @@ -92,6 +107,18 @@ public class ImplementNetworkVspCommand extends Command { return _networkGateway; } + public Long getNetworkAclId() { + return _networkAclId; + } + + public List getDnsServers() { + return _dnsServers; + } + + public List getGatewaySystemIds() { + return _gatewaySystemIds; + } + public String getNetworkUuid() { return _networkUuid; } @@ -100,6 +127,14 @@ public class ImplementNetworkVspCommand extends Command { return _isL3Network; } + public boolean isVpc() { + return _isVpc; + } + + public boolean isSharedNetwork() { + return _isSharedNetwork; + } + public String getVpcName() { return _vpcName; } @@ -112,13 +147,214 @@ public class ImplementNetworkVspCommand extends Command { return _defaultEgressPolicy; } - public Collection getIpAddressRange() { + public Collection getIpAddressRange() { return _ipAddressRange; } + public String getDomainTemplateName() { + return _domainTemplateName; + } + + public static class Builder implements CmdBuilder { + private String _networkDomainName; + private String _networkDomainPath; + private String _networkDomainUuid; + private String _networkAccountName; + private String _networkAccountUuid; + private String _networkName; + private String _networkCidr; + private String _networkGateway; + private Long _networkAclId; + private List _dnsServers; + private List _gatewaySystemIds; + private String _networkUuid; + private boolean _isL3Network; + private boolean _isVpc; + private boolean _isSharedNetwork; + private String _vpcName; + private String _vpcUuid; + private boolean _defaultEgressPolicy; + private List _ipAddressRange; + private String _domainTemplateName; + + public Builder networkDomainName(String networkDomainName) { + this._networkDomainName = networkDomainName; + return this; + } + + public Builder networkDomainPath(String networkDomainPath) { + this._networkDomainPath = networkDomainPath; + return this; + } + + public Builder networkDomainUuid(String networkDomainUuid) { + this._networkDomainUuid = networkDomainUuid; + return this; + } + + public Builder networkAccountName(String networkAccountName) { + this._networkAccountName = networkAccountName; + return this; + } + + public Builder networkAccountUuid(String networkAccountUuid) { + this._networkAccountUuid = networkAccountUuid; + return this; + } + + public Builder networkName(String networkName) { + this._networkName = networkName; + return this; + } + + public Builder networkCidr(String networkCidr) { + this._networkCidr = networkCidr; + return this; + } + + public Builder networkGateway(String networkGateway) { + this._networkGateway = networkGateway; + return this; + } + + public Builder networkAclId(Long networkAclId) { + this._networkAclId = networkAclId; + return this; + } + + public Builder dnsServers(List dnsServers) { + this._dnsServers = dnsServers; + return this; + } + + public Builder gatewaySystemIds(List gatewaySystemIds) { + this._gatewaySystemIds = gatewaySystemIds; + return this; + } + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder isL3Network(boolean isL3Network) { + this._isL3Network = isL3Network; + return this; + } + + public Builder isVpc(boolean isVpc) { + this._isVpc = isVpc; + return this; + } + + public Builder isSharedNetwork(boolean isSharedNetwork) { + this._isSharedNetwork = isSharedNetwork; + return this; + } + + public Builder vpcName(String vpcName) { + this._vpcName = vpcName; + return this; + } + + public Builder vpcUuid(String vpcUuid) { + this._vpcUuid = vpcUuid; + return this; + } + + public Builder defaultEgressPolicy(boolean defaultEgressPolicy) { + this._defaultEgressPolicy = defaultEgressPolicy; + return this; + } + + public Builder ipAddressRange(List ipAddressRange) { + this._ipAddressRange = ipAddressRange; + return this; + } + + public Builder domainTemplateName(String domainTemplateName) { + this._domainTemplateName = domainTemplateName; + return this; + } + + @Override + public ImplementNetworkVspCommand build() { + return new ImplementNetworkVspCommand(_networkDomainName, _networkDomainPath, _networkDomainUuid, _networkAccountName, _networkAccountUuid, _networkName, + _networkCidr, _networkGateway, _networkAclId, _dnsServers, _gatewaySystemIds, _networkUuid, _isL3Network, _isVpc, _isSharedNetwork, _vpcName, _vpcUuid, + _defaultEgressPolicy, _ipAddressRange, _domainTemplateName); + } + } + @Override public boolean executeInSequence() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ImplementNetworkVspCommand)) return false; + if (!super.equals(o)) return false; + + ImplementNetworkVspCommand that = (ImplementNetworkVspCommand) o; + + if (_defaultEgressPolicy != that._defaultEgressPolicy) return false; + if (_isL3Network != that._isL3Network) return false; + if (_isSharedNetwork != that._isSharedNetwork) return false; + if (_isVpc != that._isVpc) return false; + if (_dnsServers != null ? !_dnsServers.equals(that._dnsServers) : that._dnsServers != null) return false; + if (_domainTemplateName != null ? !_domainTemplateName.equals(that._domainTemplateName) : that._domainTemplateName != null) + return false; + if (_gatewaySystemIds != null ? !_gatewaySystemIds.equals(that._gatewaySystemIds) : that._gatewaySystemIds != null) + return false; + if (_ipAddressRange != null ? !_ipAddressRange.equals(that._ipAddressRange) : that._ipAddressRange != null) + return false; + if (_networkAccountName != null ? !_networkAccountName.equals(that._networkAccountName) : that._networkAccountName != null) + return false; + if (_networkAccountUuid != null ? !_networkAccountUuid.equals(that._networkAccountUuid) : that._networkAccountUuid != null) + return false; + if (_networkAclId != null ? !_networkAclId.equals(that._networkAclId) : that._networkAclId != null) + return false; + if (_networkCidr != null ? !_networkCidr.equals(that._networkCidr) : that._networkCidr != null) return false; + if (_networkDomainName != null ? !_networkDomainName.equals(that._networkDomainName) : that._networkDomainName != null) + return false; + if (_networkDomainPath != null ? !_networkDomainPath.equals(that._networkDomainPath) : that._networkDomainPath != null) + return false; + if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null) + return false; + if (_networkGateway != null ? !_networkGateway.equals(that._networkGateway) : that._networkGateway != null) + return false; + if (_networkName != null ? !_networkName.equals(that._networkName) : that._networkName != null) return false; + if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_vpcName != null ? !_vpcName.equals(that._vpcName) : that._vpcName != null) return false; + if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_networkDomainName != null ? _networkDomainName.hashCode() : 0); + result = 31 * result + (_networkDomainPath != null ? _networkDomainPath.hashCode() : 0); + result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0); + result = 31 * result + (_networkAccountName != null ? _networkAccountName.hashCode() : 0); + result = 31 * result + (_networkAccountUuid != null ? _networkAccountUuid.hashCode() : 0); + result = 31 * result + (_networkName != null ? _networkName.hashCode() : 0); + result = 31 * result + (_networkCidr != null ? _networkCidr.hashCode() : 0); + result = 31 * result + (_networkGateway != null ? _networkGateway.hashCode() : 0); + result = 31 * result + (_networkAclId != null ? _networkAclId.hashCode() : 0); + result = 31 * result + (_dnsServers != null ? _dnsServers.hashCode() : 0); + result = 31 * result + (_gatewaySystemIds != null ? _gatewaySystemIds.hashCode() : 0); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_isL3Network ? 1 : 0); + result = 31 * result + (_isVpc ? 1 : 0); + result = 31 * result + (_isSharedNetwork ? 1 : 0); + result = 31 * result + (_vpcName != null ? _vpcName.hashCode() : 0); + result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0); + result = 31 * result + (_defaultEgressPolicy ? 1 : 0); + result = 31 * result + (_ipAddressRange != null ? _ipAddressRange.hashCode() : 0); + result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java deleted file mode 100644 index 8bc8e4c4da0..00000000000 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; - -public class ReleaseVmVspAnswer extends Answer { - - public ReleaseVmVspAnswer(Command command, Exception e) { - super(command, e); - } - - public ReleaseVmVspAnswer(ReleaseVmVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } -} 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 6844bf9d1be..abcd0f2c694 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,31 +19,45 @@ package com.cloud.agent.api.guru; +import com.cloud.agent.api.CmdBuilder; import com.cloud.agent.api.Command; public class ReserveVmInterfaceVspCommand extends Command { - String _nicUuid; - String _nicMacAddress; - String _networkUuid; - boolean _isL3Network; - String _vpcUuid; - String _networkDomainUuid; - String _networksAccountUuid; - boolean _isDomainRouter; - String _domainRouterIp; - String _vmInstanceName; - String _vmUuid; - String _vmUserName; - String _vmUserDomainName; + private final String _nicUuid; + private final String _nicMacAddress; + private final String _networkUuid; + private final boolean _isL3Network; + private final boolean _isSharedNetwork; + private final String _vpcUuid; + private final String _networkDomainUuid; + private final String _networksAccountUuid; + private final boolean _isDomainRouter; + private final String _domainRouterIp; + private final String _vmInstanceName; + private final String _vmUuid; + private final String _vmUserName; + private final String _vmUserDomainName; + private final boolean _useStaticIp; + private final String _staticIp; + private final String _staticNatIpUuid; + private final String _staticNatIpAddress; + private final boolean _isStaticNatIpAllocated; + private final boolean _isOneToOneNat; + private final String _staticNatVlanUuid; + private final String _staticNatVlanGateway; + private final String _staticNatVlanNetmask; - public ReserveVmInterfaceVspCommand(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, String vpcUuid, String networkDomainUuid, - String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid, String vmUserName, String vmUserDomainName) { + private ReserveVmInterfaceVspCommand(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String networkDomainUuid, + String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid, String vmUserName, String vmUserDomainName, + boolean useStaticIp, String staticIp, String staticNatIpUuid, String staticNatIpAddress, boolean isStaticNatIpAllocated, boolean isOneToOneNat, String staticNatVlanUuid, + String staticNatVlanGateway, String staticNatVlanNetmask) { super(); this._nicUuid = nicUuid; this._nicMacAddress = nicMacAddress; this._networkUuid = networkUuid; this._isL3Network = isL3Network; + this._isSharedNetwork = isSharedNetwork; this._vpcUuid = vpcUuid; this._networkDomainUuid = networkDomainUuid; this._networksAccountUuid = networksAccountUuid; @@ -53,6 +67,15 @@ public class ReserveVmInterfaceVspCommand extends Command { this._vmUuid = vmUuid; this._vmUserName = vmUserName; this._vmUserDomainName = vmUserDomainName; + this._useStaticIp = useStaticIp; + this._staticIp = staticIp; + this._staticNatIpUuid = staticNatIpUuid; + this._staticNatIpAddress = staticNatIpAddress; + this._isStaticNatIpAllocated = isStaticNatIpAllocated; + this._isOneToOneNat = isOneToOneNat; + this._staticNatVlanUuid = staticNatVlanUuid; + this._staticNatVlanGateway = staticNatVlanGateway; + this._staticNatVlanNetmask = staticNatVlanNetmask; } public String getNicUuid() { @@ -71,6 +94,10 @@ public class ReserveVmInterfaceVspCommand extends Command { return _isL3Network; } + public boolean isSharedNetwork() { + return _isSharedNetwork; + } + public String getVpcUuid() { return _vpcUuid; } @@ -87,29 +114,287 @@ public class ReserveVmInterfaceVspCommand extends Command { return _isDomainRouter; } - public String _getDomainRouterIp() { + public String getDomainRouterIp() { return _domainRouterIp; } - public String _getVmInstanceName() { + public String getVmInstanceName() { return _vmInstanceName; } - public String _getVmUuid() { + public String getVmUuid() { return _vmUuid; } - public String _getVmUserName() { + public String getVmUserName() { return _vmUserName; } - public String _getVmUserDomainName() { + public String getVmUserDomainName() { return _vmUserDomainName; } + public boolean useStaticIp() { + return _useStaticIp; + } + + public String getStaticIp() { + return _staticIp; + } + + public String getStaticNatIpUuid() { + return _staticNatIpUuid; + } + + public String getStaticNatIpAddress() { + return _staticNatIpAddress; + } + + public boolean isStaticNatIpAllocated() { + return _isStaticNatIpAllocated; + } + + public boolean isOneToOneNat() { + return _isOneToOneNat; + } + + public String getStaticNatVlanUuid() { + return _staticNatVlanUuid; + } + + public String getStaticNatVlanGateway() { + return _staticNatVlanGateway; + } + + public String getStaticNatVlanNetmask() { + return _staticNatVlanNetmask; + } + + public static class Builder implements CmdBuilder { + private String _nicUuid; + private String _nicMacAddress; + private String _networkUuid; + private boolean _isL3Network; + private boolean _isSharedNetwork; + private String _vpcUuid; + private String _networkDomainUuid; + private String _networksAccountUuid; + private boolean _isDomainRouter; + private String _domainRouterIp; + private String _vmInstanceName; + private String _vmUuid; + private String _vmUserName; + private String _vmUserDomainName; + private boolean _useStaticIp; + private String _staticIp; + private String _staticNatIpUuid; + private String _staticNatIpAddress; + private boolean _isStaticNatIpAllocated; + private boolean _isOneToOneNat; + private String _staticNatVlanUuid; + private String _staticNatVlanGateway; + private String _staticNatVlanNetmask; + + public Builder nicUuid(String nicUuid) { + this._nicUuid = nicUuid; + return this; + } + + public Builder nicMacAddress(String nicMacAddress) { + this._nicMacAddress = nicMacAddress; + return this; + } + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder isL3Network(boolean isL3Network) { + this._isL3Network = isL3Network; + return this; + } + + public Builder isSharedNetwork(boolean isSharedNetwork) { + this._isSharedNetwork = isSharedNetwork; + return this; + } + + public Builder vpcUuid(String vpcUuid) { + this._vpcUuid = vpcUuid; + return this; + } + + public Builder networkDomainUuid(String networkDomainUuid) { + this._networkDomainUuid = networkDomainUuid; + return this; + } + + public Builder networksAccountUuid(String networksAccountUuid) { + this._networksAccountUuid = networksAccountUuid; + return this; + } + + public Builder isDomainRouter(boolean isDomainRouter) { + this._isDomainRouter = isDomainRouter; + return this; + } + + public Builder domainRouterIp(String domainRouterIp) { + this._domainRouterIp = domainRouterIp; + return this; + } + + public Builder vmInstanceName(String vmInstanceName) { + this._vmInstanceName = vmInstanceName; + return this; + } + + public Builder vmUuid(String vmUuid) { + this._vmUuid = vmUuid; + return this; + } + + public Builder vmUserName(String vmUserName) { + this._vmUserName = vmUserName; + return this; + } + + public Builder vmUserDomainName(String vmUserDomainName) { + this._vmUserDomainName = vmUserDomainName; + return this; + } + + public Builder useStaticIp(boolean useStaticIp) { + this._useStaticIp = useStaticIp; + return this; + } + + public Builder staticIp(String staticIp) { + this._staticIp = staticIp; + return this; + } + + public Builder staticNatIpUuid(String staticNatIpUuid) { + this._staticNatIpUuid = staticNatIpUuid; + return this; + } + + public Builder staticNatIpAddress(String staticNatIpAddress) { + this._staticNatIpAddress = staticNatIpAddress; + return this; + } + + public Builder isStaticNatIpAllocated(boolean isStaticNatIpAllocated) { + this._isStaticNatIpAllocated = isStaticNatIpAllocated; + return this; + } + + public Builder isOneToOneNat(boolean isOneToOneNat) { + this._isOneToOneNat = isOneToOneNat; + return this; + } + + public Builder staticNatVlanUuid(String staticNatVlanUuid) { + this._staticNatVlanUuid = staticNatVlanUuid; + return this; + } + + public Builder staticNatVlanGateway(String staticNatVlanGateway) { + this._staticNatVlanGateway = staticNatVlanGateway; + return this; + } + + public Builder staticNatVlanNetmask(String staticNatVlanNetmask) { + this._staticNatVlanNetmask = staticNatVlanNetmask; + return this; + } + + @Override + public ReserveVmInterfaceVspCommand build() { + return new ReserveVmInterfaceVspCommand(_nicUuid, _nicMacAddress, _networkUuid, _isL3Network, _isSharedNetwork, _vpcUuid, _networkDomainUuid, _networksAccountUuid, + _isDomainRouter, _domainRouterIp, _vmInstanceName, _vmUuid, _vmUserName, _vmUserDomainName, _useStaticIp, _staticIp, _staticNatIpUuid, _staticNatIpAddress, + _isStaticNatIpAllocated, _isOneToOneNat, _staticNatVlanUuid, _staticNatVlanGateway, _staticNatVlanNetmask); + } + } + @Override public boolean executeInSequence() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ReserveVmInterfaceVspCommand)) return false; + if (!super.equals(o)) return false; + + ReserveVmInterfaceVspCommand that = (ReserveVmInterfaceVspCommand) o; + + if (_isDomainRouter != that._isDomainRouter) return false; + if (_isL3Network != that._isL3Network) return false; + if (_isOneToOneNat != that._isOneToOneNat) return false; + if (_isSharedNetwork != that._isSharedNetwork) return false; + if (_isStaticNatIpAllocated != that._isStaticNatIpAllocated) return false; + if (_useStaticIp != that._useStaticIp) return false; + if (_domainRouterIp != null ? !_domainRouterIp.equals(that._domainRouterIp) : that._domainRouterIp != null) + return false; + if (_networkDomainUuid != null ? !_networkDomainUuid.equals(that._networkDomainUuid) : that._networkDomainUuid != null) + return false; + if (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_networksAccountUuid != null ? !_networksAccountUuid.equals(that._networksAccountUuid) : that._networksAccountUuid != null) + return false; + if (_nicMacAddress != null ? !_nicMacAddress.equals(that._nicMacAddress) : that._nicMacAddress != null) + return false; + if (_nicUuid != null ? !_nicUuid.equals(that._nicUuid) : that._nicUuid != null) return false; + if (_staticIp != null ? !_staticIp.equals(that._staticIp) : that._staticIp != null) return false; + if (_staticNatIpAddress != null ? !_staticNatIpAddress.equals(that._staticNatIpAddress) : that._staticNatIpAddress != null) + return false; + if (_staticNatIpUuid != null ? !_staticNatIpUuid.equals(that._staticNatIpUuid) : that._staticNatIpUuid != null) + return false; + if (_staticNatVlanGateway != null ? !_staticNatVlanGateway.equals(that._staticNatVlanGateway) : that._staticNatVlanGateway != null) + return false; + if (_staticNatVlanNetmask != null ? !_staticNatVlanNetmask.equals(that._staticNatVlanNetmask) : that._staticNatVlanNetmask != null) + return false; + if (_staticNatVlanUuid != null ? !_staticNatVlanUuid.equals(that._staticNatVlanUuid) : that._staticNatVlanUuid != null) + return false; + if (_vmInstanceName != null ? !_vmInstanceName.equals(that._vmInstanceName) : that._vmInstanceName != null) + return false; + if (_vmUserDomainName != null ? !_vmUserDomainName.equals(that._vmUserDomainName) : that._vmUserDomainName != null) + return false; + if (_vmUserName != null ? !_vmUserName.equals(that._vmUserName) : that._vmUserName != null) return false; + if (_vmUuid != null ? !_vmUuid.equals(that._vmUuid) : that._vmUuid != null) return false; + if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_nicUuid != null ? _nicUuid.hashCode() : 0); + result = 31 * result + (_nicMacAddress != null ? _nicMacAddress.hashCode() : 0); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_isL3Network ? 1 : 0); + result = 31 * result + (_isSharedNetwork ? 1 : 0); + result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0); + result = 31 * result + (_networkDomainUuid != null ? _networkDomainUuid.hashCode() : 0); + result = 31 * result + (_networksAccountUuid != null ? _networksAccountUuid.hashCode() : 0); + result = 31 * result + (_isDomainRouter ? 1 : 0); + result = 31 * result + (_domainRouterIp != null ? _domainRouterIp.hashCode() : 0); + result = 31 * result + (_vmInstanceName != null ? _vmInstanceName.hashCode() : 0); + result = 31 * result + (_vmUuid != null ? _vmUuid.hashCode() : 0); + result = 31 * result + (_vmUserName != null ? _vmUserName.hashCode() : 0); + result = 31 * result + (_vmUserDomainName != null ? _vmUserDomainName.hashCode() : 0); + result = 31 * result + (_useStaticIp ? 1 : 0); + result = 31 * result + (_staticIp != null ? _staticIp.hashCode() : 0); + result = 31 * result + (_staticNatIpUuid != null ? _staticNatIpUuid.hashCode() : 0); + result = 31 * result + (_staticNatIpAddress != null ? _staticNatIpAddress.hashCode() : 0); + result = 31 * result + (_isStaticNatIpAllocated ? 1 : 0); + result = 31 * result + (_isOneToOneNat ? 1 : 0); + result = 31 * result + (_staticNatVlanUuid != null ? _staticNatVlanUuid.hashCode() : 0); + result = 31 * result + (_staticNatVlanGateway != null ? _staticNatVlanGateway.hashCode() : 0); + result = 31 * result + (_staticNatVlanNetmask != null ? _staticNatVlanNetmask.hashCode() : 0); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java deleted file mode 100644 index 0c0c0d2eeee..00000000000 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -// -// 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 com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; - -public class TrashNetworkVspAnswer extends Answer { - - public TrashNetworkVspAnswer(Command command, Exception e) { - super(command, e); - } - - public TrashNetworkVspAnswer(TrashNetworkVspCommand cmd, boolean success, String details) { - super(cmd, success, details); - } -} 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 e10e9beb001..4a01fdcc3de 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,21 +19,26 @@ package com.cloud.agent.api.guru; +import com.cloud.agent.api.CmdBuilder; import com.cloud.agent.api.Command; public class TrashNetworkVspCommand extends Command { - String _domainUuid; - String _networkUuid; - boolean _isL3Network; - String _vpcUuid; + private final String _domainUuid; + private final String _networkUuid; + private final boolean _isL3Network; + private final boolean _isSharedNetwork; + private final String _vpcUuid; + private final String _domainTemplateName; - public TrashNetworkVspCommand(String domainUuid, String networkUuid, boolean isL3Network, String vpcUuid) { + private TrashNetworkVspCommand(String domainUuid, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String domainTemplateName) { super(); this._domainUuid = domainUuid; this._networkUuid = networkUuid; this._isL3Network = isL3Network; + this._isSharedNetwork = isSharedNetwork; this._vpcUuid = vpcUuid; + this._domainTemplateName = domainTemplateName; } public String getDomainUuid() { @@ -48,13 +53,95 @@ public class TrashNetworkVspCommand extends Command { return _isL3Network; } + public boolean isSharedNetwork() { + return _isSharedNetwork; + } + public String getVpcUuid() { return _vpcUuid; } + public String getDomainTemplateName() { + return _domainTemplateName; + } + + public static class Builder implements CmdBuilder { + private String _domainUuid; + private String _networkUuid; + private boolean _isL3Network; + private boolean _isSharedNetwork; + private String _vpcUuid; + private String _domainTemplateName; + + public Builder domainUuid(String domainUuid) { + this._domainUuid = domainUuid; + return this; + } + + public Builder networkUuid(String networkUuid) { + this._networkUuid = networkUuid; + return this; + } + + public Builder isL3Network(boolean isL3Network) { + this._isL3Network = isL3Network; + return this; + } + + public Builder isSharedNetwork(boolean isSharedNetwork) { + this._isSharedNetwork = isSharedNetwork; + return this; + } + + public Builder vpcUuid(String vpcUuid) { + this._vpcUuid = vpcUuid; + return this; + } + + public Builder domainTemplateName(String domainTemplateName) { + this._domainTemplateName = domainTemplateName; + return this; + } + + @Override + public TrashNetworkVspCommand build() { + return new TrashNetworkVspCommand(_domainUuid, _networkUuid, _isL3Network, _isSharedNetwork, _vpcUuid, _domainTemplateName); + } + } + @Override public boolean executeInSequence() { return false; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TrashNetworkVspCommand)) return false; + if (!super.equals(o)) return false; + + TrashNetworkVspCommand that = (TrashNetworkVspCommand) o; + + if (_isL3Network != that._isL3Network) return false; + if (_isSharedNetwork != that._isSharedNetwork) 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 (_networkUuid != null ? !_networkUuid.equals(that._networkUuid) : that._networkUuid != null) return false; + if (_vpcUuid != null ? !_vpcUuid.equals(that._vpcUuid) : that._vpcUuid != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_domainUuid != null ? _domainUuid.hashCode() : 0); + result = 31 * result + (_networkUuid != null ? _networkUuid.hashCode() : 0); + result = 31 * result + (_isL3Network ? 1 : 0); + result = 31 * result + (_isSharedNetwork ? 1 : 0); + result = 31 * result + (_vpcUuid != null ? _vpcUuid.hashCode() : 0); + result = 31 * result + (_domainTemplateName != null ? _domainTemplateName.hashCode() : 0); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java new file mode 100644 index 00000000000..f748e1cbb44 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsAnswer.java @@ -0,0 +1,81 @@ +// +// 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.manager; + +import com.cloud.agent.api.Answer; + +import java.util.Map; + +public class GetClientDefaultsAnswer extends Answer { + + private String _currentApiVersion; + private Integer _apiRetryCount; + private Long _apiRetryInterval; + + public GetClientDefaultsAnswer(GetClientDefaultsCommand cmd, Map defaults) { + super(cmd); + this._currentApiVersion = (String) defaults.get("CURRENT_API_VERSION"); + this._apiRetryCount = (Integer) defaults.get("DEFAULT_API_RETRY_COUNT"); + this._apiRetryInterval = (Long) defaults.get("DEFAULT_API_RETRY_INTERVAL"); + } + + public GetClientDefaultsAnswer(GetClientDefaultsCommand cmd, Exception e) { + super(cmd, e); + } + + public String getCurrentApiVersion() { + return _currentApiVersion; + } + + public Integer getApiRetryCount() { + return _apiRetryCount; + } + + public Long getApiRetryInterval() { + return _apiRetryInterval; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof GetClientDefaultsAnswer)) return false; + if (!super.equals(o)) return false; + + GetClientDefaultsAnswer that = (GetClientDefaultsAnswer) o; + + if (_apiRetryCount != null ? !_apiRetryCount.equals(that._apiRetryCount) : that._apiRetryCount != null) + return false; + if (_apiRetryInterval != null ? !_apiRetryInterval.equals(that._apiRetryInterval) : that._apiRetryInterval != null) + return false; + if (_currentApiVersion != null ? !_currentApiVersion.equals(that._currentApiVersion) : that._currentApiVersion != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_currentApiVersion != null ? _currentApiVersion.hashCode() : 0); + result = 31 * result + (_apiRetryCount != null ? _apiRetryCount.hashCode() : 0); + result = 31 * result + (_apiRetryInterval != null ? _apiRetryInterval.hashCode() : 0); + return result; + } +} diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java similarity index 68% rename from plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java rename to plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java index 87e7b328265..2ffbe04ea42 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/GetClientDefaultsCommand.java @@ -17,19 +17,22 @@ // under the License. // -package com.cloud.agent.api.guru; +package com.cloud.agent.api.manager; -import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -public class ImplementNetworkVspAnswer extends Answer { +/** + * The super class implementations for equals and hashCode are acceptable because this class does not track any state + * in addition to the super class. + */ +public class GetClientDefaultsCommand extends Command { - public ImplementNetworkVspAnswer(Command command, Exception e) { - super(command, e); + public GetClientDefaultsCommand() { + super(); } - public ImplementNetworkVspAnswer(ImplementNetworkVspCommand cmd, boolean success, String details) { - super(cmd, success, details); + @Override + public boolean executeInSequence() { + return false; } - -} +} \ No newline at end of file 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 new file mode 100644 index 00000000000..7a331d68013 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/manager/SupportedApiVersionCommand.java @@ -0,0 +1,61 @@ +// +// 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.manager; + +import com.cloud.agent.api.Command; + +public class SupportedApiVersionCommand extends Command { + + private final String _apiVersion; + + public SupportedApiVersionCommand(String apiVersion) { + super(); + this._apiVersion = apiVersion; + } + + public String getApiVersion() { + return _apiVersion; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SupportedApiVersionCommand)) return false; + if (!super.equals(o)) return false; + + SupportedApiVersionCommand that = (SupportedApiVersionCommand) o; + + if (_apiVersion != null ? !_apiVersion.equals(that._apiVersion) : that._apiVersion != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_apiVersion != null ? _apiVersion.hashCode() : 0); + return result; + } +} \ No newline at end of file diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java similarity index 53% rename from plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java rename to plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java index 9a6a4d7cbb9..fd4822cfe66 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainAnswer.java @@ -17,38 +17,41 @@ // under the License. // -package com.cloud.agent.api.guru; +package com.cloud.agent.api.sync; -import com.cloud.agent.api.Command; +import com.cloud.agent.api.Answer; -public class ReleaseVmVspCommand extends Command { +public class SyncDomainAnswer extends Answer { - String _networkUuid; - String _vmUuid; - String _vmInstanceName; + private final boolean _success; - public ReleaseVmVspCommand(String networkUuid, String vmUuid, String vmInstanceName) { + public SyncDomainAnswer(boolean success) { super(); - this._networkUuid = networkUuid; - this._vmUuid = vmUuid; - this._vmInstanceName = vmInstanceName; + this._success = success; } - public String getNetworkUuid() { - return _networkUuid; + public boolean getSuccess() { + return _success; } - public String getVmUuid() { - return _vmUuid; - } - public String getVmInstanceName() { - return _vmInstanceName; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SyncDomainAnswer)) return false; + if (!super.equals(o)) return false; + + SyncDomainAnswer that = (SyncDomainAnswer) o; + + if (_success != that._success) return false; + + return true; } @Override - public boolean executeInSequence() { - return false; + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_success ? 1 : 0); + return result; } - } 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 new file mode 100644 index 00000000000..7ae474f2d1e --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncDomainCommand.java @@ -0,0 +1,93 @@ +// +// 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.sync; + +import com.cloud.agent.api.Command; + +public class SyncDomainCommand extends Command { + + private final String _domainUuid; + private final String _domainName; + private final String _domainPath; + private final boolean _toAdd; + private final boolean _toRemove; + + public SyncDomainCommand(String domainUuid, String domainName, String domainPath, boolean toAdd, boolean toRemove) { + super(); + this._domainUuid = domainUuid; + this._domainName = domainName; + this._domainPath = domainPath; + this._toAdd = toAdd; + this._toRemove = toRemove; + } + + public String getDomainUuid() { + return _domainUuid; + } + + public String getDomainName() { + return _domainName; + } + + public String getDomainPath() { + return _domainPath; + } + + public boolean isToAdd() { + return _toAdd; + } + + public boolean isToRemove() { + return _toRemove; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SyncDomainCommand)) return false; + if (!super.equals(o)) return false; + + SyncDomainCommand that = (SyncDomainCommand) o; + + if (_toAdd != that._toAdd) return false; + if (_toRemove != that._toRemove) return false; + if (_domainName != null ? !_domainName.equals(that._domainName) : that._domainName != null) return false; + if (_domainPath != null ? !_domainPath.equals(that._domainPath) : that._domainPath != null) return false; + if (_domainUuid != null ? !_domainUuid.equals(that._domainUuid) : that._domainUuid != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_domainUuid != null ? _domainUuid.hashCode() : 0); + result = 31 * result + (_domainName != null ? _domainName.hashCode() : 0); + result = 31 * result + (_domainPath != null ? _domainPath.hashCode() : 0); + result = 31 * result + (_toAdd ? 1 : 0); + result = 31 * result + (_toRemove ? 1 : 0); + return result; + } +} 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 new file mode 100644 index 00000000000..b0430e69158 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdAnswer.java @@ -0,0 +1,73 @@ +// +// 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.sync; + +import com.cloud.agent.api.Answer; + +public class SyncNuageVspCmsIdAnswer extends Answer { + + private final boolean _success; + private final String _nuageVspCmsId; + private final SyncNuageVspCmsIdCommand.SyncType _syncType; + + public SyncNuageVspCmsIdAnswer(boolean success, String nuageVspCmsId, SyncNuageVspCmsIdCommand.SyncType syncType) { + super(); + this._success = success; + this._nuageVspCmsId = nuageVspCmsId; + this._syncType = syncType; + } + + public boolean getSuccess() { + return _success; + } + + public String getNuageVspCmsId() { + return _nuageVspCmsId; + } + + public SyncNuageVspCmsIdCommand.SyncType getSyncType() { + return _syncType; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SyncNuageVspCmsIdAnswer)) return false; + if (!super.equals(o)) 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; + } + + @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; + } +} 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 new file mode 100644 index 00000000000..48651ff4b33 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncNuageVspCmsIdCommand.java @@ -0,0 +1,72 @@ +// +// 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.sync; + +import com.cloud.agent.api.Command; + +public class SyncNuageVspCmsIdCommand extends Command { + + public static enum SyncType { AUDIT, AUDIT_ONLY, REGISTER, UNREGISTER } + + private final SyncType _syncType; + private final String _nuageVspCmsId; + + public SyncNuageVspCmsIdCommand(SyncType syncType, String nuageVspCmsId) { + super(); + this._syncType = syncType; + this._nuageVspCmsId = nuageVspCmsId; + } + + public SyncType getSyncType() { + return _syncType; + } + + public String getNuageVspCmsId() { + return _nuageVspCmsId; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SyncNuageVspCmsIdCommand)) return false; + if (!super.equals(o)) return false; + + SyncNuageVspCmsIdCommand that = (SyncNuageVspCmsIdCommand) o; + + if (_nuageVspCmsId != null ? !_nuageVspCmsId.equals(that._nuageVspCmsId) : that._nuageVspCmsId != null) + return false; + if (_syncType != that._syncType) return false; + + return true; + } + + @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; + } +} diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java index 8ccd84db55d..cfcfb870cd1 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java @@ -23,7 +23,7 @@ import com.cloud.agent.api.Command; public class SyncVspCommand extends Command { - String _nuageVspEntity; + private final String _nuageVspEntity; public SyncVspCommand(String nuageVspEntity) { super(); @@ -39,4 +39,24 @@ public class SyncVspCommand extends Command { return _nuageVspEntity; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SyncVspCommand)) return false; + if (!super.equals(o)) return false; + + SyncVspCommand that = (SyncVspCommand) o; + + if (_nuageVspEntity != null ? !_nuageVspEntity.equals(that._nuageVspEntity) : that._nuageVspEntity != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (_nuageVspEntity != null ? _nuageVspEntity.hashCode() : 0); + return result; + } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java index 19f2d09b399..7590901a5ff 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java @@ -19,18 +19,6 @@ package com.cloud.api.commands; -import javax.inject.Inject; - -import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.ApiErrorCode; -import org.apache.cloudstack.api.BaseAsyncCmd; -import org.apache.cloudstack.api.BaseCmd; -import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.PhysicalNetworkResponse; -import org.apache.cloudstack.context.CallContext; - import com.cloud.api.response.NuageVspDeviceResponse; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; @@ -41,8 +29,19 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.manager.NuageVspManager; import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.PhysicalNetworkResponse; +import org.apache.cloudstack.context.CallContext; -@APICommand(name = "addNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Adds a Nuage VSP device") +import javax.inject.Inject; + +@APICommand(name = "addNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Adds a Nuage VSP device", since = "4.5") public class AddNuageVspDeviceCmd extends BaseAsyncCmd { private static final String s_name = "addnuagevspdeviceresponse"; diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java index ae81c847bf9..971f9c93f4b 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java @@ -19,16 +19,6 @@ package com.cloud.api.commands; -import javax.inject.Inject; - -import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiErrorCode; -import org.apache.cloudstack.api.BaseAsyncCmd; -import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.SuccessResponse; -import org.apache.cloudstack.context.CallContext; - import com.cloud.api.response.NuageVspDeviceResponse; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; @@ -38,8 +28,17 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.manager.NuageVspManager; import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.context.CallContext; -@APICommand(name = "deleteNuageVspDevice", responseObject = SuccessResponse.class, description = "delete a nuage vsp device") +import javax.inject.Inject; + +@APICommand(name = "deleteNuageVspDevice", responseObject = SuccessResponse.class, description = "delete a nuage vsp device", since = "4.5") public class DeleteNuageVspDeviceCmd extends BaseAsyncCmd { private static final String s_name = "deletenuagevspdeviceresponse"; @Inject diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java index f0e3ff8fd82..559b30d40a7 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java @@ -19,23 +19,6 @@ package com.cloud.api.commands; -import java.util.List; - -import javax.inject.Inject; - -import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.ApiErrorCode; -import org.apache.cloudstack.api.BaseCmd; -import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.NetworkOfferingResponse; -import org.apache.cloudstack.api.response.PhysicalNetworkResponse; -import org.apache.cloudstack.api.response.ZoneResponse; -import org.apache.cloudstack.context.CallContext; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; - import com.cloud.agent.AgentManager; import com.cloud.agent.api.VspResourceAnswer; import com.cloud.agent.api.VspResourceCommand; @@ -53,8 +36,23 @@ import com.cloud.network.dao.NuageVspDao; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.user.AccountManager; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.NetworkOfferingResponse; +import org.apache.cloudstack.api.response.PhysicalNetworkResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; -@APICommand(name = "issueNuageVspResourceRequest", responseObject = NuageVspResourceResponse.class, description = "Issues a Nuage VSP REST API resource request") +import javax.inject.Inject; +import java.util.List; + +@APICommand(name = "issueNuageVspResourceRequest", responseObject = NuageVspResourceResponse.class, description = "Issues a Nuage VSP REST API resource request", since = "4.5") public class IssueNuageVspResourceRequestCmd extends BaseCmd { private static final Logger s_logger = Logger.getLogger(IssueNuageVspResourceRequestCmd.class.getName()); private static final String s_name = "nuagevspresourceresponse"; diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java index 46797e0af03..2d08e12e3dd 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java @@ -19,20 +19,6 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.ApiErrorCode; -import org.apache.cloudstack.api.BaseListCmd; -import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.api.response.PhysicalNetworkResponse; - import com.cloud.api.response.NuageVspDeviceResponse; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -42,8 +28,20 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.manager.NuageVspManager; import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.PhysicalNetworkResponse; -@APICommand(name = "listNuageVspDevices", responseObject = NuageVspDeviceResponse.class, description = "Lists Nuage VSP devices") +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; + +@APICommand(name = "listNuageVspDevices", responseObject = NuageVspDeviceResponse.class, description = "Lists Nuage VSP devices", since = "4.5") public class ListNuageVspDevicesCmd extends BaseListCmd { private static final String s_name = "listnuagevspdeviceresponse"; @Inject diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java new file mode 100755 index 00000000000..d235b2b595a --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/UpdateNuageVspDeviceCmd.java @@ -0,0 +1,180 @@ +// +// 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.api.commands; + +import com.cloud.api.response.NuageVspDeviceResponse; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.NuageVspDeviceVO; +import com.cloud.network.manager.NuageVspManager; +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.PhysicalNetworkResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = "updateNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Update a Nuage VSP device", since = "4.6") +public class UpdateNuageVspDeviceCmd extends BaseAsyncCmd { + private static final Logger s_logger = Logger.getLogger(UpdateNuageVspDeviceCmd.class); + private static final String s_name = "updatenuagevspdeviceresponse"; + + @Inject + NuageVspManager _nuageVspManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = BaseCmd.CommandType.UUID, entityType = PhysicalNetworkResponse.class, + required = true, description = "the ID of the physical network in to which Nuage VSP is added") + private Long physicalNetworkId; + + @Parameter(name = VspConstants.NUAGE_VSP_API_PORT, type = CommandType.INTEGER, description = "the port to communicate to Nuage VSD") + private Integer port; + + @Parameter(name = ApiConstants.HOST_NAME, type = CommandType.STRING, description = "the hostname of the Nuage VSD") + private String hostName; + + @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "the user name of the CMS user in Nuage VSD") + private String userName; + + @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "the password of CMS user in Nuage VSD") + private String password; + + @Parameter(name = VspConstants.NUAGE_VSP_API_VERSION, type = CommandType.STRING, description = "the version of the API to use to communicate to Nuage VSD") + private String apiVersion; + + @Parameter(name = VspConstants.NUAGE_VSP_API_RETRY_COUNT, type = CommandType.INTEGER, description = "the number of retries on failure to communicate to Nuage VSD") + private Integer apiRetryCount; + + @Parameter(name = VspConstants.NUAGE_VSP_API_RETRY_INTERVAL, type = CommandType.LONG, description = "the time to wait after failure before retrying to communicate to Nuage VSD") + private Long apiRetryInterval; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public String getUserName() { + return userName; + } + + public String getPassword() { + return password; + } + + public String getApiVersion() { + return apiVersion; + } + + public void setApiVersion(String apiVersion) { + this.apiVersion = apiVersion; + } + + public Integer getApiRetryCount() { + return apiRetryCount; + } + + public void setApiRetryCount(Integer apiRetryCount) { + this.apiRetryCount = apiRetryCount; + } + + public Long getApiRetryInterval() { + return apiRetryInterval; + } + + public void setApiRetryInterval(Long apiRetryInterval) { + this.apiRetryInterval = apiRetryInterval; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException { + try { + NuageVspDeviceVO nuageVspDeviceVO = _nuageVspManager.updateNuageVspDevice(this); + if (nuageVspDeviceVO != null) { + NuageVspDeviceResponse response = _nuageVspManager.createNuageVspDeviceResponse(nuageVspDeviceVO); + response.setObjectName("nuagevspdevice"); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Nuage VSP device due to internal error."); + } + } catch (InvalidParameterValueException invalidParamExcp) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage()); + } catch (CloudRuntimeException runtimeExcp) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage()); + } + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_EXTERNAL_VSP_VSD_UPDATE; + } + + @Override + public String getEventDescription() { + return "Updating a Nuage VSD"; + } +} \ No newline at end of file diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java index b0bbcc8ebc7..136a465e79c 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java @@ -21,13 +21,12 @@ package com.cloud.api.response; import com.cloud.api.commands.VspConstants; import com.cloud.network.NuageVspDeviceVO; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; -import com.cloud.serializer.Param; -import com.google.gson.annotations.SerializedName; - @EntityReference(value = NuageVspDeviceVO.class) public class NuageVspDeviceResponse extends BaseResponse { @SerializedName(VspConstants.NUAGE_VSP_DEVICE_ID) diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java index 8e620ed4c3d..70024134a8f 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java @@ -20,10 +20,9 @@ package com.cloud.api.response; import com.cloud.api.commands.VspConstants; -import org.apache.cloudstack.api.BaseResponse; - import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.BaseResponse; public class NuageVspResourceResponse extends BaseResponse { @SerializedName(VspConstants.NUAGE_VSP_API_RESOURCE_INFO) diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java index 00cb1e4dc7e..ad5a7eb2540 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java @@ -19,7 +19,7 @@ package com.cloud.network; -import java.util.UUID; +import org.apache.cloudstack.api.InternalIdentity; import javax.persistence.Column; import javax.persistence.Entity; @@ -27,8 +27,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; - -import org.apache.cloudstack.api.InternalIdentity; +import java.util.UUID; @Entity @Table(name = "external_nuage_vsp_devices") diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java index 6cf7e1a5f62..aa795eb7b83 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java @@ -33,4 +33,12 @@ public interface NuageVspDao extends GenericDao { */ List listByPhysicalNetwork(long physicalNetworkId); + /** + * List all the Nuage Vsp devices by a specific host + * + * @param hostId host Id + * @return list of NuageVspDeviceVO for this host. + */ + List listByHost(long hostId); + } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java index bc55f434c0f..ec60c49aee0 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java @@ -19,15 +19,13 @@ package com.cloud.network.dao; -import javax.ejb.Local; - import com.cloud.network.NuageVspDeviceVO; +import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import org.springframework.stereotype.Component; -import com.cloud.utils.db.GenericDaoBase; - +import javax.ejb.Local; import java.util.List; @Component @@ -35,12 +33,17 @@ import java.util.List; public class NuageVspDaoImpl extends GenericDaoBase implements NuageVspDao { - protected final SearchBuilder physicalNetworkIdSearch; + private final SearchBuilder physicalNetworkIdSearch; + private final SearchBuilder hostIdSearch; public NuageVspDaoImpl() { physicalNetworkIdSearch = createSearchBuilder(); physicalNetworkIdSearch.and("physicalNetworkId", physicalNetworkIdSearch.entity().getPhysicalNetworkId(), SearchCriteria.Op.EQ); physicalNetworkIdSearch.done(); + + hostIdSearch = createSearchBuilder(); + hostIdSearch.and("hostId", hostIdSearch.entity().getHostId(), SearchCriteria.Op.EQ); + hostIdSearch.done(); } @Override @@ -49,4 +52,11 @@ public class NuageVspDaoImpl extends GenericDaoBase sc.setParameters("physicalNetworkId", physicalNetworkId); return search(sc, null); } + + @Override + public List listByHost(long hostId) { + SearchCriteria sc = hostIdSearch.create(); + sc.setParameters("hostId", hostId); + return search(sc, null); + } } 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 e777268e424..d9243d4d7b8 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,34 +19,20 @@ 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.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.api.InternalIdentity; -import org.apache.cloudstack.network.ExternalNetworkDeviceManager; -import org.apache.log4j.Logger; - import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupVspCommand; -import com.cloud.agent.api.element.ApplyAclRuleVspAnswer; import com.cloud.agent.api.element.ApplyAclRuleVspCommand; -import com.cloud.agent.api.element.ApplyStaticNatVspAnswer; import com.cloud.agent.api.element.ApplyStaticNatVspCommand; +import com.cloud.agent.api.element.ImplementVspCommand; +import com.cloud.agent.api.element.ShutDownVpcVspCommand; import com.cloud.dc.VlanVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DeployDestination; import com.cloud.domain.Domain; import com.cloud.domain.dao.DomainDao; -import com.cloud.exception.CloudException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; @@ -60,17 +46,28 @@ import com.cloud.network.Network.Service; import com.cloud.network.NetworkModel; import com.cloud.network.Networks; import com.cloud.network.NuageVspDeviceVO; +import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.PublicIpAddress; +import com.cloud.network.dao.FirewallRulesCidrsDao; +import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.NuageVspDao; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.manager.NuageVspManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.FirewallRuleType; +import com.cloud.network.rules.FirewallRuleVO; import com.cloud.network.rules.StaticNat; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.NetworkACLItemDao; +import com.cloud.network.vpc.NetworkACLItemVO; +import com.cloud.network.vpc.PrivateGateway; +import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; @@ -81,17 +78,34 @@ import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; +import com.cloud.util.NuageVspUtil; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.NicDao; +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.network.ExternalNetworkDeviceManager; +import org.apache.log4j.Logger; + +import javax.ejb.Local; +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; @Local(value = {NetworkElement.class, ConnectivityProvider.class, IpDeployer.class, SourceNatServiceProvider.class, StaticNatServiceProvider.class, FirewallServiceProvider.class, - DhcpServiceProvider.class, NetworkACLServiceProvider.class}) + DhcpServiceProvider.class, VpcProvider.class, NetworkACLServiceProvider.class}) public class NuageVspElement extends AdapterBase implements ConnectivityProvider, IpDeployer, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider, - DhcpServiceProvider, NetworkACLServiceProvider, ResourceStateAdapter { + DhcpServiceProvider, ResourceStateAdapter, VpcProvider, NetworkACLServiceProvider { private static final Logger s_logger = Logger.getLogger(NuageVspElement.class); @@ -129,6 +143,18 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider AgentManager _agentMgr; @Inject NetworkOfferingDao _ntwkOfferingDao; + @Inject + ConfigurationDao _configDao; + @Inject + NuageVspManager _nuageVspManager; + @Inject + FirewallRulesDao _firewallRulesDao; + @Inject + FirewallRulesCidrsDao _firewallRulesCidrsDao; + @Inject + PhysicalNetworkDao _physicalNetworkDao; + @Inject + NetworkACLItemDao _networkACLItemDao; @Override public boolean applyIps(Network network, List ipAddress, Set service) throws ResourceUnavailableException { @@ -149,9 +175,12 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider // L3 Support : Generic capabilities.put(Service.Gateway, null); + // Security Group + capabilities.put(Service.SecurityGroup, null); + // L3 Support : SourceNat Map sourceNatCapabilities = new HashMap(); - sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "peraccount"); + sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "perzone"); sourceNatCapabilities.put(Capability.RedundantRouter, "false"); capabilities.put(Service.SourceNat, sourceNatCapabilities); @@ -194,7 +223,13 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider @Override public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { - s_logger.debug("Entering NuageElement implement function for network " + network.getDisplayText() + " (state " + network.getState() + ")"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Entering NuageElement implement function for network " + network.getDisplayText() + " (state " + network.getState() + ")"); + } + + if (network.getVpcId() != null) { + return applyACLRulesForVpc(network, offering); + } if (!canHandle(network, Service.Connectivity)) { return false; @@ -205,9 +240,85 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider return false; } + boolean egressDefaultPolicy = offering.getEgressDefaultPolicy(); + Domain networkDomain = _domainDao.findById(network.getDomainId()); + boolean isFirewallServiceSupported = _networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Service.Firewall); + List dnsServers = _nuageVspManager.getDnsDetails(network); + + boolean isL2Network = false, isL3Network = false, isShared = false; + String subnetUuid = network.getUuid(); + if (offering.getGuestType() == Network.GuestType.Shared) { + isShared = true; + subnetUuid = networkDomain.getUuid(); + } else if (_ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.SourceNat) + || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.StaticNat) + || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.Connectivity)) { + isL3Network = true; + } else { + isL2Network = true; + } + + String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, offering); + List> ingressFirewallRules = getFirewallRulesToApply(network.getId(), FirewallRule.TrafficType.Ingress, egressDefaultPolicy); + List> egressFirewallRules = getFirewallRulesToApply(network.getId(), FirewallRule.TrafficType.Egress, egressDefaultPolicy); + + List ips = _ipAddressDao.listStaticNatPublicIps(network.getId()); + List acsFipUuid = new ArrayList(); + for (IPAddressVO ip : ips) { + acsFipUuid.add(ip.getUuid()); + } + + HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); + ImplementVspCommand.Builder cmdBuilder = new ImplementVspCommand.Builder() + .networkId(network.getId()) + .networkDomainUuid(networkDomain.getUuid()) + .networkUuid(network.getUuid()) + .networkName(network.getName()) + .vpcOrSubnetUuid(subnetUuid) + .isL2Network(isL2Network) + .isL3Network(isL3Network) + .isVpc(false) + .isShared(isShared) + .domainTemplateName(preConfiguredDomainTemplateName) + .isFirewallServiceSupported(isFirewallServiceSupported) + .dnsServers(dnsServers) + .ingressFirewallRules(ingressFirewallRules) + .egressFirewallRules(egressFirewallRules) + .acsFipUuid(acsFipUuid) + .egressDefaultPolicy(egressDefaultPolicy); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); + if (answer == null || !answer.getResult()) { + s_logger.error("ImplementVspCommand 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; } + private boolean applyACLRulesForVpc(Network network, NetworkOffering offering) throws ResourceUnavailableException { + List rules = _networkACLItemDao.listByACL(network.getNetworkACLId()); + if (_networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Network.Service.NetworkACL)) { + applyACLRules(network, rules, true, null, false); + } + return true; + } + + private List> getFirewallRulesToApply(long networkId, FirewallRule.TrafficType trafficType, final boolean egressDefaultPolicy) { + List firewallRulesToApply = _firewallRulesDao.listByNetworkPurposeTrafficType(networkId, FirewallRule.Purpose.Firewall, trafficType); + for (FirewallRuleVO rule : firewallRulesToApply) { + // load cidrs if any + rule.setSourceCidrList(_firewallRulesCidrsDao.getSourceCidrs(rule.getId())); + } + return Lists.transform(firewallRulesToApply, new Function>() { + @Override + public Map apply(FirewallRuleVO firewallRuleVO) { + return getACLRuleDetails(firewallRuleVO, egressDefaultPolicy); + } + }); + } + @Override public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { @@ -258,7 +369,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider @Override public boolean canEnableIndividualServices() { - return false; + return true; } @Override @@ -303,13 +414,17 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider } if (!_networkModel.isProviderForNetwork(getProvider(), network.getId())) { - s_logger.debug("NuageElement is not a provider for network " + network.getDisplayText()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("NuageVsp is not a provider for network " + network.getDisplayText()); + } return false; } if (service != null) { if (!_ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(), service, getProvider())) { - s_logger.debug("NuageElement can't provide the " + service.getName() + " service on network " + network.getDisplayText()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("NuageVsp can't provide the " + service.getName() + " service on network " + network.getDisplayText()); + } return false; } } @@ -360,6 +475,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider //client to process the request sourceNatDetail.put("sourceNatIpUuid", sourceNatIp.getUuid()); sourceNatDetail.put("sourceNatIpAddress", sourceNatIp.getAddress().addr()); + sourceNatDetail.put("nicUuid", nicVO == null ? null : nicVO.getUuid()); sourceNatDetail.put("nicMacAddress", nicVO == null ? null : nicVO.getMacAddress()); sourceNatDetail.put("isRevoke", staticNat.isForRevoke()); sourceNatDetail.put("sourceNatVlanUuid", sourceNatVan.getUuid()); @@ -367,22 +483,21 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider sourceNatDetail.put("sourceNatVlanNetmask", sourceNatVan.getVlanNetmask()); sourceNatDetails.add(sourceNatDetail); } - try { - try { - HostVO nuageVspHost = getNuageVspHost(config.getPhysicalNetworkId()); - ApplyStaticNatVspCommand cmd = new ApplyStaticNatVspCommand(networkDomain.getUuid(), vpcOrSubnetUuid, isL3Network, sourceNatDetails); - ApplyStaticNatVspAnswer answer = (ApplyStaticNatVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); - if (answer == null || !answer.getResult()) { - s_logger.error("ApplyStaticNatNuageVspCommand for network " + config.getUuid() + " failed"); - if ((null != answer) && (null != answer.getDetails())) { - throw new ResourceUnavailableException(answer.getDetails(), Network.class, config.getId()); - } - } - } catch (Exception e) { - s_logger.warn("Failed to apply static Nat in Vsp " + e.getMessage()); + + HostVO nuageVspHost = getNuageVspHost(config.getPhysicalNetworkId()); + ApplyStaticNatVspCommand.Builder cmdBuilder = new ApplyStaticNatVspCommand.Builder() + .networkDomainUuid(networkDomain.getUuid()) + .networkUuid(config.getUuid()) + .vpcOrSubnetUuid(vpcOrSubnetUuid) + .isL3Network(isL3Network) + .isVpc(vpcId != null) + .staticNatDetails(sourceNatDetails); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); + if (answer == null || !answer.getResult()) { + s_logger.error("ApplyStaticNatNuageVspCommand for network " + config.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname")); + if ((null != answer) && (null != answer.getDetails())) { + throw new ResourceUnavailableException(answer.getDetails(), Network.class, config.getId()); } - } catch (Exception e) { - throw new ResourceUnavailableException("Failed to apply Static NAT in VSP", Network.class, config.getId(), e); } return true; @@ -395,64 +510,141 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider @Override public boolean applyFWRules(Network network, List rules) throws ResourceUnavailableException { - s_logger.debug("Handling applyFWRules for network " + network.getName() + " with " + rules.size() + " FWRules"); - if (rules != null && rules.size() == 1 && rules.iterator().next().getType().equals(FirewallRuleType.System)) { - s_logger.debug("Default ACL added by CS as system is ignored for network " + network.getName() + " with rule " + rules); + if (rules == null || rules.isEmpty()) { return true; } - return applyACLRules(network, rules, false); + + if (rules.size() == 1 && rules.iterator().next().getType().equals(FirewallRuleType.System)) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Default ACL added by CS as system is ignored for network " + network.getName() + " with rule " + rules); + } + return true; + } + + s_logger.info("Applying " + rules.size() + " Firewall Rules for network " + network.getName()); + return applyACLRules(network, rules, false, rules.iterator().next().getTrafficType().equals(FirewallRule.TrafficType.Ingress), false); + } + + protected boolean applyACLRules(Network network, List rules, boolean isNetworkAcl, Boolean isAcsIngressAcl, boolean networkReset) + throws ResourceUnavailableException { + Domain networksDomain = _domainDao.findById(network.getDomainId()); + NetworkOfferingVO networkOfferingVO = _ntwkOfferingDao.findById(network.getNetworkOfferingId()); + Long vpcId = network.getVpcId(); + String vpcOrSubnetUuid = null; + if (vpcId != null) { + Vpc vpcObj = _vpcDao.findById(vpcId); + vpcOrSubnetUuid = vpcObj.getUuid(); + } else { + vpcOrSubnetUuid = network.getUuid(); + } + boolean egressDefaultPolicy = networkOfferingVO.getEgressDefaultPolicy(); + List> aclRules = new ArrayList>(); + for (InternalIdentity acl : rules) { + aclRules.add(getACLRuleDetails(acl, egressDefaultPolicy)); + } + + boolean isL3Network = isL3Network(network.getNetworkOfferingId()); + HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); + String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, networkOfferingVO); + ApplyAclRuleVspCommand.Builder cmdBuilder = new ApplyAclRuleVspCommand.Builder() + .networkAcl(isNetworkAcl) + .networkUuid(network.getUuid()) + .networkDomainUuid(networksDomain.getUuid()) + .vpcOrSubnetUuid(vpcOrSubnetUuid) + .networkName(network.getName()) + .isL2Network(!isL3Network) + .aclRules(aclRules) + .networkId(network.getId()) + .egressDefaultPolicy(networkOfferingVO.getEgressDefaultPolicy()) + .acsIngressAcl(isAcsIngressAcl) + .networkReset(networkReset) + .domainTemplateName(preConfiguredDomainTemplateName); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); + if (answer == null || !answer.getResult()) { + s_logger.error("ApplyAclRuleNuageVspCommand 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; } @Override - public boolean applyNetworkACLs(Network network, List rules) throws ResourceUnavailableException { + public boolean applyNetworkACLs(Network config, List rules) throws ResourceUnavailableException { if (rules == null || rules.isEmpty()) { - s_logger.debug("No rules to apply. So, delete all the existing ACL in VSP from Subnet with uuid " + network.getUuid()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("No rules to apply. So, delete all the existing ACL in VSP from Subnet with uuid " + config.getUuid()); + } } else { - s_logger.debug("New rules has to applied. So, delete all the existing ACL in VSP from Subnet with uuid " + network.getUuid()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("New rules has to applied. So, delete all the existing ACL in VSP from Subnet with uuid " + config.getUuid()); + } } if (rules != null) { - s_logger.debug("Handling applyNetworkACLs for network " + network.getName() + " with " + rules.size() + " Network ACLs"); - applyACLRules(network, rules, true); + s_logger.info("Applying " + rules.size() + " Network ACLs for network " + config.getName()); + applyACLRules(config, rules, true, null, rules.isEmpty()); } return true; } - protected boolean applyACLRules(Network network, List rules, boolean isVpc) throws ResourceUnavailableException { - Domain networksDomain = _domainDao.findById(network.getDomainId()); - NetworkOfferingVO networkOferringVO = _ntwkOfferingDao.findById(network.getNetworkOfferingId()); - try { - Long vpcId = network.getVpcId(); - String vpcOrSubnetUuid = null; - if (vpcId != null) { - Vpc vpcObj = _vpcDao.findById(vpcId); - vpcOrSubnetUuid = vpcObj.getUuid(); - } else { - vpcOrSubnetUuid = network.getUuid(); - } - boolean egressDefaultPolicy = networkOferringVO.getEgressDefaultPolicy(); - List> aclRules = new ArrayList>(); - for (InternalIdentity acl : rules) { - aclRules.add(getACLRuleDetails(acl, egressDefaultPolicy)); - } + @Override + public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + return true; + } - HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - ApplyAclRuleVspCommand cmd = new ApplyAclRuleVspCommand(network.getUuid(), networksDomain.getUuid(), vpcOrSubnetUuid, isL3Network(networkOferringVO.getId()), aclRules, - isVpc, network.getId()); - ApplyAclRuleVspAnswer answer = (ApplyAclRuleVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); + @Override + public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { + if (vpc.getState().equals(Vpc.State.Inactive)) { + Domain vpcDomain = _domainDao.findById(vpc.getDomainId()); + HostVO nuageVspHost = getNuageVspHost(getPhysicalNetworkId(vpc.getZoneId())); + String preConfiguredDomainTemplateName = _configDao.getValue(NuageVspManager.NuageVspVpcDomainTemplateName.key()); + ShutDownVpcVspCommand.Builder cmdBuilder = new ShutDownVpcVspCommand.Builder() + .domainUuid(vpcDomain.getUuid()) + .vpcUuid(vpc.getUuid()) + .domainTemplateName(preConfiguredDomainTemplateName); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); if (answer == null || !answer.getResult()) { - s_logger.error("ApplyAclRuleNuageVspCommand for network " + network.getUuid() + " failed"); + s_logger.error("ShutDownVpcVspCommand for VPC " + vpc.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname")); if ((null != answer) && (null != answer.getDetails())) { - throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId()); + throw new ResourceUnavailableException(answer.getDetails(), Vpc.class, vpc.getId()); } } - - } catch (Exception e1) { - throw new ResourceUnavailableException(e1.getMessage(), Network.class, network.getId()); } - return true; } + private Long getPhysicalNetworkId(Long zoneId) { + Long guestPhysicalNetworkId = 0L; + List physicalNetworkList = _physicalNetworkDao.listByZone(zoneId); + for (PhysicalNetworkVO phyNtwk : physicalNetworkList) { + if (phyNtwk.getIsolationMethods().contains(PhysicalNetwork.IsolationMethod.VSP.name())) { + guestPhysicalNetworkId = phyNtwk.getId(); + break; + } + } + return guestPhysicalNetworkId; + } + + @Override + public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException { + return false; + } + + @Override + public boolean deletePrivateGateway(PrivateGateway privateGateway) throws ConcurrentOperationException, ResourceUnavailableException { + return false; + } + + @Override + public boolean applyStaticRoutes(Vpc vpc, List routes) throws ResourceUnavailableException { + return true; + } + + @Override + public boolean applyACLItemsToPrivateGw(PrivateGateway gateway, List rules) throws ResourceUnavailableException { + return false; + } + @Override public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) { return null; @@ -475,7 +667,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider return new DeleteHostAnswer(true); } - protected HostVO getNuageVspHost(Long physicalNetworkId) throws CloudException { + private HostVO getNuageVspHost(Long physicalNetworkId) { HostVO nuageVspHost; List nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId); if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) { @@ -483,7 +675,7 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider nuageVspHost = _hostDao.findById(config.getHostId()); _hostDao.loadDetails(nuageVspHost); } else { - throw new CloudException("Nuage VSD is not configured on physical network " + physicalNetworkId); + throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId); } return nuageVspHost; } 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 9bbaf409b4e..e6251219457 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,42 +19,26 @@ package com.cloud.network.guru; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ejb.Local; -import javax.inject.Inject; - -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; - import com.cloud.agent.AgentManager; -import com.cloud.agent.api.guru.DeallocateVmVspAnswer; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.guru.DeallocateVmVspCommand; -import com.cloud.agent.api.guru.ImplementNetworkVspAnswer; import com.cloud.agent.api.guru.ImplementNetworkVspCommand; -import com.cloud.agent.api.guru.ReleaseVmVspAnswer; -import com.cloud.agent.api.guru.ReleaseVmVspCommand; -import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer; import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; -import com.cloud.agent.api.guru.TrashNetworkVspAnswer; import com.cloud.agent.api.guru.TrashNetworkVspCommand; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.VlanVO; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapacityException; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; +import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Service; @@ -64,9 +48,11 @@ import com.cloud.network.Networks; import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetwork.IsolationMethod; +import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NuageVspDao; import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.manager.NuageVspManager; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; @@ -75,13 +61,29 @@ 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.NuageVspUtil; import com.cloud.utils.db.DB; +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.ReservationContext; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; +import com.google.common.base.Strings; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import javax.ejb.Local; +import javax.inject.Inject; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; @Local(value = NetworkGuru.class) public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { @@ -103,6 +105,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { VpcDao _vpcDao; @Inject AgentManager _agentMgr; + @Inject + NuageVspManager _nuageVspManager; public NuageVspGuestNetworkGuru() { super(); @@ -114,7 +118,9 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); DataCenter dc = _dcDao.findById(plan.getDataCenterId()); if (!canHandle(offering, dc.getNetworkType(), physnet)) { - s_logger.debug("Refusing to design this network"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Refusing to design network using network offering " + offering.getId() + (physnet != null ? " on physical network " + physnet.getId() : "")); + } return null; } @@ -129,66 +135,111 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { @Override public Network implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapacityException { - - assert (network.getState() == State.Implementing) : "Why are we implementing " + network; - - long dcId = dest.getDataCenter().getId(); - //Get physical network id - Long physicalNetworkId = network.getPhysicalNetworkId(); - //Physical network id can be null in Guest Network in Basic zone, so locate the physical network - if (physicalNetworkId == null) { - physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType()); - } - NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(), network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated, - network.getDataCenterId(), physicalNetworkId, offering.getRedundantRouter()); - if (network.getGateway() != null) { - implemented.setGateway(network.getGateway()); - } - if (network.getCidr() != null) { - implemented.setCidr(network.getCidr()); - } - Collection ipAddressRange = new ArrayList(); - String virtualRouterIp = getVirtualRouterIP(network, ipAddressRange); - String networkUuid = implemented.getUuid(); - String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId(); - String broadcastUriStr = networkUuid + "/" + virtualRouterIp; - implemented.setBroadcastUri(Networks.BroadcastDomainType.Vsp.toUri(broadcastUriStr)); - implemented.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp); - //Check if the network is associated to a VPC - Long vpcId = network.getVpcId(); - boolean isVpc = (vpcId != null); - //Check owner of the Network - Domain networksDomain = _domainDao.findById(network.getDomainId()); - //Get the Account details and find the type - AccountVO networksAccount = _accountDao.findById(network.getAccountId()); - if (networksAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) { - String errorMessage = "CS project support is not yet implemented in NuageVsp"; - s_logger.debug(errorMessage); - throw new InsufficientVirtualNetworkCapacityException(errorMessage, Account.class, network.getAccountId()); - } - boolean isL3Network = isL3Network(offering.getId()); - String vpcName = null; - String vpcUuid = null; - if (isVpc) { - Vpc vpcObj = _vpcDao.findById(vpcId); - vpcName = vpcObj.getName(); - vpcUuid = vpcObj.getUuid(); + long networkId = network.getId(); + network = _networkDao.acquireInLockTable(network.getId(), 1200); + if (network == null) { + throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId); } - HostVO nuageVspHost = getNuageVspHost(physicalNetworkId); - ImplementNetworkVspCommand cmd = new ImplementNetworkVspCommand(networksDomain.getName(), networksDomain.getPath(), networksDomain.getUuid(), - networksAccount.getAccountName(), networksAccount.getUuid(), network.getName(), network.getCidr(), network.getGateway(), network.getUuid(), isL3Network, vpcName, - vpcUuid, offering.getEgressDefaultPolicy(), ipAddressRange); - ImplementNetworkVspAnswer answer = (ImplementNetworkVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); - - if (answer == null || !answer.getResult()) { - s_logger.error("ImplementNetworkNuageVspCommand failed"); - if ((null != answer) && (null != answer.getDetails())) { - s_logger.error(answer.getDetails()); + NetworkVO implemented = null; + try { + if (network.getState() != State.Implementing) { + throw new IllegalStateException("Network " + networkId + " is not in expected state Implementing, but is in state " + network.getState()); } - return null; + + long dcId = dest.getDataCenter().getId(); + //Get physical network id + Long physicalNetworkId = network.getPhysicalNetworkId(); + //Physical network id can be null in Guest Network in Basic zone, so locate the physical network + if (physicalNetworkId == null) { + physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType()); + } + implemented = new NetworkVO(network.getTrafficType(), network.getMode(), network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated, + network.getDataCenterId(), physicalNetworkId, offering.getRedundantRouter()); + if (network.getGateway() != null) { + implemented.setGateway(network.getGateway()); + } + if (network.getCidr() != null) { + implemented.setCidr(network.getCidr()); + } + List ipAddressRanges = new ArrayList(); + String virtualRouterIp = getVirtualRouterIP(network, ipAddressRanges); + String networkUuid = implemented.getUuid(); + String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId(); + String broadcastUriStr = networkUuid + "/" + virtualRouterIp; + implemented.setBroadcastUri(Networks.BroadcastDomainType.Vsp.toUri(broadcastUriStr)); + implemented.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp); + //Check if the network is associated to a VPC + Long vpcId = network.getVpcId(); + boolean isVpc = (vpcId != null); + //Check owner of the Network + Domain networksDomain = _domainDao.findById(network.getDomainId()); + //Get the Account details and find the type + AccountVO networksAccount = _accountDao.findById(network.getAccountId()); + if (networksAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) { + String errorMessage = "Networks created by account " + networksAccount.getAccountName() + " of type Project (" + Account.ACCOUNT_TYPE_PROJECT + ") " + + "are not yet supported by NuageVsp provider"; + s_logger.error(errorMessage); + throw new InsufficientVirtualNetworkCapacityException(errorMessage, Account.class, network.getAccountId()); + } + String vpcName = null; + String vpcUuid = null; + String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, offering); + boolean isSharedNetwork = offering.getGuestType() == GuestType.Shared; + boolean isL3Network = !isVpc && (isSharedNetwork || isL3Network(network)); + + if (isVpc) { + Vpc vpcObj = _vpcDao.findById(vpcId); + vpcName = vpcObj.getName(); + vpcUuid = vpcObj.getUuid(); + } + + if (isSharedNetwork) { + List vlans = _vlanDao.listVlansByNetworkId(network.getId()); + for (VlanVO vlan : vlans) { + boolean isIpv4 = StringUtils.isNotBlank(vlan.getIpRange()); + String[] range = isIpv4 ? vlan.getIpRange().split("-") : vlan.getIp6Range().split("-"); + ipAddressRanges.add(range); + } + } + + HostVO nuageVspHost = getNuageVspHost(physicalNetworkId); + List dnsServers = _nuageVspManager.getDnsDetails(network); + List gatewaySystemIds = _nuageVspManager.getGatewaySystemIds(); + ImplementNetworkVspCommand.Builder cmdBuilder = new ImplementNetworkVspCommand.Builder() + .networkDomainName(networksDomain.getName()) + .networkDomainPath(networksDomain.getPath()) + .networkDomainUuid(networksDomain.getUuid()) + .networkAccountName(networksAccount.getAccountName()) + .networkAccountUuid(networksAccount.getUuid()) + .networkName(network.getName()) + .networkCidr(network.getCidr()) + .networkGateway(network.getGateway()) + .networkAclId(network.getNetworkACLId()) + .dnsServers(dnsServers) + .gatewaySystemIds(gatewaySystemIds) + .networkUuid(network.getUuid()) + .isL3Network(isL3Network) + .isVpc(isVpc) + .isSharedNetwork(isSharedNetwork) + .vpcName(vpcName) + .vpcUuid(vpcUuid) + .defaultEgressPolicy(offering.getEgressDefaultPolicy()) + .ipAddressRange(ipAddressRanges) + .domainTemplateName(preConfiguredDomainTemplateName); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); + + if (answer == null || !answer.getResult()) { + s_logger.error("ImplementNetworkVspCommand for network " + network.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname")); + if ((null != answer) && (null != answer.getDetails())) { + s_logger.error(answer.getDetails()); + } + return null; + } + s_logger.info("Implemented OK, network " + networkUuid + " in tenant " + tenantId + " linked to " + implemented.getBroadcastUri()); + } finally { + _networkDao.releaseFromLockTable(network.getId()); } - s_logger.info("Implemented OK, network " + networkUuid + " in tenant " + tenantId + " linked to " + implemented.getBroadcastUri().toString()); return implemented; } @@ -201,97 +252,39 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { @Override public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { - nic.setBroadcastUri(network.getBroadcastUri()); - nic.setIsolationUri(network.getBroadcastUri()); - - s_logger.debug("Handling reserve() call back to with Create a new VM or add an interface to existing VM in network " + network.getName()); - DataCenter dc = _dcDao.findById(network.getDataCenterId()); - Account networksAccount = _accountDao.findById(network.getAccountId()); - DomainVO networksDomain = _domainDao.findById(network.getDomainId()); - //Get the Account details and find the type - long networkOwnedBy = network.getAccountId(); - AccountVO neworkAccountDetails = _accountDao.findById(networkOwnedBy); - if (neworkAccountDetails.getType() == Account.ACCOUNT_TYPE_PROJECT) { - throw new InsufficientVirtualNetworkCapacityException("CS project support is " + "not yet implemented in NuageVsp", DataCenter.class, dc.getId()); + boolean lockedNetwork = lockNetworkForUserVm(network, vm); + if (lockedNetwork && s_logger.isDebugEnabled()) { + s_logger.debug("Locked network " + network.getId() + " for creation of user VM " + vm.getInstanceName()); } - //NicProfile does not contain the NIC UUID. We need this information to set it in the VMInterface and VPort - //that we create in VSP - NicVO nicFrmDB = _nicDao.findById(nic.getId()); - long networkOfferingId = _ntwkOfferingDao.findById(network.getNetworkOfferingId()).getId(); - boolean isL3Network = isL3Network(networkOfferingId); - Long vpcId = network.getVpcId(); - String vpcUuid = null; - if (vpcId != null) { - Vpc vpcObj = _vpcDao.findById(vpcId); - vpcUuid = vpcObj.getUuid(); - } - HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(nicFrmDB.getUuid(), nic.getMacAddress(), network.getUuid(), isL3Network, vpcUuid, - networksDomain.getUuid(), networksAccount.getUuid(), vm.getType().equals(VirtualMachine.Type.DomainRouter), network.getBroadcastUri().getPath().substring(1), - vm.getInstanceName(), vm.getUuid(), networksDomain.getUuid(), networksAccount.getUuid()); - ReserveVmInterfaceVspAnswer answer = (ReserveVmInterfaceVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); - - if (answer == null || !answer.getResult()) { - s_logger.error("ReserveVmInterfaceNuageVspCommand failed"); - 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()); - } - List> vmInterfacesDetails = answer.getInterfaceDetails(); - setIPGatewayMaskInfo(network, nic, vmInterfacesDetails); - } - - @Override - protected boolean canHandle(NetworkOffering offering, final NetworkType networkType, final PhysicalNetwork physicalNetwork) { - if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == Network.GuestType.Isolated - && isMyIsolationMethod(physicalNetwork)) { - return true; - } else { - s_logger.trace("We only take care of Guest networks of type " + GuestType.Isolated + " in zone of type " + NetworkType.Advanced); - return false; - } - } - - @Override - public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) { - long networkId = nic.getNetworkId(); - Network network = _networkDao.findById(networkId); - s_logger.debug("Handling release() call back, which is called when a VM is stopped or destroyed, to delete the VM with state " + vm.getVirtualMachine().getState() - + " from netork " + network.getName()); - if (vm.getVirtualMachine().getState().equals(VirtualMachine.State.Stopping)) { - try { - HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - ReleaseVmVspCommand cmd = new ReleaseVmVspCommand(network.getUuid(), vm.getUuid(), vm.getInstanceName()); - ReleaseVmVspAnswer answer = (ReleaseVmVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); - if (answer == null || !answer.getResult()) { - s_logger.error("ReleaseVmNuageVspCommand for VM " + vm.getUuid() + " failed"); - if ((null != answer) && (null != answer.getDetails())) { - s_logger.error(answer.getDetails()); - } - } - } catch (InsufficientVirtualNetworkCapacityException e) { - s_logger.debug("Handling release() call back. Failed to delete CS VM " + vm.getInstanceName() + " in VSP. " + e.getMessage()); - } - } else { - s_logger.debug("Handling release() call back. VM " + vm.getInstanceName() + " is in " + vm.getVirtualMachine().getState() + " state. So, the CS VM is not deleted." - + " This could be a case where VM interface is deleted. deallocate() call back should be called later"); - } - - return super.release(nic, vm, reservationId); - } - - @Override - @DB - public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) { - try { - s_logger.debug("Handling deallocate() call back, which is called when a VM is destroyed or interface is removed, " + "to delete VM Interface with IP " - + nic.getIPv4Address() + " from a VM " + vm.getInstanceName() + " with state " + vm.getVirtualMachine().getState()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Handling reserve() call back to with Create a new VM or add an interface to existing VM in network " + network.getName()); + } + nic.setBroadcastUri(network.getBroadcastUri()); + nic.setIsolationUri(network.getBroadcastUri()); + DataCenter dc = _dcDao.findById(network.getDataCenterId()); + Account networksAccount = _accountDao.findById(network.getAccountId()); DomainVO networksDomain = _domainDao.findById(network.getDomainId()); - NicVO nicFrmDd = _nicDao.findById(nic.getId()); - long networkOfferingId = _ntwkOfferingDao.findById(network.getNetworkOfferingId()).getId(); + //Get the Account details and find the type + long networkOwnedBy = network.getAccountId(); + AccountVO neworkAccountDetails = _accountDao.findById(networkOwnedBy); + if (neworkAccountDetails.getType() == Account.ACCOUNT_TYPE_PROJECT) { + throw new InsufficientVirtualNetworkCapacityException("CS project support is not yet implemented in NuageVsp", DataCenter.class, dc.getId()); + } + + //NicProfile does not contain the NIC UUID. We need this information to set it in the VMInterface and VPort + //that we create in VSP + NicVO nicFrmDB = _nicDao.findById(nic.getId()); + NetworkOffering networkOffering = _ntwkOfferingDao.findById(network.getNetworkOfferingId()); + boolean isDomainRouter = vm.getType().equals(VirtualMachine.Type.DomainRouter); + URI broadcastUri = network.getBroadcastUri(); + if (Strings.isNullOrEmpty(broadcastUri.getPath()) || !broadcastUri.getPath().startsWith("/")) { + throw new IllegalStateException("The broadcast URI path " + network.getBroadcastUri() + " is empty or in an incorrect format."); + } + String domainRouterIp = network.getBroadcastUri().getPath().substring(1); + boolean isL3Network = isL3Network(network); + boolean isSharedNetwork = networkOffering.getGuestType() == GuestType.Shared; Long vpcId = network.getVpcId(); String vpcUuid = null; if (vpcId != null) { @@ -299,22 +292,141 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { vpcUuid = vpcObj.getUuid(); } HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - DeallocateVmVspCommand cmd = new DeallocateVmVspCommand(network.getUuid(), nicFrmDd.getUuid(), nic.getMacAddress(), nic.getIPv4Address(), - isL3Network(networkOfferingId), vpcUuid, networksDomain.getUuid(), vm.getInstanceName(), vm.getUuid()); - DeallocateVmVspAnswer answer = (DeallocateVmVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); + IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(network.getId(), vm.getId()); + + ReserveVmInterfaceVspCommand.Builder cmdBuilder = new ReserveVmInterfaceVspCommand.Builder() + .nicUuid(nicFrmDB.getUuid()) + .nicMacAddress(nic.getMacAddress()) + .networkUuid(network.getUuid()) + .isL3Network(isL3Network) + .isSharedNetwork(isSharedNetwork) + .vpcUuid(vpcUuid) + .networkDomainUuid(networksDomain.getUuid()) + .networksAccountUuid(networksAccount.getUuid()) + .isDomainRouter(isDomainRouter) + .domainRouterIp(domainRouterIp) + .vmInstanceName(vm.getInstanceName()) + .vmUuid(vm.getUuid()) + .vmUserName(networksDomain.getUuid()) + .vmUserDomainName(networksAccount.getUuid()) + .useStaticIp(true) + .staticIp(nic.getIPv4Address()); + if (staticNatIp != null) { + VlanVO staticNatVlan = _vlanDao.findById(staticNatIp.getVlanId()); + cmdBuilder = cmdBuilder.staticNatIpUuid(staticNatIp.getUuid()) + .staticNatIpAddress(staticNatIp.getAddress().addr()) + .isStaticNatIpAllocated(staticNatIp.getState().equals(IpAddress.State.Allocated)) + .isOneToOneNat(staticNatIp.isOneToOneNat()) + .staticNatVlanUuid(staticNatVlan.getUuid()) + .staticNatVlanGateway(staticNatVlan.getVlanGateway()) + .staticNatVlanNetmask(staticNatVlan.getVlanNetmask()); + } + + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); if (answer == null || !answer.getResult()) { - s_logger.error("DeallocateVmNuageVspCommand for VM " + vm.getUuid() + " failed"); + s_logger.error("ReserveVmInterfaceNuageVspCommand failed for NIC " + nic.getId() + " attached to VM " + vm.getId() + " in network " + network.getId()); + 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()); + } + + if (isDomainRouter) { + nic.setIPv4Address(domainRouterIp); + } + + } finally { + if (network != null && lockedNetwork) { + _networkDao.releaseFromLockTable(network.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unlocked network " + network.getId() + " for creation of user VM " + vm.getInstanceName()); + } + } + } + } + + @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) + && isMyIsolationMethod(physicalNetwork)) { + return true; + } else { + if (s_logger.isTraceEnabled()) { + s_logger.trace("We only take care of Guest networks of type " + GuestType.Isolated + " in zone of type " + NetworkType.Advanced); + } + return false; + } + } + + @Override + @DB + public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) { + boolean lockedNetwork = lockNetworkForUserVm(network, vm); + if (lockedNetwork && s_logger.isDebugEnabled()) { + s_logger.debug("Locked network " + network.getId() + " for deallocation of user VM " + vm.getInstanceName()); + } + + try { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Handling deallocate() call back, which is called when a VM is destroyed or interface is removed, " + "to delete VM Interface with IP " + + nic.getIPv4Address() + " from a VM " + vm.getInstanceName() + " with state " + vm.getVirtualMachine().getState()); + } + DomainVO networksDomain = _domainDao.findById(network.getDomainId()); + NicVO nicFrmDd = _nicDao.findById(nic.getId()); + NetworkOffering networkOffering = _ntwkOfferingDao.findById(network.getNetworkOfferingId()); + boolean isL3Network = isL3Network(network); + boolean isSharedNetwork = networkOffering.getGuestType() == GuestType.Shared; + boolean isExpunging = vm.getVirtualMachine().getState() == VirtualMachine.State.Expunging; + Long vpcId = network.getVpcId(); + String vpcUuid = null; + if (vpcId != null) { + Vpc vpcObj = _vpcDao.findById(vpcId); + vpcUuid = vpcObj.getUuid(); + } + HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); + DeallocateVmVspCommand.Builder cmdBuilder = new DeallocateVmVspCommand.Builder() + .networkUuid(network.getUuid()) + .nicFromDbUuid(nicFrmDd.getUuid()) + .nicMacAddress(nic.getMacAddress()) + .nicIp4Address(nic.getIPv4Address()) + .isL3Network(isL3Network) + .isSharedNetwork(isSharedNetwork) + .vpcUuid(vpcUuid) + .networksDomainUuid(networksDomain.getUuid()) + .vmInstanceName(vm.getInstanceName()) + .vmUuid(vm.getUuid()) + .isExpungingState(isExpunging); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); + if (answer == null || !answer.getResult()) { + s_logger.error("DeallocateVmNuageVspCommand for VM " + vm.getUuid() + " failed on Nuage VSD " + nuageVspHost.getDetail("hostname")); if ((null != answer) && (null != answer.getDetails())) { s_logger.error(answer.getDetails()); } } - } catch (InsufficientVirtualNetworkCapacityException e) { - s_logger.error("Handling deallocate(). VM " + vm.getInstanceName() + " with NIC IP " + nic.getIPv4Address() - + " is getting destroyed. REST API failed to update the VM state in NuageVsp", e); + } finally { + if (network != null && lockedNetwork) { + _networkDao.releaseFromLockTable(network.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unlocked network " + network.getId() + " for deallocation of user VM " + vm.getInstanceName()); + } + } } + super.deallocate(network, nic, vm); } + private boolean lockNetworkForUserVm(Network network, VirtualMachineProfile vm) { + if (!vm.getVirtualMachine().getType().isUsedBySystem()) { + long networkId = network.getId(); + network = _networkDao.acquireInLockTable(network.getId(), 1200); + if (network == null) { + throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId); + } + return true; + } + return false; + } + @Override public void shutdown(NetworkProfile profile, NetworkOffering offering) { super.shutdown(profile, offering); @@ -322,55 +434,82 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { @Override public boolean trash(Network network, NetworkOffering offering) { - - s_logger.debug("Handling trash() call back to delete the network " + network.getName() + " with uuid " + network.getUuid() + " from VSP"); - long domainId = network.getDomainId(); - Domain domain = _domainDao.findById(domainId); - Long vpcId = network.getVpcId(); - String vpcUuid = null; - if (vpcId != null) { - Vpc vpcObj = _vpcDao.findById(vpcId); - vpcUuid = vpcObj.getUuid(); + long networkId = network.getId(); + network = _networkDao.acquireInLockTable(networkId, 1200); + if (network == null) { + throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId); } + try { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Handling trash() call back to delete the network " + network.getName() + " with uuid " + network.getUuid() + " from VSP"); + } + long domainId = network.getDomainId(); + Domain domain = _domainDao.findById(domainId); + boolean isL3Network = isL3Network(network); + boolean isSharedNetwork = offering.getGuestType() == GuestType.Shared; + Long vpcId = network.getVpcId(); + String vpcUuid = null; + if (vpcId != null) { + Vpc vpcObj = _vpcDao.findById(vpcId); + vpcUuid = vpcObj.getUuid(); + } + + String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configDao, network, offering); HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); - TrashNetworkVspCommand cmd = new TrashNetworkVspCommand(domain.getUuid(), network.getUuid(), isL3Network(offering.getId()), vpcUuid); - TrashNetworkVspAnswer answer = (TrashNetworkVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); + TrashNetworkVspCommand.Builder cmdBuilder = new TrashNetworkVspCommand.Builder() + .domainUuid(domain.getUuid()) + .networkUuid(network.getUuid()) + .isL3Network(isL3Network) + .isSharedNetwork(isSharedNetwork) + .vpcUuid(vpcUuid) + .domainTemplateName(preConfiguredDomainTemplateName); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmdBuilder.build()); if (answer == null || !answer.getResult()) { s_logger.error("TrashNetworkNuageVspCommand for network " + network.getUuid() + " failed"); if ((null != answer) && (null != answer.getDetails())) { s_logger.error(answer.getDetails()); } + return false; } - } catch (Exception e) { - s_logger.warn("Failed to clean up network information in Vsp " + e.getMessage()); + } finally { + _networkDao.releaseFromLockTable(network.getId()); } - return super.trash(network, offering); } - private String getVirtualRouterIP(Network network, Collection addressRange) throws InsufficientVirtualNetworkCapacityException { + private String getVirtualRouterIP(Network network, Collection ipAddressRanges) throws InsufficientVirtualNetworkCapacityException { String virtualRouterIp; + //Check if the subnet has minimum 5 host in it. String subnet = NetUtils.getCidrSubNet(network.getCidr()); String netmask = NetUtils.getCidrNetmask(network.getCidr()); long cidrSize = NetUtils.getCidrSize(netmask); Set allIPsInCidr = NetUtils.getAllIpsFromCidr(subnet, cidrSize, new HashSet()); + if (allIPsInCidr == null || !(allIPsInCidr instanceof TreeSet)) { + throw new IllegalStateException("The IPs in CIDR for subnet " + subnet + " where null or returned in a non-ordered set."); + } if (allIPsInCidr.size() > 3) { + //get the second IP and see if it the networks GatewayIP Iterator ipIterator = allIPsInCidr.iterator(); long vip = ipIterator.next(); if (NetUtils.ip2Long(network.getGateway()) == vip) { - s_logger.debug("Gateway of the Network(" + network.getUuid() + ") has the first IP " + NetUtils.long2Ip(vip)); vip = ipIterator.next(); virtualRouterIp = NetUtils.long2Ip(vip); - s_logger.debug("So, reserving the 2nd IP " + virtualRouterIp + " for the Virtual Router IP in Network(" + network.getUuid() + ")"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("1st IP is used as gateway IP. Reserving " + virtualRouterIp + " for the Virtual Router IP for Network(" + network.getName() + ")"); + } } else { virtualRouterIp = NetUtils.long2Ip(vip); - s_logger.debug("1nd IP is not used as the gateway IP. So, reserving" + virtualRouterIp + " for the Virtual Router IP for " + "Network(" + network.getUuid() + ")"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("1st IP is not used as the gateway IP. Reserving" + virtualRouterIp + " for the Virtual Router IP for Network(" + network.getName() + ")"); + } } - addressRange.add(NetUtils.long2Ip(ipIterator.next())); - addressRange.add(NetUtils.long2Ip((Long)allIPsInCidr.toArray()[allIPsInCidr.size() - 1])); + ipAddressRanges.add(new String[] { + NetUtils.long2Ip(ipIterator.next()), + NetUtils.getIpRangeEndIpFromCidr(subnet, cidrSize) + }); return virtualRouterIp; } @@ -378,30 +517,13 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { network.getId()); } - private void setIPGatewayMaskInfo(Network network, NicProfile nic, List> vmInterfacesDetails) throws InsufficientVirtualNetworkCapacityException { - try { - for (Map interfaces : vmInterfacesDetails) { - String macFromNuage = interfaces.get("mac"); - if (StringUtils.equals(macFromNuage, nic.getMacAddress())) { - nic.setIPv4Address(interfaces.get("ip4Address")); - nic.setIPv4Gateway(interfaces.get("gateway")); - nic.setIPv4Netmask(interfaces.get("netmask")); - break; - } - } - } catch (Exception e) { - s_logger.error("Failed to parse the VM interface Json response from VSP REST API. VM interface json string is " + vmInterfacesDetails, e); - throw new InsufficientVirtualNetworkCapacityException("Failed to parse the VM interface Json response from VSP REST API. VM interface Json " + "string is " - + vmInterfacesDetails + ". So. failed to get IP for the VM from VSP address for network " + network, Network.class, network.getId()); - } + private boolean isL3Network(Network network) { + return _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat) + || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.StaticNat) + || network.getGuestType() == GuestType.Shared; } - private boolean isL3Network(Long offeringId) { - return _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.SourceNat) - || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.StaticNat); - } - - private HostVO getNuageVspHost(long physicalNetworkId) throws InsufficientVirtualNetworkCapacityException { + private HostVO getNuageVspHost(long physicalNetworkId) { HostVO nuageVspHost; List nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId); if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) { @@ -409,8 +531,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { nuageVspHost = _hostDao.findById(config.getHostId()); _hostDao.loadDetails(nuageVspHost); } else { - throw new InsufficientVirtualNetworkCapacityException("Nuage VSD is not configured on physical network ", PhysicalNetwork.class, physicalNetworkId); + throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId); } return nuageVspHost; } -} +} \ No newline at end of file diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java index 2b4d2b558a2..0aae22ccce2 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java @@ -19,37 +19,66 @@ package com.cloud.network.manager; -import java.util.List; - -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.ConfigKey.Scope; - import com.cloud.api.commands.AddNuageVspDeviceCmd; import com.cloud.api.commands.DeleteNuageVspDeviceCmd; import com.cloud.api.commands.ListNuageVspDevicesCmd; +import com.cloud.api.commands.UpdateNuageVspDeviceCmd; import com.cloud.api.response.NuageVspDeviceResponse; +import com.cloud.network.Network; import com.cloud.network.NuageVspDeviceVO; import com.cloud.utils.component.PluggableService; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.ConfigKey.Scope; + +import java.util.List; public interface NuageVspManager extends PluggableService { - static final String NUAGE_VPC_OFFERING_NAME = "Default VPC offering with NuageVsp"; + static final String nuageVspSharedNetworkOfferingWithSGServiceName = "DefaultNuageVspSharedNetworkOfferingWithSGService"; - static final String NUAGE_VPC_OFFERING_DISPLAY_TEXT = "Default VPC offering with NuageVsp"; + static final String nuageVPCOfferingName = "Nuage VSP VPC Offering"; - static final ConfigKey NuageVspSyncInterval = new ConfigKey(Integer.class, "nuagevsp.sync.interval", "Advanced", "480", - "The interval (in minutes) to wait before running the next synchronization worker to synchronize the information between CloudStack and NuageVsp", false, Scope.Global, - 1); + static final String nuageVPCOfferingDisplayText = "Nuage VSP VPC Offering"; - static final ConfigKey NuageVspSyncWorkers = new ConfigKey(Integer.class, "nuagevsp.sync.workers", "Advanced", "1", - "Number of workers to synchronize the information between CloudStack and NuageVsp", false, Scope.Global, 1); + static final ConfigKey NuageVspConfigDns = new ConfigKey(Boolean.class, "nuagevsp.configure.dns", "Advanced", "true", + "Defines if NuageVsp plugin needs to configure DNS setting for a VM or not. True will configure the DNS and false will not configure the DNS settings", true, + Scope.Global, null); + + static final ConfigKey NuageVspDnsExternal = new ConfigKey( + Boolean.class, + "nuagevsp.dns.external", + "Advanced", + "true", + "Defines if NuageVsp plugin needs to configure either internal or external DNS server configured during Zone provisioning. " + + "Value true uses the external DNS and value false uses the internal DNS to configure in the VM. But, this flag depends on " + + "nuagevsp.configure.dns. Only if nuagevsp.configure.dns is set to true, DNS server will be configured in the VM. " + + "If nuagevsp.configure.dns is false, DNS server will not be configured in the VM. Default value for this flag is true", + true, Scope.Global, null); + + static final ConfigKey NuageVspConfigGateway = new ConfigKey(String.class, "nuagevsp.configure.gateway.systemid", "Advanced", "", + "Defines the systemID of the gateway configured in VSP", true, Scope.Global, null); + + static final ConfigKey NuageVspSharedNetworkDomainTemplateName = new ConfigKey(String.class, "nuagevsp.sharedntwk.domaintemplate.name", + "Advanced", "", "Defines if NuageVsp plugin needs to use pre created Domain Template configured in VSP for shared networks", true, Scope.Global, null); + + static final ConfigKey NuageVspVpcDomainTemplateName = new ConfigKey(String.class, "nuagevsp.vpc.domaintemplate.name", + "Advanced", "", "Defines if NuageVsp plugin needs to use pre created Domain Template configured in VSP for VPCs", true, Scope.Global, null); + + static final ConfigKey NuageVspIsolatedNetworkDomainTemplateName = new ConfigKey(String.class, "nuagevsp.isolatedntwk.domaintemplate.name", + "Advanced", "", "Defines if NuageVsp plugin needs to use pre created Domain Template configured in VSP for isolated networks", true, Scope.Global, null); NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd); + NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd cmd); + NuageVspDeviceResponse createNuageVspDeviceResponse(NuageVspDeviceVO nuageVspDeviceVO); boolean deleteNuageVspDevice(DeleteNuageVspDeviceCmd cmd); List listNuageVspDevices(ListNuageVspDevicesCmd cmd); + List getDnsDetails(Network network); + + List getGatewaySystemIds(); + } 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 fed970ede5a..dc53310dc20 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 @@ -19,45 +19,49 @@ package com.cloud.network.manager; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.Configurable; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.network.ExternalNetworkDeviceManager; -import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; - +import com.cloud.agent.AgentManager; +import com.cloud.agent.Listener; +import com.cloud.agent.api.AgentControlAnswer; +import com.cloud.agent.api.AgentControlCommand; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.PingNuageVspCommand; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.manager.GetClientDefaultsAnswer; +import com.cloud.agent.api.manager.GetClientDefaultsCommand; +import com.cloud.agent.api.manager.SupportedApiVersionCommand; +import com.cloud.agent.api.sync.SyncDomainAnswer; +import com.cloud.agent.api.sync.SyncDomainCommand; +import com.cloud.agent.api.sync.SyncNuageVspCmsIdAnswer; +import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand; import com.cloud.api.ApiDBUtils; import com.cloud.api.commands.AddNuageVspDeviceCmd; import com.cloud.api.commands.DeleteNuageVspDeviceCmd; import com.cloud.api.commands.IssueNuageVspResourceRequestCmd; import com.cloud.api.commands.ListNuageVspDevicesCmd; +import com.cloud.api.commands.UpdateNuageVspDeviceCmd; import com.cloud.api.response.NuageVspDeviceResponse; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.domain.Domain; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.ConnectionException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.DetailVO; import com.cloud.host.Host; import com.cloud.host.HostVO; +import com.cloud.host.Status; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; import com.cloud.network.Network; +import com.cloud.network.NetworkModel; import com.cloud.network.Networks; import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NuageVspDao; @@ -67,25 +71,79 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.resource.NuageVspResource; import com.cloud.network.sync.NuageVspSync; +import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.VpcOffering; +import com.cloud.network.vpc.VpcOfferingServiceMapVO; +import com.cloud.network.vpc.VpcOfferingVO; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcOfferingDao; import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao; +import com.cloud.network.vpc.dao.VpcServiceMapDao; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingServiceMapVO; +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.ResourceState; -import com.cloud.resource.ServerResource; +import com.cloud.user.AccountManager; +import com.cloud.user.DomainManager; import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.fsm.StateListener; +import com.cloud.utils.fsm.StateMachine2; +import com.google.common.base.Joiner; +import com.google.common.base.MoreObjects; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.nuage.vsp.acs.NuageVspPluginClientLoader; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.config.impl.ConfigurationVO; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.MessageSubscriber; +import org.apache.cloudstack.network.ExternalNetworkDeviceManager; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.CollectionUtils; +import org.apache.log4j.Logger; + +import javax.ejb.Local; +import javax.inject.Inject; +import javax.naming.ConfigurationException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ScheduledExecutorService; + +import static com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand.SyncType; @Local(value = {NuageVspManager.class}) -public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, Configurable { +public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, Configurable, StateListener { private static final Logger s_logger = Logger.getLogger(NuageVspManagerImpl.class); private static final int ONE_MINUTE_MULTIPLIER = 60 * 1000; + private static final Set NUAGE_VSP_PROVIDERS; + private static final Map> NUAGE_VSP_VPC_SERVICE_MAP; + private static final ConfigKey[] NUAGE_VSP_CONFIG_KEYS = new ConfigKey[] { NuageVspConfigDns, NuageVspDnsExternal, NuageVspConfigGateway, + NuageVspSharedNetworkDomainTemplateName, NuageVspVpcDomainTemplateName, NuageVspIsolatedNetworkDomainTemplateName }; + @Inject ResourceManager _resourceMgr; @Inject @@ -97,10 +155,6 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, @Inject PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao; @Inject - ConfigurationDao _configDao; - @Inject - NuageVspDao _nuageVspDao; - @Inject NetworkDao _networkDao; @Inject VpcOfferingDao _vpcOffDao; @@ -109,26 +163,59 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, @Inject VpcDao _vpcDao; @Inject - NuageVspDao nuageVspDao; + VpcManager _vpcManager; @Inject - NuageVspSync nuageVspSync; + NuageVspDao _nuageVspDao; + @Inject + NuageVspSync _nuageVspSync; + @Inject + DataCenterDao _dataCenterDao; + @Inject + ConfigurationDao _configDao; + @Inject + NetworkModel _ntwkModel; + @Inject + AccountManager _accountMgr; + @Inject + IPAddressDao _ipAddressDao; + @Inject + FirewallRulesDao _firewallDao; + @Inject + VpcServiceMapDao _vpcSrvcDao; + @Inject + AgentManager _agentMgr; + @Inject + private DomainDao _domainDao; + @Inject + NetworkOfferingDao _networkOfferingDao; + @Inject + NetworkOfferingServiceMapDao _networkOfferingServiceMapDao; private ScheduledExecutorService scheduler; + @Inject + MessageBus _messageBus; + + static { + NUAGE_VSP_PROVIDERS = ImmutableSet.of(Network.Provider.NuageVsp); + NUAGE_VSP_VPC_SERVICE_MAP = ImmutableMap.>builder() + .put(Network.Service.Connectivity, NUAGE_VSP_PROVIDERS) + .put(Network.Service.Dhcp, NUAGE_VSP_PROVIDERS) + .put(Network.Service.StaticNat, NUAGE_VSP_PROVIDERS) + .put(Network.Service.SourceNat, NUAGE_VSP_PROVIDERS) + .put(Network.Service.NetworkACL, NUAGE_VSP_PROVIDERS) + .build(); + } + @Override public List> getCommands() { - List> cmdList = new ArrayList>(); - cmdList.add(AddNuageVspDeviceCmd.class); - cmdList.add(DeleteNuageVspDeviceCmd.class); - cmdList.add(ListNuageVspDevicesCmd.class); - cmdList.add(IssueNuageVspResourceRequestCmd.class); - - return cmdList; + return Lists.>newArrayList(AddNuageVspDeviceCmd.class, DeleteNuageVspDeviceCmd.class, ListNuageVspDevicesCmd.class, + IssueNuageVspResourceRequestCmd.class, UpdateNuageVspDeviceCmd.class); } @Override public NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd) { - ServerResource resource = new NuageVspResource(); + final NuageVspResource resource = new NuageVspResource(); final String deviceName = Network.Provider.NuageVsp.getName(); ExternalNetworkDeviceManager.NetworkDevice networkDevice = ExternalNetworkDeviceManager.NetworkDevice.getNetworkDevice(deviceName); final Long physicalNetworkId = cmd.getPhysicalNetworkId(); @@ -141,8 +228,8 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(physicalNetwork.getId(), networkDevice.getNetworkServiceProvder()); if (ntwkSvcProvider == null) { - throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not added in the physical network: " + physicalNetworkId - + "to add this device"); + throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not enabled in the physical network: " + + physicalNetworkId + "to add this device"); } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) { throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + " is in shutdown state in the physical network: " + physicalNetworkId + "to add this device"); @@ -152,52 +239,188 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, throw new CloudRuntimeException("A NuageVsp device is already configured on this physical network"); } - Map params = new HashMap(); - params.put("guid", UUID.randomUUID().toString()); - params.put("zoneId", String.valueOf(physicalNetwork.getDataCenterId())); - params.put("physicalNetworkId", String.valueOf(physicalNetwork.getId())); - params.put("name", "Nuage VSD - " + cmd.getHostName()); - params.put("hostname", cmd.getHostName()); - params.put("cmsuser", cmd.getUserName()); - String cmsUserPasswordBase64 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(cmd.getPassword().getBytes(Charset.forName("UTF-8")))); - params.put("cmsuserpass", cmsUserPasswordBase64); - int port = cmd.getPort(); - if (0 == port) { - port = 443; - } - params.put("port", String.valueOf(port)); - params.put("apirelativepath", "/nuage/api/" + cmd.getApiVersion()); - params.put("retrycount", String.valueOf(cmd.getApiRetryCount())); - params.put("retryinterval", String.valueOf(cmd.getApiRetryInterval())); - - Map hostdetails = new HashMap(); - hostdetails.putAll(params); - try { - resource.configure(cmd.getHostName(), hostdetails); + NuageVspPluginClientLoader clientLoader = NuageVspPluginClientLoader.getClientLoader(null, null, 1, 1, null); - final Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, params); - if (host != null) { - return Transaction.execute(new TransactionCallback() { - @Override - public NuageVspDeviceVO doInTransaction(TransactionStatus status) { - NuageVspDeviceVO nuageVspDevice = new NuageVspDeviceVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName); - _nuageVspDao.persist(nuageVspDevice); + Map clientDefaults = clientLoader.getNuageVspManagerClient().getClientDefaults(); + String apiVersion = MoreObjects.firstNonNull(cmd.getApiVersion(), (String) clientDefaults.get("CURRENT_API_VERSION")); + if (!clientLoader.getNuageVspManagerClient().isSupportedApiVersion(apiVersion)) { + throw new CloudRuntimeException("Unsupported API version : " + apiVersion); + } - DetailVO detail = new DetailVO(host.getId(), "nuagevspdeviceid", String.valueOf(nuageVspDevice.getId())); - _hostDetailsDao.persist(detail); + int port = cmd.getPort(); + if (0 == port) { + port = 8443; + } + String cmsUserPasswordBase64 = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(cmd.getPassword().getBytes())); + String retryCount = String.valueOf(MoreObjects.firstNonNull(cmd.getApiRetryCount(), clientDefaults.get("DEFAULT_API_RETRY_COUNT"))); + String retryInterval = String.valueOf(MoreObjects.firstNonNull(cmd.getApiRetryInterval(), clientDefaults.get("DEFAULT_API_RETRY_INTERVAL"))); + NuageVspResource.Configuration resourceConfiguration = new NuageVspResource.Configuration() + .name("Nuage VSD - " + cmd.getHostName()) + .guid(UUID.randomUUID().toString()) + .zoneId(String.valueOf(physicalNetwork.getDataCenterId())) + .hostName(cmd.getHostName()) + .cmsUser(cmd.getUserName()) + .cmsUserPassword(cmsUserPasswordBase64) + .port(String.valueOf(port)) + .apiVersion(apiVersion) + .apiRelativePath("/nuage/api/" + apiVersion) + .retryCount(retryCount) + .retryInterval(retryInterval); - return nuageVspDevice; - } - }); - } else { + Map hostDetails = resourceConfiguration.build(); + resource.configure(cmd.getHostName(), Maps.newHashMap(hostDetails)); + Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, hostDetails); + if (host == null) { throw new CloudRuntimeException("Failed to add Nuage Vsp Device due to internal error."); } + + NuageVspDeviceVO nuageVspDevice = new NuageVspDeviceVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), deviceName); + _nuageVspDao.persist(nuageVspDevice); + + DetailVO detail = new DetailVO(host.getId(), "nuagevspdeviceid", String.valueOf(nuageVspDevice.getId())); + _hostDetailsDao.persist(detail); + + ConfigurationVO cmsIdConfig = _configDao.findByName("nuagevsp.cms.id"); + host = findNuageVspHost(nuageVspDevice.getHostId()); + SyncNuageVspCmsIdCommand syncCmd = new SyncNuageVspCmsIdCommand(SyncType.REGISTER, null); + SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) _agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd); + if (answer != null && answer.getSuccess()) { + registerNewNuageVspDevice(cmsIdConfig, nuageVspDevice.getId() + ":" + answer.getNuageVspCmsId()); + + detail = new DetailVO(host.getId(), "nuagevspcmsid", answer.getNuageVspCmsId()); + _hostDetailsDao.persist(detail); + + resourceConfiguration.nuageVspCmsId(answer.getNuageVspCmsId()); + resource.configure(cmd.getHostName(), Maps.newHashMap(resourceConfiguration.build())); + + auditDomainsOnVsp((HostVO) host, true, false); + } else { + throw new CloudRuntimeException("Failed to register CMS ID"); + } + return nuageVspDevice; } catch (ConfigurationException e) { - throw new CloudRuntimeException(e.getMessage()); + s_logger.error("Failed to configure Nuage VSD resource " + cmd.getHostName(), e); + throw new CloudRuntimeException("Failed to configure Nuage VSD resource " + cmd.getHostName(), e); + } catch (ExecutionException ee) { + s_logger.error("Failed to add Nuage VSP device " + cmd.getHostName(), ee); + throw new CloudRuntimeException("Failed to add Nuage VSP device " + cmd.getHostName(), ee); } } + @Override + public NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd command) { + NuageVspResource resource = new NuageVspResource(); + final String deviceName = Network.Provider.NuageVsp.getName(); + ExternalNetworkDeviceManager.NetworkDevice networkDevice = ExternalNetworkDeviceManager.NetworkDevice.getNetworkDevice(deviceName); + final Long physicalNetworkId = command.getPhysicalNetworkId(); + PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); + if (physicalNetwork == null) { + throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId); + } + + final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(physicalNetwork.getId(), + networkDevice.getNetworkServiceProvder()); + if (ntwkSvcProvider == null) { + throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not enabled in the physical network: " + + physicalNetworkId + "to add this device"); + } + if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) { + throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + " is in shutdown state in the physical network: " + + physicalNetworkId + "to add this device"); + } + + HostVO nuageVspHost = null; + NuageVspDeviceVO nuageVspDevice = null; + List nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId); + if (nuageVspDevices == null || nuageVspDevices.isEmpty()) { + throw new CloudRuntimeException("Nuage VSD is not configured on physical network " + physicalNetworkId); + } else { + nuageVspDevice = nuageVspDevices.iterator().next(); + nuageVspHost = _hostDao.findById(nuageVspDevice.getHostId()); + _hostDao.loadDetails(nuageVspHost); + } + + boolean updateRequired = false; + NuageVspResource.Configuration resourceConfiguration = NuageVspResource.Configuration.fromConfiguration(nuageVspHost.getDetails()); + if (!Strings.isNullOrEmpty(command.getHostName()) && + !command.getHostName().equals(resourceConfiguration.hostName())) { + resourceConfiguration.name("Nuage VSD - " + command.getHostName()); + resourceConfiguration.hostName(command.getHostName()); + updateRequired = true; + } + + if (!Strings.isNullOrEmpty(command.getUserName()) && + !command.getUserName().equals(resourceConfiguration.cmsUser())) { + resourceConfiguration.cmsUser(command.getUserName()); + updateRequired = true; + } + + if (!Strings.isNullOrEmpty(command.getPassword())) { + String encodedNewPassword = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(command.getPassword().getBytes())); + if (!encodedNewPassword.equals(resourceConfiguration.cmsUserPassword())) { + resourceConfiguration.cmsUserPassword(encodedNewPassword); + updateRequired = true; + } + } + + if (command.getPort() != null && + command.getPort() != Integer.parseInt(resourceConfiguration.port())) { + resourceConfiguration.port(String.valueOf(command.getPort())); + updateRequired = true; + } + + GetClientDefaultsCommand getClientDefaultsCmd = new GetClientDefaultsCommand(); + GetClientDefaultsAnswer getClientDefaultsAnswer = (GetClientDefaultsAnswer) _agentMgr.easySend(nuageVspHost.getId(), getClientDefaultsCmd); + String apiVersion = MoreObjects.firstNonNull(command.getApiVersion(), resourceConfiguration.apiVersion()); + SupportedApiVersionCommand supportedApiVersionCmd = new SupportedApiVersionCommand(apiVersion); + Answer supportedApiVersionAnswer = _agentMgr.easySend(nuageVspHost.getId(), supportedApiVersionCmd); + if (!supportedApiVersionAnswer.getResult()) { + throw new CloudRuntimeException("Incorrect API version: Nuage plugin only supports " + getClientDefaultsAnswer.getCurrentApiVersion()); + } + + String apiRelativePath = "/nuage/api/" + apiVersion; + if (!apiRelativePath.equals(resourceConfiguration.apiRelativePath())) { + resourceConfiguration.apiVersion(apiVersion); + resourceConfiguration.apiRelativePath(apiRelativePath); + updateRequired = true; + } + + if (command.getApiRetryCount() != null && resourceConfiguration.retryCount() != null) { + final int retryCount = Integer.parseInt(resourceConfiguration.retryCount()); + if (command.getApiRetryCount() != retryCount) { + resourceConfiguration.retryCount(String.valueOf(command.getApiRetryCount())); + updateRequired = true; + } + } + + if (command.getApiRetryInterval() != null && resourceConfiguration.retryInterval() != null) { + final int apiRetryInterval = Integer.parseInt(resourceConfiguration.retryInterval()); + if (command.getApiRetryInterval() != apiRetryInterval) { + resourceConfiguration.retryInterval(String.valueOf(command.getApiRetryInterval())); + updateRequired = true; + } + } + + if (!updateRequired) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("No change in the NuageVsp device parameters. None of the NuageVsp device parameters are modified"); + } + return nuageVspDevice; + } + + Map config = resourceConfiguration.build(); + String updateParameters = "{" + Joiner.on(", ").withKeyValueSeparator(": ").join(config) + "}"; + Map hostDetails = Maps.newHashMap(config); + try { + resource.configure(resourceConfiguration.hostName(), hostDetails); + _hostDetailsDao.persist(nuageVspDevice.getHostId(), config); + } catch (ConfigurationException e) { + throw new CloudRuntimeException("Failed to update Nuage VSP device " + nuageVspDevice.getId() + " with parameters " + updateParameters, e); + } + return nuageVspDevice; + } + @Override public NuageVspDeviceResponse createNuageVspDeviceResponse(NuageVspDeviceVO nuageVspDeviceVO) { HostVO nuageVspHost = _hostDao.findById(nuageVspDeviceVO.getHostId()); @@ -234,7 +457,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); if (physicalNetwork != null) { // Lets see if there are networks that use us - // Find the NuageVsp on this physical network + // Find the nuage networks on this physical network List networkList = _networkDao.listByPhysicalNetwork(physicalNetworkId); // Networks with broadcast type lswitch are ours @@ -247,6 +470,26 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, } } + ConfigurationVO cmsIdConfig = _configDao.findByName("nuagevsp.cms.id"); + HostVO host = findNuageVspHost(nuageVspDevice.getHostId()); + if (!auditDomainsOnVsp(host, false, true)) { + return false; + } + + String nuageVspCmsId = findNuageVspCmsIdForDevice(nuageVspDevice.getId(), cmsIdConfig); + SyncNuageVspCmsIdCommand syncCmd = new SyncNuageVspCmsIdCommand(SyncType.UNREGISTER, nuageVspCmsId); + SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) _agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd); + if (answer != null && answer.getSuccess()) { + String currentValue = cmsIdConfig.getValue(); + String newValue = currentValue.replace(nuageVspDevice.getId() + ":" + answer.getNuageVspCmsId(), ""); + if (!Strings.isNullOrEmpty(newValue) && newValue.startsWith(";")) { + newValue = newValue.substring(1); + } + _configDao.update("nuagevsp.cms.id", newValue); + } else { + return false; + } + HostVO nuageHost = _hostDao.findById(nuageVspDevice.getHostId()); Long hostId = nuageHost.getId(); @@ -285,60 +528,331 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, return responseList; } - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - try { - initNuageScheduledTasks(); - } catch (Exception ce) { - s_logger.warn("Failed to load NuageVsp configuration properties. Check if the NuageVsp properties are configured correctly"); + private void registerNewNuageVspDevice(ConfigurationVO currentConfig, String registeredNuageVspDevice) { + if (currentConfig == null) { + ConfigKey configKey = new ConfigKey("Advanced", String.class, "nuagevsp.cms.id", registeredNuageVspDevice, + ": - Do not edit", false); + ConfigurationVO configuration = new ConfigurationVO("management-server", configKey); + _configDao.persist(configuration); + } else { + String newValue; + String currentValue = currentConfig.getValue(); + if (!Strings.isNullOrEmpty(currentValue)) { + newValue = currentValue + ";" + registeredNuageVspDevice; + } else { + newValue = registeredNuageVspDevice; + } + _configDao.update("nuagevsp.cms.id", newValue); + } + } + + private void auditHost(HostVO host) { + _hostDao.loadDetails(host); + + boolean validateDomains = true; + List nuageVspDevices = _nuageVspDao.listByHost(host.getId()); + if (!CollectionUtils.isEmpty(nuageVspDevices)) { + for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) { + ConfigurationVO cmsIdConfig = _configDao.findByName("nuagevsp.cms.id"); + String nuageVspCmsId = findNuageVspCmsIdForDevice(nuageVspDevice.getId(), cmsIdConfig); + SyncNuageVspCmsIdCommand syncCmd = new SyncNuageVspCmsIdCommand(SyncType.AUDIT, nuageVspCmsId); + SyncNuageVspCmsIdAnswer answer = (SyncNuageVspCmsIdAnswer) _agentMgr.easySend(nuageVspDevice.getHostId(), syncCmd); + + if (answer != null && !answer.getSuccess()) { + s_logger.error("Nuage VSP Device with ID " + nuageVspDevice.getId() + " is configured with an unknown CMS ID!"); + validateDomains = false; + } else if (answer != null && answer.getSyncType() == SyncType.REGISTER) { + registerNewNuageVspDevice(cmsIdConfig, nuageVspDevice.getId() + ":" + answer.getNuageVspCmsId()); + } + } + } + + if (validateDomains) { + auditDomainsOnVsp(host, true, false); + } + } + + private boolean auditDomainsOnVsp(HostVO host, boolean add, boolean remove) { + List nuageVspDevices = _nuageVspDao.listByHost(host.getId()); + if (CollectionUtils.isEmpty(nuageVspDevices)) { + return true; + } + + _hostDao.loadDetails(host); + List allDomains = _domainDao.listAll(); + for (DomainVO domain : allDomains) { + SyncDomainCommand cmd = new SyncDomainCommand(domain.getUuid(), domain.getName(), domain.getPath(), add, remove); + SyncDomainAnswer answer = (SyncDomainAnswer) _agentMgr.easySend(host.getId(), cmd); + return answer.getSuccess(); } return true; } - private void initNuageScheduledTasks() { - Integer numOfSyncThreads = Integer.valueOf(_configDao.getValue(NuageVspManager.NuageVspSyncWorkers.key())); - Integer syncUpIntervalInMinutes = Integer.valueOf(_configDao.getValue(NuageVspManager.NuageVspSyncInterval.key())); - - if (numOfSyncThreads != null && syncUpIntervalInMinutes != null) { - ThreadFactory threadFactory = new ThreadFactory() { - public Thread newThread(Runnable runnable) { - Thread thread = new Thread(runnable, "Nuage Vsp sync task"); - if (thread.isDaemon()) - thread.setDaemon(false); - if (thread.getPriority() != Thread.NORM_PRIORITY) - thread.setPriority(Thread.NORM_PRIORITY); - return thread; + private String findNuageVspCmsIdForDevice(long deviceId, ConfigurationVO cmsIdConfig) { + String configValue = cmsIdConfig.getValue(); + if (!Strings.isNullOrEmpty(configValue)) { + String[] configuredNuageVspDevices = configValue.split(";"); + for (String configuredNuageVspDevice : configuredNuageVspDevices) { + if (configuredNuageVspDevice.startsWith(deviceId + ":")) { + String[] split = configuredNuageVspDevice.split(":"); + if (split.length != 2 || (split.length > 1 && Strings.isNullOrEmpty(split[1]))) { + throw new IllegalArgumentException("The configured CMS ID for Nuage VSP device " + deviceId + " is in an incorrect format"); + } + return split[1]; } - }; - scheduler = Executors.newScheduledThreadPool(numOfSyncThreads, threadFactory); - scheduler.scheduleWithFixedDelay(new NuageVspSyncTask("FLOATING_IP"), ONE_MINUTE_MULTIPLIER * 15, ONE_MINUTE_MULTIPLIER * syncUpIntervalInMinutes, - TimeUnit.MILLISECONDS); - scheduler.scheduleWithFixedDelay(new NuageVspSyncTask("ENTERPRISE_NTWK_MACRO"), ONE_MINUTE_MULTIPLIER * 15, ONE_MINUTE_MULTIPLIER * syncUpIntervalInMinutes, - TimeUnit.MILLISECONDS); - scheduler - .scheduleWithFixedDelay(new NuageVspSyncTask("ENTERPRISE"), ONE_MINUTE_MULTIPLIER * 15, ONE_MINUTE_MULTIPLIER * syncUpIntervalInMinutes, TimeUnit.MILLISECONDS); - } else { - s_logger.warn("NuageVsp configuration for syncWorkers=" + numOfSyncThreads + " syncInterval=" + syncUpIntervalInMinutes - + " could not be read properly. So, check if the properties are configured properly in global properties"); + } } + return null; } - public class NuageVspSyncTask implements Runnable { - - private String nuageVspEntity; - - public NuageVspSyncTask(String nuageVspEntity) { - this.nuageVspEntity = nuageVspEntity; + public List getDnsDetails(Network network) { + Boolean configureDns = Boolean.valueOf(_configDao.getValue(NuageVspManager.NuageVspConfigDns.key())); + if (!configureDns) { + return Lists.newArrayList(); } - public String getNuageVspEntity() { - return nuageVspEntity; + Boolean configureExternalDns = Boolean.valueOf(_configDao.getValue(NuageVspManager.NuageVspDnsExternal.key())); + DataCenterVO dc = _dataCenterDao.findById(network.getDataCenterId()); + List dnsServers = new ArrayList(); + if (configureExternalDns) { + if (!Strings.isNullOrEmpty(dc.getDns1())) { + dnsServers.add(dc.getDns1()); + } + if (!Strings.isNullOrEmpty(dc.getDns2())) { + dnsServers.add(dc.getDns2()); + } + } else { + if (!Strings.isNullOrEmpty(dc.getInternalDns1())) { + dnsServers.add(dc.getInternalDns1()); + } + if (!Strings.isNullOrEmpty(dc.getInternalDns2())) { + dnsServers.add(dc.getInternalDns2()); + } } + return dnsServers; + } - @Override - public void run() { - nuageVspSync.syncWithNuageVsp(nuageVspEntity); + public List getGatewaySystemIds() { + String gatewaySystemIds = String.valueOf(_configDao.getValue(NuageVspManager.NuageVspConfigGateway.key())); + if (!Strings.isNullOrEmpty(gatewaySystemIds)) { + return Lists.newArrayList(gatewaySystemIds.split(",")); } + return Lists.newArrayList(); + } + + @Override + public boolean preStateTransitionEvent(Status oldState, Status.Event event, Status newState, Host host, boolean status, Object opaque) { + return true; + } + + @Override + public boolean postStateTransitionEvent(StateMachine2.Transition transition, Host vo, boolean status, Object opaque) { + // Whenever a Nuage VSP Host comes up, check if all CS domains are present and check if the CMS ID is valid + if (transition.getToState() == Status.Up && vo instanceof HostVO) { + auditHost((HostVO) vo); + } + return true; + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + initMessageBusListeners(); + initNuageVspResourceListeners(); + initNuageNetworkOffering(); + initNuageVspVpcOffering(); + Status.getStateMachine().registerListener(this); + return true; + } + + @DB + private void initMessageBusListeners() { + // Create corresponding enterprise and profile in VSP when creating a CS Domain + _messageBus.subscribe(DomainManager.MESSAGE_ADD_DOMAIN_EVENT, new MessageSubscriber() { + @Override + public void onPublishMessage(String senderAddress, String subject, Object args) { + Long domainId = (Long) args; + Domain domain = _domainDao.findById(domainId); + + try { + _domainDao.acquireInLockTable(domain.getId()); + + List nuageVspDevices = _nuageVspDao.listAll(); + for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) { + HostVO host = findNuageVspHost(nuageVspDevice.getHostId()); + SyncDomainCommand cmd = new SyncDomainCommand(domain.getUuid(), domain.getName(), domain.getPath(), true, false); + _agentMgr.easySend(host.getId(), cmd); + } + } finally { + _domainDao.releaseFromLockTable(domain.getId()); + } + } + }); + + // Delete corresponding enterprise and profile in VSP when deleting a CS Domain + _messageBus.subscribe(DomainManager.MESSAGE_REMOVE_DOMAIN_EVENT, new MessageSubscriber() { + @Override + public void onPublishMessage(String senderAddress, String subject, Object args) { + DomainVO domain = (DomainVO) args; + List nuageVspDevices = _nuageVspDao.listAll(); + for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) { + HostVO host = findNuageVspHost(nuageVspDevice.getHostId()); + SyncDomainCommand cmd = new SyncDomainCommand(domain.getUuid(), domain.getName(), domain.getPath(), false, true); + _agentMgr.easySend(host.getId(), cmd); + } + } + }); + } + + @DB + private void initNuageVspResourceListeners() { + _agentMgr.registerForHostEvents(new Listener() { + @Override + public boolean processAnswers(long agentId, long seq, Answer[] answers) { + return true; + } + + @Override + public boolean processCommands(long agentId, long seq, Command[] commands) { + if (commands != null && commands.length == 1) { + Command command = commands[0]; + if (command instanceof PingNuageVspCommand) { + PingNuageVspCommand pingNuageVspCommand = (PingNuageVspCommand) command; + if (pingNuageVspCommand.shouldAudit()) { + Host host = _hostDao.findById(pingNuageVspCommand.getHostId()); + auditHost((HostVO) host); + } + } + } + return true; + } + + @Override + public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { + return null; + } + + @Override + public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + + } + + @Override + public boolean processDisconnect(long agentId, Status state) { + return true; + } + + @Override + public boolean isRecurring() { + return false; + } + + @Override + public int getTimeout() { + return 0; + } + + @Override + public boolean processTimeout(long agentId, long seq) { + return true; + } + }, false, true, false); + } + + @DB + private void initNuageNetworkOffering() { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + NetworkOffering sharedNetworkOfferingWithSG = _networkOfferingDao.findByUniqueName(nuageVspSharedNetworkOfferingWithSGServiceName); + if (sharedNetworkOfferingWithSG == null) { + NetworkOfferingVO defaultNuageVspSharedSGNetworkOffering = + new NetworkOfferingVO(nuageVspSharedNetworkOfferingWithSGServiceName, "Offering for NuageVsp Shared Security group enabled networks", + Networks.TrafficType.Guest, false, false, null, null, true, NetworkOffering.Availability.Optional, null, Network.GuestType.Shared, true, true, false, false, false); + + defaultNuageVspSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled); + defaultNuageVspSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNuageVspSharedSGNetworkOffering); + + Map defaultNuageVspSharedSGNetworkOfferingProviders = new HashMap<>(); + defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.Dhcp, Network.Provider.NuageVsp); + defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.SecurityGroup, Network.Provider.NuageVsp); + defaultNuageVspSharedSGNetworkOfferingProviders.put(Network.Service.Connectivity, Network.Provider.NuageVsp); + + for (Network.Service service : defaultNuageVspSharedSGNetworkOfferingProviders.keySet()) { + NetworkOfferingServiceMapVO offService = + new NetworkOfferingServiceMapVO(defaultNuageVspSharedSGNetworkOffering.getId(), service, defaultNuageVspSharedSGNetworkOfferingProviders.get(service)); + _networkOfferingServiceMapDao.persist(offService); + if (s_logger.isTraceEnabled()) { + s_logger.trace("Added service for the NuageVsp network offering: " + offService); + } + } + } + } + }); + } + + @DB + private void initNuageVspVpcOffering() { + //configure default Nuage VSP vpc offering + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + if (_vpcOffDao.findByUniqueName(nuageVPCOfferingName) == null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating default Nuage VPC offering " + nuageVPCOfferingName); + } + + Map> svcProviderMap = Maps.newHashMap(NUAGE_VSP_VPC_SERVICE_MAP); + Set userDataProviders = Collections.singleton(Network.Provider.VPCVirtualRouter); + svcProviderMap.put(Network.Service.UserData, userDataProviders); + + createVpcOffering(nuageVPCOfferingName, nuageVPCOfferingDisplayText, svcProviderMap, true, VpcOffering.State.Enabled, null); + } + } + }); + } + + @DB + protected VpcOffering createVpcOffering(final String name, final String displayText, final Map> svcProviderMap, final boolean isDefault, + final VpcOffering.State state, final Long serviceOfferingId) { + return Transaction.execute(new TransactionCallback() { + @Override + public VpcOffering doInTransaction(TransactionStatus status) { + // create vpc offering object + VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, serviceOfferingId, false, false); + + if (state != null) { + offering.setState(state); + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Adding vpc offering " + offering); + } + offering = _vpcOffDao.persist(offering); + // populate services and providers + if (svcProviderMap != null) { + for (Network.Service service : svcProviderMap.keySet()) { + Set providers = svcProviderMap.get(service); + if (providers != null && !providers.isEmpty()) { + for (Network.Provider provider : providers) { + VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider); + _vpcOffSvcMapDao.persist(offService); + if (s_logger.isTraceEnabled()) { + s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName()); + } + } + } else { + throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName()); + } + } + } + return offering; + } + }); + } + + private HostVO findNuageVspHost(long hostId) { + HostVO host = _hostDao.findById(hostId); + _hostDao.loadDetails(host); + return host; } @Override @@ -348,6 +862,6 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {NuageVspSyncWorkers, NuageVspSyncInterval}; + return Arrays.copyOf(NUAGE_VSP_CONFIG_KEYS, NUAGE_VSP_CONFIG_KEYS.length); } } 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 65c8ae96fa3..c89ea15a273 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,131 +19,148 @@ package com.cloud.network.resource; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import javax.naming.ConfigurationException; - -import net.nuage.vsp.acs.NuageVspPluginClientLoader; -import net.nuage.vsp.acs.client.NuageVspApiClient; -import net.nuage.vsp.acs.client.NuageVspElementClient; -import net.nuage.vsp.acs.client.NuageVspGuruClient; -import net.nuage.vsp.acs.client.NuageVspSyncClient; - -import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; - import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.MaintainAnswer; import com.cloud.agent.api.MaintainCommand; import com.cloud.agent.api.PingCommand; +import com.cloud.agent.api.PingNuageVspCommand; import com.cloud.agent.api.ReadyAnswer; import com.cloud.agent.api.ReadyCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupVspCommand; import com.cloud.agent.api.VspResourceAnswer; import com.cloud.agent.api.VspResourceCommand; -import com.cloud.agent.api.element.ApplyAclRuleVspAnswer; import com.cloud.agent.api.element.ApplyAclRuleVspCommand; -import com.cloud.agent.api.element.ApplyStaticNatVspAnswer; import com.cloud.agent.api.element.ApplyStaticNatVspCommand; -import com.cloud.agent.api.element.ShutDownVpcVspAnswer; +import com.cloud.agent.api.element.ImplementVspCommand; import com.cloud.agent.api.element.ShutDownVpcVspCommand; -import com.cloud.agent.api.guru.DeallocateVmVspAnswer; import com.cloud.agent.api.guru.DeallocateVmVspCommand; -import com.cloud.agent.api.guru.ImplementNetworkVspAnswer; import com.cloud.agent.api.guru.ImplementNetworkVspCommand; -import com.cloud.agent.api.guru.ReleaseVmVspAnswer; -import com.cloud.agent.api.guru.ReleaseVmVspCommand; -import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer; import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; -import com.cloud.agent.api.guru.TrashNetworkVspAnswer; import com.cloud.agent.api.guru.TrashNetworkVspCommand; -import com.cloud.agent.api.sync.SyncVspAnswer; +import com.cloud.agent.api.manager.GetClientDefaultsAnswer; +import com.cloud.agent.api.manager.GetClientDefaultsCommand; +import com.cloud.agent.api.manager.SupportedApiVersionCommand; +import com.cloud.agent.api.sync.SyncDomainAnswer; +import com.cloud.agent.api.sync.SyncDomainCommand; +import com.cloud.agent.api.sync.SyncNuageVspCmsIdAnswer; +import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand; import com.cloud.agent.api.sync.SyncVspCommand; import com.cloud.host.Host; import com.cloud.resource.ServerResource; +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.NuageVspApiClient; +import net.nuage.vsp.acs.client.NuageVspElementClient; +import net.nuage.vsp.acs.client.NuageVspGuruClient; +import net.nuage.vsp.acs.client.NuageVspManagerClient; +import net.nuage.vsp.acs.client.NuageVspSyncClient; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.tuple.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; public class NuageVspResource extends ManagerBase implements ServerResource { private static final Logger s_logger = Logger.getLogger(NuageVspResource.class); + private static final String NAME = "name"; + private static final String GUID = "guid"; + private static final String ZONE_ID = "zoneid"; + private static final String HOST_NAME = "hostname"; + private static final String CMS_USER = "cmsuser"; + private static final String CMS_USER_PASSWORD = "cmsuserpass"; + private static final String PORT = "port"; + private static final String API_VERSION = "apiversion"; + private static final String API_RELATIVE_PATH = "apirelativepath"; + private static final String RETRY_COUNT = "retrycount"; + private static final String RETRY_INTERVAL = "retryinterval"; + private static final String NUAGE_VSP_CMS_ID = "nuagevspcmsid"; + private String _name; private String _guid; private String _zoneId; private String[] _cmsUserInfo; + private String _hostName; private String _relativePath; private int _numRetries; private int _retryInterval; + private String _nuageVspCmsId; + private boolean _shouldAudit = true; protected NuageVspApiClient _nuageVspApiClient; protected NuageVspGuruClient _nuageVspGuruClient; protected NuageVspElementClient _nuageVspElementClient; protected NuageVspSyncClient _nuageVspSyncClient; + protected NuageVspManagerClient _nuageVspManagerClient; protected boolean _isNuageVspClientLoaded; private static final String CMS_USER_ENTEPRISE_NAME = "CSP"; private static final String NUAGE_VSP_PLUGIN_ERROR_MESSAGE = "Nuage Vsp plugin client is not installed"; - private static final String NUAGE_PLUGIN_CLIENT_JAR_FILE = "/usr/share/nuagevsp/lib/nuage-vsp-acs-client.jar"; - private static final String NUAGE_VSP_API_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspApiClientImpl"; - private static final String NUAGE_VSP_SYNC_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspSyncClientImpl"; - private static final String NUAGE_VSP_ELEMENT_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspElementClientImpl"; - private static final String NUAGE_VSP_GURU_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspGuruClientImpl"; @Override public boolean configure(String name, Map params) throws ConfigurationException { - _name = (String)params.get("name"); + _name = (String)params.get(NAME); if (_name == null) { throw new ConfigurationException("Unable to find name"); } - _guid = (String)params.get("guid"); + _guid = (String)params.get(GUID); if (_guid == null) { throw new ConfigurationException("Unable to find the guid"); } - _zoneId = (String)params.get("zoneId"); + _zoneId = (String)params.get(ZONE_ID); if (_zoneId == null) { throw new ConfigurationException("Unable to find zone"); } - String hostname = (String)params.get("hostname"); - if (hostname == null) { + _hostName = (String)params.get(HOST_NAME); + if (Strings.isNullOrEmpty(_hostName)) { throw new ConfigurationException("Unable to find hostname"); } - String cmsUser = (String)params.get("cmsuser"); - if (cmsUser == null) { + String cmsUser = (String)params.get(CMS_USER); + if (Strings.isNullOrEmpty(cmsUser)) { throw new ConfigurationException("Unable to find CMS username"); } - String cmsUserPassBase64 = (String)params.get("cmsuserpass"); - if (cmsUserPassBase64 == null) { + String cmsUserPassBase64 = (String)params.get(CMS_USER_PASSWORD); + if (Strings.isNullOrEmpty(cmsUserPassBase64)) { throw new ConfigurationException("Unable to find CMS password"); } - String port = (String)params.get("port"); - if (port == null) { + String port = (String)params.get(PORT); + if (Strings.isNullOrEmpty(port)) { throw new ConfigurationException("Unable to find port"); } - String apiRelativePath = (String)params.get("apirelativepath"); - if ((apiRelativePath != null) && (!apiRelativePath.isEmpty())) { - String apiVersion = apiRelativePath.substring(apiRelativePath.lastIndexOf('/') + 1); - if (!Pattern.matches("v\\d+_\\d+", apiVersion)) { - throw new ConfigurationException("Incorrect API version"); - } - } else { + String apiVersion = (String)params.get(API_VERSION); + if (Strings.isNullOrEmpty(apiVersion)) { throw new ConfigurationException("Unable to find API version"); + } else if (!Pattern.matches("v\\d+_\\d+", apiVersion)) { + throw new ConfigurationException("Incorrect API version"); } - String retryCount = (String)params.get("retrycount"); - if ((retryCount != null) && (!retryCount.isEmpty())) { + String apiRelativePath = (String)params.get(API_RELATIVE_PATH); + if (Strings.isNullOrEmpty(apiRelativePath) || !apiRelativePath.contains(apiVersion)) { + throw new ConfigurationException("Unable to find API version in relative path"); + } + + String retryCount = (String)params.get(RETRY_COUNT); + if (!Strings.isNullOrEmpty(retryCount)) { try { _numRetries = Integer.parseInt(retryCount); } catch (NumberFormatException ex) { @@ -156,8 +173,8 @@ public class NuageVspResource extends ManagerBase implements ServerResource { throw new ConfigurationException("Unable to find number of retries"); } - String retryInterval = (String)params.get("retryinterval"); - if ((retryInterval != null) && (!retryInterval.isEmpty())) { + String retryInterval = (String)params.get(RETRY_INTERVAL); + if (!Strings.isNullOrEmpty(retryInterval)) { try { _retryInterval = Integer.parseInt(retryInterval); } catch (NumberFormatException ex) { @@ -170,57 +187,45 @@ public class NuageVspResource extends ManagerBase implements ServerResource { throw new ConfigurationException("Unable to find retry interval"); } - _relativePath = new StringBuffer().append("https://").append(hostname).append(":").append(port).append(apiRelativePath).toString(); + _relativePath = new StringBuffer().append("https://").append(_hostName).append(":").append(port).append(apiRelativePath).toString(); String cmsUserPass = org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.decodeBase64(cmsUserPassBase64)); _cmsUserInfo = new String[] {CMS_USER_ENTEPRISE_NAME, cmsUser, cmsUserPass}; - try { - loadNuageClient(); - } catch (Exception e) { - throw new CloudRuntimeException("Failed to login to Nuage VSD on " + name + " as user " + cmsUser, e); - } + _nuageVspCmsId = (String)params.get(NUAGE_VSP_CMS_ID); + + loadNuageClient(); try { login(); - } catch (Exception e) { - s_logger.error("Failed to login to Nuage VSD on " + name + " as user " + cmsUser + " Exception " + e.getMessage()); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failed to login to Nuage VSD on " + name + " as user " + cmsUser, e); throw new CloudRuntimeException("Failed to login to Nuage VSD on " + name + " as user " + cmsUser, e); } return true; } - protected void login() throws Exception { + protected void login() throws ConfigurationException, ExecutionException { isNuageVspApiLoaded(); _nuageVspApiClient.login(); } - protected void loadNuageClient() throws Exception { + protected void loadNuageClient() { try { - ClassLoader loader = NuageVspPluginClientLoader.getClassLoader(NUAGE_PLUGIN_CLIENT_JAR_FILE); - - Class nuageVspApiClientClass = Class.forName(NUAGE_VSP_API_CLIENT_IMPL, true, loader); - Class nuageVspSyncClientClass = Class.forName(NUAGE_VSP_SYNC_CLIENT_IMPL, true, loader); - Class nuageVspGuruClientClass = Class.forName(NUAGE_VSP_GURU_CLIENT_IMPL, true, loader); - Class nuageVspElementClientClass = Class.forName(NUAGE_VSP_ELEMENT_CLIENT_IMPL, true, loader); - - //Instantiate the instances - _nuageVspApiClient = (NuageVspApiClient)nuageVspApiClientClass.newInstance(); - _nuageVspApiClient.setNuageVspHost(_relativePath, _cmsUserInfo, _numRetries, _retryInterval); - _nuageVspSyncClient = (NuageVspSyncClient)nuageVspSyncClientClass.newInstance(); - _nuageVspSyncClient.setNuageVspApiClient(_nuageVspApiClient); - _nuageVspGuruClient = (NuageVspGuruClient)nuageVspGuruClientClass.newInstance(); - _nuageVspGuruClient.setNuageVspApiClient(_nuageVspApiClient); - _nuageVspElementClient = (NuageVspElementClient)nuageVspElementClientClass.newInstance(); - _nuageVspElementClient.setNuageVspApiClient(_nuageVspApiClient); + NuageVspPluginClientLoader clientLoader = NuageVspPluginClientLoader.getClientLoader(_relativePath, _cmsUserInfo, _numRetries, _retryInterval, _nuageVspCmsId); + _nuageVspApiClient = clientLoader.getNuageVspApiClient(); + _nuageVspSyncClient = clientLoader.getNuageVspSyncClient(); + _nuageVspGuruClient = clientLoader.getNuageVspGuruClient(); + _nuageVspElementClient = clientLoader.getNuageVspElementClient(); + _nuageVspManagerClient = clientLoader.getNuageVspManagerClient(); _isNuageVspClientLoaded = true; - } catch (Exception e) { + } catch (ConfigurationException e) { _isNuageVspClientLoaded = false; String errorMessage = "Nuage Vsp Plugin client is not yet installed. Please install NuageVsp plugin client to use NuageVsp plugin in Cloudstack. "; - s_logger.warn(errorMessage + e.getMessage()); - throw new Exception(errorMessage); + s_logger.error(errorMessage, e); + throw new CloudRuntimeException(errorMessage, e); } } @@ -260,17 +265,26 @@ public class NuageVspResource extends ManagerBase implements ServerResource { @Override public PingCommand getCurrentStatus(long id) { - if ((_relativePath == null) || (_relativePath.isEmpty()) || (_cmsUserInfo == null) || (_cmsUserInfo.length == 0)) { - s_logger.error("Failed to ping to Nuage VSD"); + if (_relativePath == null || _relativePath.isEmpty()) { + s_logger.error("Refusing to ping Nuage VSD because the resource configuration is missing the relative path information"); + _shouldAudit = true; + return null; + } + if (_cmsUserInfo == null || _cmsUserInfo.length < 2) { + s_logger.error("Refusing to ping Nuage VSD because the resource configuration is missing the CMS user information"); + _shouldAudit = true; return null; } try { login(); - } catch (Exception e) { - s_logger.error("Failed to ping to Nuage VSD on " + _name + " as user " + _cmsUserInfo[1] + " Exception " + e.getMessage()); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failed to ping to Nuage VSD on " + _name + " as user " + _cmsUserInfo[1], e); + _shouldAudit = true; return null; } - return new PingCommand(Host.Type.L2Networking, id); + PingNuageVspCommand pingNuageVspCommand = new PingNuageVspCommand(Host.Type.L2Networking, id, _shouldAudit); + _shouldAudit = false; + return pingNuageVspCommand; } @Override @@ -287,15 +301,15 @@ public class NuageVspResource extends ManagerBase implements ServerResource { return executeRequest((ImplementNetworkVspCommand)cmd); } else if (cmd instanceof ReserveVmInterfaceVspCommand) { return executeRequest((ReserveVmInterfaceVspCommand)cmd); - } else if (cmd instanceof ReleaseVmVspCommand) { - return executeRequest((ReleaseVmVspCommand)cmd); } else if (cmd instanceof DeallocateVmVspCommand) { return executeRequest((DeallocateVmVspCommand)cmd); } else if (cmd instanceof TrashNetworkVspCommand) { return executeRequest((TrashNetworkVspCommand)cmd); } //Element commands - else if (cmd instanceof ApplyAclRuleVspCommand) { + else if (cmd instanceof ImplementVspCommand) { + return executeRequest((ImplementVspCommand)cmd); + } else if (cmd instanceof ApplyAclRuleVspCommand) { return executeRequest((ApplyAclRuleVspCommand)cmd); } else if (cmd instanceof ApplyStaticNatVspCommand) { return executeRequest((ApplyStaticNatVspCommand)cmd); @@ -305,8 +319,20 @@ public class NuageVspResource extends ManagerBase implements ServerResource { //Sync Commands else if (cmd instanceof SyncVspCommand) { return executeRequest((SyncVspCommand)cmd); + } else if (cmd instanceof SyncNuageVspCmsIdCommand) { + return executeRequest((SyncNuageVspCmsIdCommand)cmd); + } else if (cmd instanceof SyncDomainCommand) { + return executeRequest((SyncDomainCommand)cmd); + } + //Other commands + else if (cmd instanceof GetClientDefaultsCommand) { + return executeRequest((GetClientDefaultsCommand)cmd); + } else if (cmd instanceof SupportedApiVersionCommand) { + return executeRequest((SupportedApiVersionCommand)cmd); + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received unsupported command " + cmd.toString()); } - s_logger.debug("Received unsupported command " + cmd.toString()); return Answer.createUnsupportedCommandAnswer(cmd); } @@ -340,7 +366,8 @@ public class NuageVspResource extends ManagerBase implements ServerResource { return new VspResourceAnswer(cmd, resourceInfo, "Executed Issue Resource command"); } return new VspResourceAnswer(cmd, false, cmd.getRequestType() + " is not yet supported"); - } catch (Exception e) { + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); return new VspResourceAnswer(cmd, e); } } @@ -349,85 +376,98 @@ public class NuageVspResource extends ManagerBase implements ServerResource { try { isNuageVspGuruLoaded(); _nuageVspGuruClient.implement(cmd.getNetworkDomainName(), cmd.getNetworkDomainPath(), cmd.getNetworkDomainUuid(), cmd.getNetworkAccountName(), - cmd.getNetworkAccountUuid(), cmd.getNetworkName(), cmd.getNetworkCidr(), cmd.getNetworkGateway(), cmd.getNetworkUuid(), cmd.isL3Network(), cmd.getVpcName(), - cmd.getVpcUuid(), cmd.isDefaultEgressPolicy(), cmd.getIpAddressRange()); - return new ImplementNetworkVspAnswer(cmd, true, "Created Nuage VSP network mapping to " + cmd.getNetworkName()); - } catch (Exception e) { - return new ImplementNetworkVspAnswer(cmd, e); + cmd.getNetworkAccountUuid(), cmd.getNetworkName(), cmd.getNetworkCidr(), cmd.getNetworkGateway(), cmd.getNetworkAclId(), cmd.getDnsServers(), + cmd.getGatewaySystemIds(), cmd.isL3Network(), cmd.isVpc(), cmd.isSharedNetwork(), cmd.getNetworkUuid(), cmd.getVpcName(), cmd.getVpcUuid(), + cmd.isDefaultEgressPolicy(), cmd.getIpAddressRange(), cmd.getDomainTemplateName()); + return new Answer(cmd, true, "Created network mapping to " + cmd.getNetworkName() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } private Answer executeRequest(ReserveVmInterfaceVspCommand cmd) { try { isNuageVspGuruLoaded(); - List> vmInterfaceInfo = _nuageVspGuruClient.reserve(cmd.getNicUuid(), cmd.getNicMacAddress(), cmd.getNetworkUuid(), cmd.isL3Network(), - cmd.getVpcUuid(), cmd.getNetworkDomainUuid(), cmd.getNetworksAccountUuid(), cmd.isDomainRouter(), cmd._getDomainRouterIp(), cmd._getVmInstanceName(), - cmd._getVmUuid()); - return new ReserveVmInterfaceVspAnswer(cmd, vmInterfaceInfo, "Created NIC in VSP that maps to nicUuid" + cmd.getNicUuid()); - } catch (Exception e) { - return new ReserveVmInterfaceVspAnswer(cmd, e); - } - } - - private Answer executeRequest(ReleaseVmVspCommand cmd) { - try { - isNuageVspGuruLoaded(); - _nuageVspGuruClient.release(cmd.getNetworkUuid(), cmd.getVmUuid(), cmd.getVmInstanceName()); - return new ReleaseVmVspAnswer(cmd, true, "VM has been deleted from VSP."); - } catch (Exception e) { - return new ReleaseVmVspAnswer(cmd, e); + _nuageVspGuruClient.reserve(cmd.getNicUuid(), cmd.getNicMacAddress(), cmd.getNetworkUuid(), cmd.isL3Network(), + cmd.isSharedNetwork(), cmd.getVpcUuid(), cmd.getNetworkDomainUuid(), cmd.getNetworksAccountUuid(), cmd.isDomainRouter(), cmd.getDomainRouterIp(), + cmd.getVmInstanceName(), cmd.getVmUuid(), cmd.useStaticIp(), cmd.getStaticIp(), cmd.getStaticNatIpUuid(), cmd.getStaticNatIpAddress(), cmd.isStaticNatIpAllocated(), + cmd.isOneToOneNat(), cmd.getStaticNatVlanUuid(), cmd.getStaticNatVlanGateway(), cmd.getStaticNatVlanNetmask()); + return new Answer(cmd, true, "Created NIC that maps to nicUuid" + cmd.getNicUuid() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } private Answer executeRequest(DeallocateVmVspCommand cmd) { try { isNuageVspGuruLoaded(); - _nuageVspGuruClient.deallocate(cmd.getNetworkUuid(), cmd.getNicFrmDdUuid(), cmd.getNicMacAddress(), cmd.getNicIp4Address(), cmd.isL3Network(), cmd.getVpcUuid(), - cmd.getNetworksDomainUuid(), cmd.getVmInstanceName(), cmd.getVmUuid()); - return new DeallocateVmVspAnswer(cmd, true, "Deallocated VM from Nuage VSP."); - } catch (Exception e) { - return new DeallocateVmVspAnswer(cmd, e); + _nuageVspGuruClient.deallocate(cmd.getNetworkUuid(), cmd.getNicFromDdUuid(), cmd.getNicMacAddress(), cmd.getNicIp4Address(), cmd.isL3Network(), cmd.isSharedNetwork(), + cmd.getVpcUuid(), cmd.getNetworksDomainUuid(), cmd.getVmInstanceName(), cmd.getVmUuid(), cmd.isExpungingState()); + return new Answer(cmd, true, "Deallocated VM " + cmd.getVmInstanceName() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } private Answer executeRequest(TrashNetworkVspCommand cmd) { try { isNuageVspGuruLoaded(); - _nuageVspGuruClient.trash(cmd.getDomainUuid(), cmd.getNetworkUuid(), cmd.isL3Network(), cmd.getVpcUuid()); - return new TrashNetworkVspAnswer(cmd, true, "Deleted Nuage VSP network mapping to " + cmd.getNetworkUuid()); - } catch (Exception e) { - return new TrashNetworkVspAnswer(cmd, e); + _nuageVspGuruClient.trash(cmd.getDomainUuid(), cmd.getNetworkUuid(), cmd.isL3Network(), cmd.isSharedNetwork(), cmd.getVpcUuid(), cmd.getDomainTemplateName()); + return new Answer(cmd, true, "Deleted network mapping to " + cmd.getNetworkUuid() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } private Answer executeRequest(ApplyStaticNatVspCommand cmd) { try { isNuageVspElementLoaded(); - _nuageVspElementClient.applyStaticNats(cmd.getNetworkDomainUuid(), cmd.getVpcOrSubnetUuid(), cmd.isL3Network(), cmd.getStaticNatDetails()); - return new ApplyStaticNatVspAnswer(cmd, true, "Applied Static NAT to VSP network mapping to " + cmd.getVpcOrSubnetUuid()); - } catch (Exception e) { - return new ApplyStaticNatVspAnswer(cmd, e); + _nuageVspElementClient.applyStaticNats(cmd.getNetworkDomainUuid(), cmd.getNetworkUuid(), cmd.getVpcOrSubnetUuid(), cmd.isL3Network(), + cmd.isVpc(), cmd.getStaticNatDetails()); + return new Answer(cmd, true, "Applied Static NAT to network mapping " + cmd.getVpcOrSubnetUuid() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); + } + } + + private Answer executeRequest(ImplementVspCommand cmd) { + try { + isNuageVspElementLoaded(); + boolean success = _nuageVspElementClient.implement(cmd.getNetworkId(), cmd.getNetworkDomainUuid(), cmd.getNetworkUuid(), cmd.getNetworkName(), cmd.getVpcOrSubnetUuid(), cmd.isL2Network(), + cmd.isL3Network(), cmd.isVpc(), cmd.isShared(), cmd.getDomainTemplateName(), cmd.isFirewallServiceSupported(), cmd.getDnsServers(), cmd.getIngressFirewallRules(), + cmd.getEgressFirewallRules(), cmd.getAcsFipUuid(), cmd.isEgressDefaultPolicy()); + return new Answer(cmd, success, "Implemented network " + cmd.getNetworkUuid() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } private Answer executeRequest(ApplyAclRuleVspCommand cmd) { try { isNuageVspElementLoaded(); - _nuageVspElementClient.applyAclRules(cmd.getNetworkUuid(), cmd.getNetworkDomainUuid(), cmd.getVpcOrSubnetUuid(), cmd.isL3Network(), cmd.getAclRules(), cmd.isVpc(), - cmd.getNetworkId()); - return new ApplyAclRuleVspAnswer(cmd, true, "Applied ACL Rule to VSP network mapping to " + cmd.getVpcOrSubnetUuid()); - } catch (Exception e) { - return new ApplyAclRuleVspAnswer(cmd, e); + _nuageVspElementClient.applyAclRules(cmd.isNetworkAcl(), cmd.getNetworkUuid(), cmd.getNetworkDomainUuid(), cmd.getVpcOrSubnetUuid(), cmd.getNetworkName(), + cmd.isL2Network(), cmd.getAclRules(), cmd.getNetworkId(), cmd.isEgressDefaultPolicy(), cmd.getAcsIngressAcl(), cmd.isNetworkReset(), cmd.getDomainTemplateName()); + return new Answer(cmd, true, "Applied ACL Rule to network mapping " + cmd.getVpcOrSubnetUuid() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } private Answer executeRequest(ShutDownVpcVspCommand cmd) { try { isNuageVspElementLoaded(); - _nuageVspElementClient.shutDownVpc(cmd.getDomainUuid(), cmd.getVpcUuid()); - return new ShutDownVpcVspAnswer(cmd, true, "Shutdown VPC " + cmd.getVpcUuid()); - } catch (Exception e) { - return new ShutDownVpcVspAnswer(cmd, e); + _nuageVspElementClient.shutdownVpc(cmd.getDomainUuid(), cmd.getVpcUuid(), cmd.getDomainTemplateName()); + return new Answer(cmd, true, "Shutdown VPC " + cmd.getVpcUuid() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } @@ -435,33 +475,248 @@ public class NuageVspResource extends ManagerBase implements ServerResource { try { isNuageVspSyncLoaded(); _nuageVspSyncClient.syncWithNuageVsp(cmd.getNuageVspEntity()); - return new SyncVspAnswer(cmd, true, "Synced " + cmd.getNuageVspEntity() + " in VSP"); - } catch (Exception e) { - return new SyncVspAnswer(cmd, e); + return new Answer(cmd, true, "Synced " + cmd.getNuageVspEntity() + " on Nuage VSD " + _hostName); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); } } - protected void isNuageVspApiLoaded() throws Exception { + private Answer executeRequest(SyncNuageVspCmsIdCommand cmd) { + try { + isNuageVspManagerLoaded(); + if (cmd.getSyncType() == SyncType.AUDIT || cmd.getSyncType() == SyncType.AUDIT_ONLY) { + Pair answer = _nuageVspManagerClient.auditNuageVspCmsId(cmd.getNuageVspCmsId(), cmd.getSyncType() == SyncType.AUDIT_ONLY); + return new SyncNuageVspCmsIdAnswer(answer.getLeft(), answer.getRight(), cmd.getSyncType()); + } else if (cmd.getSyncType() == SyncType.REGISTER) { + String registeredNuageVspCmsId = _nuageVspManagerClient.registerNuageVspCmsId(); + return new SyncNuageVspCmsIdAnswer(StringUtils.isNotBlank(registeredNuageVspCmsId), registeredNuageVspCmsId, cmd.getSyncType()); + } else { + boolean success = _nuageVspManagerClient.unregisterNuageVspCmsId(cmd.getNuageVspCmsId()); + return new SyncNuageVspCmsIdAnswer(success, cmd.getNuageVspCmsId(), cmd.getSyncType()); + } + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new SyncNuageVspCmsIdAnswer(false, null, cmd.getSyncType()); + } + } + + private Answer executeRequest(SyncDomainCommand cmd) { + try { + isNuageVspManagerLoaded(); + boolean success = _nuageVspManagerClient.syncDomainWithNuageVsp(cmd.getDomainUuid(), cmd.getDomainName(), cmd.getDomainPath(), cmd.isToAdd(), cmd.isToRemove()); + return new SyncDomainAnswer(success); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new SyncDomainAnswer(false); + } + } + + private Answer executeRequest(GetClientDefaultsCommand cmd) { + try { + isNuageVspManagerLoaded(); + Map clientDefaults = _nuageVspManagerClient.getClientDefaults(); + return new GetClientDefaultsAnswer(cmd, clientDefaults); + } catch (ExecutionException | ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new GetClientDefaultsAnswer(cmd, e); + } + } + + private Answer executeRequest(SupportedApiVersionCommand cmd) { + try { + isNuageVspManagerLoaded(); + boolean supported = _nuageVspManagerClient.isSupportedApiVersion(cmd.getApiVersion()); + return new Answer(cmd, supported, "Check if API version " + cmd.getApiVersion() + " is supported"); + } catch (ConfigurationException e) { + s_logger.error("Failure during " + cmd + " on Nuage VSD " + _hostName, e); + return new Answer(cmd, e); + } + } + + protected void isNuageVspApiLoaded() throws ConfigurationException { if (!_isNuageVspClientLoaded || _nuageVspApiClient == null) { - throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); + throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); } } - protected void isNuageVspGuruLoaded() throws Exception { + protected void isNuageVspGuruLoaded() throws ConfigurationException { if (!_isNuageVspClientLoaded || _nuageVspGuruClient == null) { - throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); + throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); } } - protected void isNuageVspElementLoaded() throws Exception { + protected void isNuageVspElementLoaded() throws ConfigurationException { if (!_isNuageVspClientLoaded || _nuageVspElementClient == null) { - throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); + throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); } } - protected void isNuageVspSyncLoaded() throws Exception { + protected void isNuageVspSyncLoaded() throws ConfigurationException { if (!_isNuageVspClientLoaded || _nuageVspSyncClient == null) { - throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); + throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); + } + } + + protected void isNuageVspManagerLoaded() throws ConfigurationException { + if (!_isNuageVspClientLoaded || _nuageVspManagerClient == null) { + throw new ConfigurationException(NUAGE_VSP_PLUGIN_ERROR_MESSAGE); + } + } + + public static class Configuration { + private String _name; + private String _guid; + private String _zoneId; + private String _hostName; + private String _cmsUser; + private String _cmsUserPassword; + private String _port; + private String _apiVersion; + private String _apiRelativePath; + private String _retryCount; + private String _retryInterval; + private String _nuageVspCmsId; + + public String name() { + return this._name; + } + + public Configuration name(String name) { + this._name = name; + return this; + } + + public String guid() { + return this._guid; + } + + public Configuration guid(String guid) { + this._guid = guid; + return this; + } + + public String zoneId() { + return this._zoneId; + } + + public Configuration zoneId(String zoneId) { + this._zoneId = zoneId; + return this; + } + + public String hostName() { + return this._hostName; + } + + public Configuration hostName(String hostName) { + this._hostName = hostName; + return this; + } + + public String cmsUser() { + return this._cmsUser; + } + + public Configuration cmsUser(String cmsUser) { + this._cmsUser = cmsUser; + return this; + } + + public String cmsUserPassword() { + return this._cmsUserPassword; + } + + public Configuration cmsUserPassword(String cmsUserPassword) { + this._cmsUserPassword = cmsUserPassword; + return this; + } + + public String port() { + return this._port; + } + + public Configuration port(String port) { + this._port = port; + return this; + } + + public String apiVersion() { + return this._apiVersion; + } + + public Configuration apiVersion(String apiVersion) { + this._apiVersion = apiVersion; + return this; + } + + public String apiRelativePath() { + return this._apiRelativePath; + } + + public Configuration apiRelativePath(String apiRelativePath) { + this._apiRelativePath = apiRelativePath; + return this; + } + + public String retryCount() { + return this._retryCount; + } + + public Configuration retryCount(String retryCount) { + this._retryCount = retryCount; + return this; + } + + public String retryInterval() { + return this._retryInterval; + } + + public Configuration retryInterval(String retryInterval) { + this._retryInterval = retryInterval; + return this; + } + + public String nuageVspCmsId() { + return this._nuageVspCmsId; + } + + public Configuration nuageVspCmsId(String nuageVspCmsId) { + this._nuageVspCmsId = nuageVspCmsId; + return this; + } + + public Map build() { + return new HashMap() {{ + if (_name != null) put(NAME, _name); + if (_guid != null) put(GUID, _guid); + if (_zoneId != null) put(ZONE_ID, _zoneId); + if (_hostName != null) put(HOST_NAME, _hostName); + if (_cmsUser != null) put(CMS_USER, _cmsUser); + if (_cmsUserPassword != null) put(CMS_USER_PASSWORD, _cmsUserPassword); + if (_port != null) put(PORT, _port); + if (_apiVersion != null) put(API_VERSION, _apiVersion); + if (_apiRelativePath != null) put(API_RELATIVE_PATH, _apiRelativePath); + if (_retryCount != null) put(RETRY_COUNT, _retryCount); + if (_retryInterval != null) put(RETRY_INTERVAL, _retryInterval); + if (_nuageVspCmsId != null) put(NUAGE_VSP_CMS_ID, _nuageVspCmsId); + }}; + } + + public static Configuration fromConfiguration(Map configuration) { + return new Configuration() + .name(configuration.get(NAME)) + .guid(configuration.get(GUID)) + .zoneId(configuration.get(ZONE_ID)) + .hostName(configuration.get(HOST_NAME)) + .cmsUser(configuration.get(CMS_USER)) + .cmsUserPassword(configuration.get(CMS_USER_PASSWORD)) + .port(configuration.get(PORT)) + .apiVersion(configuration.get(API_VERSION)) + .apiRelativePath(configuration.get(API_RELATIVE_PATH)) + .retryCount(configuration.get(RETRY_COUNT)) + .retryInterval(configuration.get(RETRY_INTERVAL)) + .nuageVspCmsId(configuration.get(NUAGE_VSP_CMS_ID)); } } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java index f3d19c16355..9180c179092 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java @@ -19,20 +19,18 @@ package com.cloud.network.sync; -import java.util.List; - -import javax.inject.Inject; - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - import com.cloud.agent.AgentManager; -import com.cloud.agent.api.sync.SyncVspAnswer; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.sync.SyncVspCommand; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.dao.NuageVspDao; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; +import java.util.List; @Component public class NuageVspSyncImpl implements NuageVspSync { @@ -52,20 +50,15 @@ public class NuageVspSyncImpl implements NuageVspSync { //entities List nuageVspDevices = _nuageVspDao.listAll(); for (NuageVspDeviceVO nuageVspDevice : nuageVspDevices) { - - try { - HostVO nuageVspHost = _hostDao.findById(nuageVspDevice.getHostId()); - _hostDao.loadDetails(nuageVspHost); - SyncVspCommand cmd = new SyncVspCommand(nuageVspEntity); - SyncVspAnswer answer = (SyncVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd); - if (answer == null || !answer.getResult()) { - s_logger.error("SyncNuageVspCommand for Nuage VSP Host " + nuageVspHost.getUuid() + " failed"); - if ((null != answer) && (null != answer.getDetails())) { - s_logger.error(answer.getDetails()); - } + HostVO nuageVspHost = _hostDao.findById(nuageVspDevice.getHostId()); + _hostDao.loadDetails(nuageVspHost); + SyncVspCommand cmd = new SyncVspCommand(nuageVspEntity); + Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd); + if (answer == null || !answer.getResult()) { + s_logger.error("SyncNuageVspCommand for Nuage VSP Host " + nuageVspHost.getUuid() + " failed"); + if ((null != answer) && (null != answer.getDetails())) { + s_logger.error(answer.getDetails()); } - } catch (Exception e) { - s_logger.warn("Failed to clean up " + nuageVspEntity + " in Vsp " + e.getMessage()); } } } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java new file mode 100644 index 00000000000..143a74113b4 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspUtil.java @@ -0,0 +1,40 @@ +// +// 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.util; + +import com.cloud.network.Network; +import com.cloud.network.manager.NuageVspManager; +import com.cloud.offering.NetworkOffering; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; + +public class NuageVspUtil { + + public static String getPreConfiguredDomainTemplateName(ConfigurationDao configDao, Network network, NetworkOffering networkOffering) { + String configKey; + if (network.getVpcId() != null) { + configKey = NuageVspManager.NuageVspVpcDomainTemplateName.key(); + } else if (networkOffering.getGuestType() == Network.GuestType.Shared) { + configKey = NuageVspManager.NuageVspSharedNetworkDomainTemplateName.key(); + } else { + configKey = NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName.key(); + } + return configDao.getValue(configKey); + } +} diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java index 76b98234a0a..57935b9f057 100644 --- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java +++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java @@ -19,28 +19,101 @@ package net.nuage.vsp.acs; +import net.nuage.vsp.acs.client.NuageVspApiClient; +import net.nuage.vsp.acs.client.NuageVspElementClient; +import net.nuage.vsp.acs.client.NuageVspGuruClient; +import net.nuage.vsp.acs.client.NuageVspManagerClient; +import net.nuage.vsp.acs.client.NuageVspSyncClient; +import org.apache.log4j.Logger; + +import javax.naming.ConfigurationException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class NuageVspPluginClientLoader { - private static NuageVspPluginClientLoader nuageVspPluginClientClassloader; - private ClassLoader loader = null; + private ClassLoader _loader = null; + private static final Logger s_logger = Logger.getLogger(NuageVspPluginClientLoader.class); + + private NuageVspApiClient _nuageVspApiClient; + private NuageVspElementClient _nuageVspElementClient; + private NuageVspGuruClient _nuageVspGuruClient; + private NuageVspManagerClient _nuageVspManagerClient; + private NuageVspSyncClient _nuageVspSyncClient; + + private static final String NUAGE_PLUGIN_CLIENT_JAR_FILE = "/usr/share/nuagevsp/lib/nuage-vsp-acs-client.jar"; + private static final String NUAGE_VSP_API_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspApiClientImpl"; + private static final String NUAGE_VSP_SYNC_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspSyncClientImpl"; + private static final String NUAGE_VSP_ELEMENT_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspElementClientImpl"; + private static final String NUAGE_VSP_GURU_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspGuruClientImpl"; + private static final String NUAGE_VSP_MANAGER_CLIENT_IMPL = "net.nuage.vsp.acs.client.impl.NuageVspManagerClientImpl"; private NuageVspPluginClientLoader(String nuagePluginClientJarLocation) { try { - loader = URLClassLoader.newInstance(new URL[] {new URL("jar:file:" + nuagePluginClientJarLocation + "!/")}, + _loader = URLClassLoader.newInstance(new URL[] {new URL("jar:file:" + nuagePluginClientJarLocation + "!/")}, getClass().getClassLoader()); } catch (MalformedURLException e) { - e.printStackTrace(); + throw new IllegalArgumentException(e); } } - public static ClassLoader getClassLoader(String nuagePluginClientJarLocation) { - if (nuageVspPluginClientClassloader == null) { - nuageVspPluginClientClassloader = new NuageVspPluginClientLoader(nuagePluginClientJarLocation); + public static NuageVspPluginClientLoader getClientLoader(String relativePath, String[] cmsUserInfo, int numRetries, int retryInterval, + String nuageVspCmsId) throws ConfigurationException { + NuageVspPluginClientLoader nuageVspPluginClientClassloader = new NuageVspPluginClientLoader(NUAGE_PLUGIN_CLIENT_JAR_FILE); + nuageVspPluginClientClassloader.loadClasses(relativePath, cmsUserInfo, numRetries, retryInterval, nuageVspCmsId); + return nuageVspPluginClientClassloader; + } + + private void loadClasses(String relativePath, String[] cmsUserInfo, int numRetries, int retryInterval, String nuageVspCmsId) throws ConfigurationException { + try { + Class nuageVspApiClientClass = Class.forName(NUAGE_VSP_API_CLIENT_IMPL, true, _loader); + Class nuageVspSyncClientClass = Class.forName(NUAGE_VSP_SYNC_CLIENT_IMPL, true, _loader); + Class nuageVspGuruClientClass = Class.forName(NUAGE_VSP_GURU_CLIENT_IMPL, true, _loader); + Class nuageVspElementClientClass = Class.forName(NUAGE_VSP_ELEMENT_CLIENT_IMPL, true, _loader); + Class nuageVspManagerClientClass = Class.forName(NUAGE_VSP_MANAGER_CLIENT_IMPL, true, _loader); + + //Instantiate the instances + _nuageVspApiClient = (NuageVspApiClient)nuageVspApiClientClass.newInstance(); + _nuageVspApiClient.setNuageVspHost(relativePath, cmsUserInfo, numRetries, retryInterval, nuageVspCmsId); + _nuageVspSyncClient = (NuageVspSyncClient)nuageVspSyncClientClass.newInstance(); + _nuageVspSyncClient.setNuageVspApiClient(_nuageVspApiClient); + _nuageVspGuruClient = (NuageVspGuruClient)nuageVspGuruClientClass.newInstance(); + _nuageVspGuruClient.setNuageVspApiClient(_nuageVspApiClient); + _nuageVspElementClient = (NuageVspElementClient)nuageVspElementClientClass.newInstance(); + _nuageVspElementClient.setNuageVspApiClient(_nuageVspApiClient); + _nuageVspManagerClient = (NuageVspManagerClient)nuageVspManagerClientClass.newInstance(); + _nuageVspManagerClient.setNuageVspApiClient(_nuageVspApiClient); + } catch (ClassNotFoundException cnfe) { + s_logger.error("Error while loading classes of Nuage VSP client", cnfe); + throw new ConfigurationException("Error while loading classes of Nuage VSP client"); + } catch (InstantiationException ie) { + s_logger.error("Error while initializing classes of Nuage VSP client", ie); + throw new ConfigurationException("Error while initializing classes of Nuage VSP client"); + } catch (IllegalAccessException iae) { + s_logger.error("Error while accessing classes of Nuage VSP client", iae); + throw new ConfigurationException("Error while accessing classes of Nuage VSP client"); } - return nuageVspPluginClientClassloader.loader; + + } + + public NuageVspApiClient getNuageVspApiClient() { + return _nuageVspApiClient; + } + + public NuageVspElementClient getNuageVspElementClient() { + return _nuageVspElementClient; + } + + public NuageVspGuruClient getNuageVspGuruClient() { + return _nuageVspGuruClient; + } + + public NuageVspManagerClient getNuageVspManagerClient() { + return _nuageVspManagerClient; + } + + public NuageVspSyncClient getNuageVspSyncClient() { + return _nuageVspSyncClient; } } diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java index d584c6f5369..d80daf9eef3 100644 --- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java +++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java @@ -19,12 +19,14 @@ package net.nuage.vsp.acs.client; +import java.util.concurrent.ExecutionException; + public interface NuageVspApiClient { - public void login() throws Exception; + void login() throws ExecutionException; - public void setNuageVspHost(String restRelativePath, String[] cmsUserInfo, int noofRetry, int retryInterval); + void setNuageVspHost(String restRelativePath, String[] cmsUserInfo, int noofRetry, int retryInterval, String nuageVspCmsId); - public String executeRestApi(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid, - String proxyUserDomainuuid) throws Exception; + String executeRestApi(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid, + String proxyUserDomainuuid) throws ExecutionException; } diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java index 27c613b3c11..acd4256a500 100644 --- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java +++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java @@ -21,16 +21,22 @@ package net.nuage.vsp.acs.client; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; public interface NuageVspElementClient { - public void applyStaticNats(String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List> staticNatDetails) throws Exception; + boolean implement(long networkId, String networkDomainUuid, String networkUuid, String networkName, String vpcOrSubnetUuid, boolean isL2Network, boolean isL3Network, + boolean isVpc, boolean isShared, String domainTemplateName, boolean isFirewallServiceSupported, List dnsServers, List> ingressFirewallRules, + List> egressFirewallRules, List acsFipUuid, boolean egressDefaultPolicy) throws ExecutionException; - public void applyAclRules(String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List> aclRules, boolean isVpc, long networkId) - throws Exception; + void applyStaticNats(String networkDomainUuid, String networkUuid, String vpcOrSubnetUuid, boolean isL3Network, boolean isVpc, + List> staticNatDetails) throws ExecutionException; - public void shutDownVpc(String domainUuid, String vpcUuid) throws Exception; + void applyAclRules(boolean isNetworkAcl, String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, String networkName, boolean isL2Network, + List> rules, long networkId, boolean egressDefaultPolicy, Boolean isAcsIngressAcl, boolean networkReset, String domainTemplateName) throws ExecutionException; - public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); + void shutdownVpc(String domainUuid, String vpcUuid, String domainTemplateName) throws ExecutionException; + + void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); } diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java index 3c7f33d878e..2b3a63a2634 100644 --- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java +++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java @@ -21,24 +21,23 @@ package net.nuage.vsp.acs.client; import java.util.Collection; import java.util.List; -import java.util.Map; +import java.util.concurrent.ExecutionException; public interface NuageVspGuruClient { - public void implement(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid, String networkName, - String networkCidr, String networkGateway, String networkUuid, boolean isL3Network, String vpcName, String vpcUuid, boolean defaultEgressPolicy, - Collection ipAddressRange) throws Exception; + void implement(String networkDomainName, String networkDomainPath, String networkDomainUuid, String networkAccountName, String networkAccountUuid, String networkName, + String networkCidr, String networkGateway, Long networkAclId, List dnsServers, List gatewaySystemIds, boolean isL3Network, boolean isVpc, boolean isSharedNetwork, + String networkUuid, String vpcName, String vpcUuid, boolean defaultEgressPolicy, Collection ipAddressRange, String domainTemplateName) throws ExecutionException; - public List> reserve(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, String vpcUuid, String networkDomainUuid, - String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid) throws Exception; + void reserve(String nicUuid, String nicMacAddress, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String networkDomainUuid, + String networksAccountUuid, boolean isDomainRouter, String domainRouterIp, String vmInstanceName, String vmUuid, boolean useStaticIp, String staticIp, String staticNatIpUuid, + String staticNatIpAddress, boolean isStaticNatIpAllocated, boolean isOneToOneNat, String staticNatVlanUuid, String staticNatVlanGateway, String staticNatVlanNetmask) throws ExecutionException; - public void release(String networkUuid, String vmUuid, String vmInstanceName) throws Exception; + void deallocate(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, boolean isSharedNetwork, + String vpcUuid, String networksDomainUuid, String vmInstanceName, String vmUuid, boolean isExpungingState) throws ExecutionException; - public void deallocate(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, String vpcUuid, String networksDomainUuid, - String vmInstanceName, String vmUuid) throws Exception; + void trash(String domainUuid, String networkUuid, boolean isL3Network, boolean isSharedNetwork, String vpcUuid, String domainTemplateName) throws ExecutionException; - public void trash(String domainUuid, String networkUuid, boolean isL3Network, String vpcUuid) throws Exception; - - public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); + void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); } diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java similarity index 51% rename from plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java rename to plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java index 8fabbef0375..f134111bf78 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java +++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspManagerClient.java @@ -17,28 +17,26 @@ // under the License. // -package com.cloud.agent.api.guru; +package net.nuage.vsp.acs.client; + +import org.apache.commons.lang3.tuple.Pair; -import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; +public interface NuageVspManagerClient { -public class ReserveVmInterfaceVspAnswer extends Answer { + Pair auditNuageVspCmsId(String nuageVspCmsId, boolean auditOnly) throws ExecutionException; - public List> _interfaceDetails; + String registerNuageVspCmsId() throws ExecutionException; - public ReserveVmInterfaceVspAnswer(Command cmd, List> interfaceDetails, String details) { - super(cmd, true, details); - this._interfaceDetails = interfaceDetails; - } + boolean unregisterNuageVspCmsId(String nuageVspCmsId) throws ExecutionException; - public ReserveVmInterfaceVspAnswer(Command cmd, Exception e) { - super(cmd, e); - } + boolean isSupportedApiVersion(String version); - public List> getInterfaceDetails() { - return this._interfaceDetails; - } + Map getClientDefaults() throws ExecutionException; + + boolean syncDomainWithNuageVsp(String domainUuid, String domainName, String domainPath, boolean add, boolean remove) throws ExecutionException; + + void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); } diff --git a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java index b9400f15158..951ee5ad7ec 100644 --- a/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java +++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java @@ -19,9 +19,11 @@ package net.nuage.vsp.acs.client; +import java.util.concurrent.ExecutionException; + public interface NuageVspSyncClient { - public void syncWithNuageVsp(String nuageVspEntity) throws Exception; + void syncWithNuageVsp(String nuageVspEntity) throws ExecutionException; - public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); + void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient); } \ No newline at end of file diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java new file mode 100644 index 00000000000..817ab7a3bc4 --- /dev/null +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/agent/api/CommandsTest.java @@ -0,0 +1,151 @@ +// +// 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; + +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.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.manager.SupportedApiVersionCommand; +import com.cloud.agent.api.sync.SyncDomainCommand; +import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand; +import com.cloud.agent.api.sync.SyncVspCommand; +import com.google.common.collect.Maps; +import com.google.common.testing.EqualsTester; +import org.junit.Test; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; + +public class CommandsTest { + + @Test + public void testCommandEquals() throws IllegalAccessException, InvocationTargetException, InstantiationException { + ApplyAclRuleVspCommand applyAclRuleVspCommand = fillBuilderObject(new ApplyAclRuleVspCommand.Builder()).build(); + ApplyAclRuleVspCommand otherApplyAclRuleVspCommand = fillBuilderObject(new ApplyAclRuleVspCommand.Builder()).build(); + + ApplyStaticNatVspCommand applyStaticNatVspCommand = fillBuilderObject(new ApplyStaticNatVspCommand.Builder()).build(); + ApplyStaticNatVspCommand otherApplyStaticNatVspCommand = fillBuilderObject(new ApplyStaticNatVspCommand.Builder()).build(); + + ImplementVspCommand implementVspCommand = fillBuilderObject(new ImplementVspCommand.Builder()).build(); + ImplementVspCommand otherImplementVspCommand = fillBuilderObject(new ImplementVspCommand.Builder()).build(); + + ShutDownVpcVspCommand shutDownVpcVspCommand = fillBuilderObject(new ShutDownVpcVspCommand.Builder()).build(); + ShutDownVpcVspCommand otherShutDownVpcVspCommand = fillBuilderObject(new ShutDownVpcVspCommand.Builder()).build(); + + DeallocateVmVspCommand deallocateVmVspCommand = fillBuilderObject(new DeallocateVmVspCommand.Builder()).build(); + DeallocateVmVspCommand otherDeallocateVmVspCommand = fillBuilderObject(new DeallocateVmVspCommand.Builder()).build(); + + ImplementNetworkVspCommand implementNetworkVspCommand = fillBuilderObject(new ImplementNetworkVspCommand.Builder()).build(); + ImplementNetworkVspCommand otherImplementNetworkVspCommand = fillBuilderObject(new ImplementNetworkVspCommand.Builder()).build(); + + ReserveVmInterfaceVspCommand reserveVmInterfaceVspCommand = fillBuilderObject(new ReserveVmInterfaceVspCommand.Builder()).build(); + ReserveVmInterfaceVspCommand otherReserveVmInterfaceVspCommand = fillBuilderObject(new ReserveVmInterfaceVspCommand.Builder()).build(); + + TrashNetworkVspCommand trashNetworkVspCommand = fillBuilderObject(new TrashNetworkVspCommand.Builder()).build(); + TrashNetworkVspCommand otherTrashNetworkVspCommand = fillBuilderObject(new TrashNetworkVspCommand.Builder()).build(); + + SupportedApiVersionCommand supportedApiVersionCommand = new SupportedApiVersionCommand("3.2"); + SupportedApiVersionCommand otherSupportedApiVersionCommand = new SupportedApiVersionCommand("3.2"); + + SyncDomainCommand syncDomainCommand = fillObject(SyncDomainCommand.class); + SyncDomainCommand otherSyncDomainCommand = fillObject(SyncDomainCommand.class); + + SyncNuageVspCmsIdCommand syncNuageVspCmsIdCommand = fillObject(SyncNuageVspCmsIdCommand.class); + SyncNuageVspCmsIdCommand otherSyncNuageVspCmsIdCommand = fillObject(SyncNuageVspCmsIdCommand.class); + + SyncVspCommand syncVspCommand = fillObject(SyncVspCommand.class); + SyncVspCommand otherSyncVspCommand = fillObject(SyncVspCommand.class); + + PingNuageVspCommand pingNuageVspCommand = fillObject(PingNuageVspCommand.class); + PingNuageVspCommand otherPingNuageVspCommand = fillObject(PingNuageVspCommand.class); + + VspResourceCommand vspResourceCommand = fillObject(VspResourceCommand.class); + VspResourceCommand otherVspResourceCommand = fillObject(VspResourceCommand.class); + + new EqualsTester() + .addEqualityGroup(applyAclRuleVspCommand, otherApplyAclRuleVspCommand) + .addEqualityGroup(applyStaticNatVspCommand, otherApplyStaticNatVspCommand) + .addEqualityGroup(implementVspCommand, otherImplementVspCommand) + .addEqualityGroup(shutDownVpcVspCommand, otherShutDownVpcVspCommand) + .addEqualityGroup(deallocateVmVspCommand, otherDeallocateVmVspCommand) + .addEqualityGroup(implementNetworkVspCommand, otherImplementNetworkVspCommand) + .addEqualityGroup(reserveVmInterfaceVspCommand, otherReserveVmInterfaceVspCommand) + .addEqualityGroup(trashNetworkVspCommand, otherTrashNetworkVspCommand) + .addEqualityGroup(supportedApiVersionCommand, otherSupportedApiVersionCommand) + .addEqualityGroup(syncDomainCommand, otherSyncDomainCommand) + .addEqualityGroup(syncNuageVspCmsIdCommand, otherSyncNuageVspCmsIdCommand) + .addEqualityGroup(syncVspCommand, otherSyncVspCommand) + .addEqualityGroup(pingNuageVspCommand, otherPingNuageVspCommand) + .addEqualityGroup(vspResourceCommand, otherVspResourceCommand) + .testEquals(); + } + + private T fillBuilderObject(T obj) throws IllegalAccessException, InvocationTargetException { + Class clazz = obj.getClass(); + for (Method method : clazz.getDeclaredMethods()) { + if (method.getParameterTypes().length == 1) { + Class paramType = method.getParameterTypes()[0]; + if (isNumericType(paramType)) { + if (Long.class.isAssignableFrom(paramType)) { + method.invoke(obj, Long.valueOf(method.getName().length())); + } else { + method.invoke(obj, method.getName().length()); + } + } else if (String.class.isAssignableFrom(paramType)) { + method.invoke(obj, method.getName()); + } else if (Boolean.class.isAssignableFrom(paramType) || boolean.class.isAssignableFrom(paramType)) { + method.invoke(obj, method.getName().length() % 2 == 0); + } + } + } + return obj; + } + + private T fillObject(Class clazz) throws IllegalAccessException, InvocationTargetException, InstantiationException { + Constructor constructor = clazz.getDeclaredConstructors()[0]; + Object[] constructorArgs = new Object[constructor.getParameterTypes().length]; + for (int i = 0; i < constructor.getParameterTypes().length; i++) { + Class constructorArgType = constructor.getParameterTypes()[i]; + if (isNumericType(constructorArgType)) { + constructorArgs[i] = constructorArgType.getName().length(); + } else if (String.class.isAssignableFrom(constructorArgType)) { + constructorArgs[i] = constructorArgType.getName(); + } else if (Boolean.class.isAssignableFrom(constructorArgType) || boolean.class.isAssignableFrom(constructorArgType)) { + constructorArgs[i] = constructorArgType.getName().length() % 2 == 0; + } else if (Map.class.isAssignableFrom(constructorArgType)) { + constructorArgs[i] = Maps.newHashMap(); + } else { + constructorArgs[i] = null; + } + } + return (T) constructor.newInstance(constructorArgs); + } + + private boolean isNumericType(Class type) { + return Number.class.isAssignableFrom(type) || int.class.isAssignableFrom(type) || long.class.isAssignableFrom(type); + } +} 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 08d685f4599..bbdf764ed80 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,35 +19,10 @@ package com.cloud.network.element; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -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 javax.naming.ConfigurationException; - -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.junit.Before; -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -import com.cloud.agent.api.element.ApplyAclRuleVspAnswer; -import com.cloud.agent.api.element.ApplyStaticNatVspAnswer; import com.cloud.deploy.DeployDestination; -import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.exception.CloudException; @@ -64,11 +39,20 @@ import com.cloud.network.NetworkModel; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.NuageVspDeviceVO; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.NuageVspDao; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.manager.NuageVspManager; import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRuleVO; import com.cloud.network.rules.StaticNat; import com.cloud.network.vpc.NetworkACLItem; +import com.cloud.network.vpc.Vpc; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -76,6 +60,31 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.resource.ResourceManager; import com.cloud.user.Account; import com.cloud.vm.ReservationContext; +import com.google.common.collect.Lists; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.junit.Before; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; + +import javax.naming.ConfigurationException; +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 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.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class NuageVspElementTest { @@ -90,8 +99,13 @@ public class NuageVspElementTest { DomainDao domainDao = mock(DomainDao.class); NetworkOfferingDao ntwkOfferingDao = mock(NetworkOfferingDao.class); NetworkOfferingServiceMapDao ntwkOfferingSrvcDao = mock(NetworkOfferingServiceMapDao.class); + ConfigurationDao configDao = mock(ConfigurationDao.class); + NuageVspManager nuageVspManager = mock(NuageVspManager.class); + FirewallRulesDao firewallRulesDao = mock(FirewallRulesDao.class); + IPAddressDao ipAddressDao = mock(IPAddressDao.class); + PhysicalNetworkDao physNetDao = mock(PhysicalNetworkDao.class); - Answer genericAnswer = new Answer() { + org.mockito.stubbing.Answer genericAnswer = new org.mockito.stubbing.Answer() { public Object answer(InvocationOnMock invocation) { return null; } @@ -108,15 +122,23 @@ public class NuageVspElementTest { element._ntwkOfferingSrvcDao = ntwkOfferingSrvcDao; element._domainDao = domainDao; element._ntwkOfferingDao = ntwkOfferingDao; + element._configDao = configDao; + element._nuageVspManager = nuageVspManager; + element._firewallRulesDao = firewallRulesDao; + element._ipAddressDao = ipAddressDao; + element._physicalNetworkDao = physNetDao; // Standard responses when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true); + when(configDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate"); + when(configDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate"); + when(configDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate"); element.configure("NuageVspTestElement", Collections. emptyMap()); } @Test - public void testCcanHandle() { + public void testCanHandle() { final Network net = mock(Network.class); when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp); when(net.getId()).thenReturn(NETWORK_ID); @@ -150,7 +172,10 @@ public class NuageVspElementTest { final Network network = mock(Network.class); when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp); when(network.getId()).thenReturn(NETWORK_ID); + when(network.getVpcId()).thenReturn(null); when(network.getBroadcastUri()).thenReturn(new URI("")); + when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID); + when(network.getDomainId()).thenReturn(NETWORK_ID); when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true); when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(true); @@ -161,14 +186,27 @@ public class NuageVspElementTest { DeployDestination deployDest = mock(DeployDestination.class); - final Domain dom = mock(Domain.class); + final DomainVO dom = mock(DomainVO.class); when(dom.getName()).thenReturn("domain"); + when(domainDao.findById(NETWORK_ID)).thenReturn(dom); final Account acc = mock(Account.class); when(acc.getAccountName()).thenReturn("accountname"); final ReservationContext context = mock(ReservationContext.class); when(context.getDomain()).thenReturn(dom); when(context.getAccount()).thenReturn(acc); + 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(firewallRulesDao.listByNetworkPurposeTrafficType(NETWORK_ID, FirewallRule.Purpose.Firewall, FirewallRule.TrafficType.Ingress)).thenReturn(new ArrayList()); + when(firewallRulesDao.listByNetworkPurposeTrafficType(NETWORK_ID, FirewallRule.Purpose.Firewall, FirewallRule.TrafficType.Egress)).thenReturn(new ArrayList()); + when(ipAddressDao.listStaticNatPublicIps(NETWORK_ID)).thenReturn(new ArrayList()); + when(nuageVspManager.getDnsDetails(network)).thenReturn(new ArrayList()); + assertTrue(element.implement(network, offering, deployDest, context)); } @@ -215,7 +253,7 @@ public class NuageVspElementTest { when(hostDao.findById(NETWORK_ID)).thenReturn(host); when(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class)); - final ApplyStaticNatVspAnswer answer = mock(ApplyStaticNatVspAnswer.class); + final Answer answer = mock(Answer.class); when(answer.getResult()).thenReturn(true); when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); assertTrue(element.applyStaticNats(network, new ArrayList())); @@ -244,7 +282,7 @@ public class NuageVspElementTest { when(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class)); - final ApplyAclRuleVspAnswer answer = mock(ApplyAclRuleVspAnswer.class); + final Answer answer = mock(Answer.class); when(answer.getResult()).thenReturn(true); when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); assertTrue(element.applyFWRules(network, new ArrayList())); @@ -272,9 +310,44 @@ public class NuageVspElementTest { when(hostDao.findById(NETWORK_ID)).thenReturn(host); when(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class)); - final ApplyAclRuleVspAnswer answer = mock(ApplyAclRuleVspAnswer.class); + final Answer answer = mock(Answer.class); when(answer.getResult()).thenReturn(true); when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); assertTrue(element.applyNetworkACLs(network, new ArrayList())); } + + @Test + public void testShutdownVpc() throws Exception { + final Vpc vpc = mock(Vpc.class); + when(vpc.getUuid()).thenReturn("aaaaaa"); + when(vpc.getState()).thenReturn(Vpc.State.Inactive); + when(vpc.getDomainId()).thenReturn(NETWORK_ID); + when(vpc.getZoneId()).thenReturn(NETWORK_ID); + + final DomainVO dom = mock(DomainVO.class); + when(dom.getName()).thenReturn("domain"); + when(domainDao.findById(NETWORK_ID)).thenReturn(dom); + final Account acc = mock(Account.class); + when(acc.getAccountName()).thenReturn("accountname"); + final ReservationContext context = mock(ReservationContext.class); + when(context.getDomain()).thenReturn(dom); + when(context.getAccount()).thenReturn(acc); + + PhysicalNetworkVO physNet = mock(PhysicalNetworkVO.class); + when(physNet.getIsolationMethods()).thenReturn(Lists.newArrayList(PhysicalNetwork.IsolationMethod.VSP.name())); + when(physNet.getId()).thenReturn(NETWORK_ID); + when(physNetDao.listByZone(NETWORK_ID)).thenReturn(Lists.newArrayList(physNet)); + + 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); + assertTrue(element.shutdownVpc(vpc, context)); + } } \ No newline at end of file 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 f879f09b148..18c088f6840 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,29 +19,9 @@ package com.cloud.network.guru; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; - -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.junit.Before; -import org.junit.Test; - import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -import com.cloud.agent.api.guru.ImplementNetworkVspAnswer; -import com.cloud.agent.api.guru.ReleaseVmVspAnswer; -import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; @@ -63,11 +43,13 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; import com.cloud.network.NuageVspDeviceVO; +import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NuageVspDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.manager.NuageVspManager; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -79,9 +61,28 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.NicDao; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +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.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class NuageVspGuestNetworkGuruTest { private static final long NETWORK_ID = 42L; @@ -98,6 +99,9 @@ public class NuageVspGuestNetworkGuruTest { NuageVspDao nuageVspDao = mock(NuageVspDao.class); HostDao hostDao = mock(HostDao.class); NetworkDao networkDao = mock(NetworkDao.class); + ConfigurationDao configDao = mock(ConfigurationDao.class); + IPAddressDao ipAddressDao = mock(IPAddressDao.class); + NuageVspManager nuageVspManager = mock(NuageVspManager.class); NetworkDao netdao = mock(NetworkDao.class); NuageVspGuestNetworkGuru guru; @@ -105,7 +109,7 @@ public class NuageVspGuestNetworkGuruTest { @Before public void setUp() { guru = new NuageVspGuestNetworkGuru(); - ((GuestNetworkGuru)guru)._physicalNetworkDao = physnetdao; + guru._physicalNetworkDao = physnetdao; guru._physicalNetworkDao = physnetdao; guru._nuageVspDao = nuageVspDao; guru._dcDao = dcdao; @@ -119,12 +123,19 @@ public class NuageVspGuestNetworkGuruTest { guru._domainDao = domainDao; guru._nicDao = nicDao; guru._ntwkOfferingDao = ntwkOfferDao; + guru._configDao = configDao; + guru._ipAddressDao = ipAddressDao; + guru._nuageVspManager = nuageVspManager; final DataCenterVO dc = mock(DataCenterVO.class); when(dc.getNetworkType()).thenReturn(NetworkType.Advanced); when(dc.getGuestNetworkCidr()).thenReturn("10.1.1.1/24"); when(dcdao.findById((Long)any())).thenReturn(dc); + + when(configDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate"); + when(configDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate"); + when(configDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate"); } @Test @@ -146,10 +157,10 @@ public class NuageVspGuestNetworkGuruTest { when(offering.getTrafficType()).thenReturn(TrafficType.Management); assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true); - // Not supported: GuestType Shared + // Supported: GuestType Shared when(offering.getTrafficType()).thenReturn(TrafficType.Guest); when(offering.getGuestType()).thenReturn(GuestType.Shared); - assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true); + assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet) == true); // Not supported: Basic networking when(offering.getGuestType()).thenReturn(GuestType.Isolated); @@ -236,7 +247,8 @@ public class NuageVspGuestNetworkGuruTest { @Test public void testReserve() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException { - final Network network = mock(Network.class); + final NetworkVO network = mock(NetworkVO.class); + when(network.getId()).thenReturn(NETWORK_ID); when(network.getUuid()).thenReturn("aaaaaa"); when(network.getDataCenterId()).thenReturn(NETWORK_ID); when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID); @@ -262,10 +274,15 @@ public class NuageVspGuestNetworkGuruTest { when(nicvo.getUuid()).thenReturn("aaaa-fffff"); when(nicDao.findById(NETWORK_ID)).thenReturn(nicvo); - final VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + final VirtualMachine vm = mock(VirtualMachine.class); + when(vm.getId()).thenReturn(NETWORK_ID); when(vm.getType()).thenReturn(VirtualMachine.Type.User); - when(vm.getInstanceName()).thenReturn(""); - when(vm.getUuid()).thenReturn("aaaa-bbbbb"); + + final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class); + when(vmProfile.getType()).thenReturn(VirtualMachine.Type.User); + when(vmProfile.getInstanceName()).thenReturn(""); + when(vmProfile.getUuid()).thenReturn("aaaa-bbbbb"); + when(vmProfile.getVirtualMachine()).thenReturn(vm); NicProfile nicProfile = mock(NicProfile.class); when(nicProfile.getUuid()).thenReturn("aaa-bbbb"); @@ -283,51 +300,20 @@ public class NuageVspGuestNetworkGuruTest { 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 ReserveVmInterfaceVspAnswer answer = mock(ReserveVmInterfaceVspAnswer.class); - when(answer.getResult()).thenReturn(true); - when(answer.getInterfaceDetails()).thenReturn(new ArrayList>()); - when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); - guru.reserve(nicProfile, network, vm, mock(DeployDestination.class), mock(ReservationContext.class)); - } - - @Test - public void testRelease() { - final NicProfile nicProfile = mock(NicProfile.class); - when(nicProfile.getNetworkId()).thenReturn(NETWORK_ID); - final NetworkVO network = mock(NetworkVO.class); - when(network.getUuid()).thenReturn("aaaaaa-ffffff"); - when(network.getName()).thenReturn("aaaaaa"); - when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID); - when(networkDao.findById(NETWORK_ID)).thenReturn(network); - - final VirtualMachineProfile vm = mock(VirtualMachineProfile.class); - when(vm.getType()).thenReturn(VirtualMachine.Type.User); - when(vm.getInstanceName()).thenReturn(""); - when(vm.getUuid()).thenReturn("aaaa-bbbbb"); - - final VirtualMachine virtualMachine = mock(VirtualMachine.class); - when(vm.getVirtualMachine()).thenReturn(virtualMachine); - when(virtualMachine.getState()).thenReturn(State.Stopping); - - 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 ReleaseVmVspAnswer answer = mock(ReleaseVmVspAnswer.class); + final Answer answer = mock(Answer.class); when(answer.getResult()).thenReturn(true); when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); - guru.release(nicProfile, vm, "aaaaa-fffff"); + guru.reserve(nicProfile, network, vmProfile, mock(DeployDestination.class), mock(ReservationContext.class)); } @Test public void testImplementNetwork() throws URISyntaxException, InsufficientVirtualNetworkCapacityException { - final Network network = mock(Network.class); + final NetworkVO network = mock(NetworkVO.class); when(network.getId()).thenReturn(NETWORK_ID); when(network.getUuid()).thenReturn("aaaaaa"); when(network.getDataCenterId()).thenReturn(NETWORK_ID); @@ -371,8 +357,11 @@ public class NuageVspGuestNetworkGuruTest { 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 ImplementNetworkVspAnswer answer = mock(ImplementNetworkVspAnswer.class); + final Answer answer = mock(Answer.class); when(answer.getResult()).thenReturn(true); when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); @@ -383,4 +372,95 @@ public class NuageVspGuestNetworkGuruTest { guru.implement(network, offering, deployDest, reserveContext); } + @Test + public void testDeallocate() throws Exception { + final NetworkVO network = mock(NetworkVO.class); + when(network.getId()).thenReturn(NETWORK_ID); + when(network.getUuid()).thenReturn("aaaaaa"); + when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID); + when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID); + when(network.getVpcId()).thenReturn(null); + when(network.getDomainId()).thenReturn(NETWORK_ID); + when(networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network); + + final NetworkOfferingVO offering = mock(NetworkOfferingVO.class); + when(offering.getId()).thenReturn(NETWORK_ID); + when(offering.getTrafficType()).thenReturn(TrafficType.Guest); + when(ntwkOfferDao.findById(NETWORK_ID)).thenReturn(offering); + + final DomainVO domain = mock(DomainVO.class); + when(domain.getUuid()).thenReturn("aaaaaa"); + when(domainDao.findById(NETWORK_ID)).thenReturn(domain); + + final NicVO nic = mock(NicVO.class); + when(nic.getId()).thenReturn(NETWORK_ID); + when(nic.getIPv4Address()).thenReturn("10.10.10.10"); + when(nic.getMacAddress()).thenReturn("c8:60:00:56:e5:58"); + when(nicDao.findById(NETWORK_ID)).thenReturn(nic); + + final NicProfile nicProfile = mock(NicProfile.class); + when(nicProfile.getId()).thenReturn(NETWORK_ID); + when(nicProfile.getIPv4Address()).thenReturn("10.10.10.10"); + when(nicProfile.getMacAddress()).thenReturn("c8:60:00:56:e5:58"); + + final VirtualMachine vm = mock(VirtualMachine.class); + when(vm.getType()).thenReturn(VirtualMachine.Type.User); + when(vm.getState()).thenReturn(VirtualMachine.State.Expunging); + + final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class); + when(vmProfile.getUuid()).thenReturn("aaaaaa"); + 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); + + guru.deallocate(network, nicProfile, vmProfile); + } + + @Test + public void testTrash() throws Exception { + final NetworkVO network = mock(NetworkVO.class); + when(network.getId()).thenReturn(NETWORK_ID); + when(network.getUuid()).thenReturn("aaaaaa"); + when(network.getName()).thenReturn("trash"); + when(network.getDomainId()).thenReturn(NETWORK_ID); + when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID); + when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID); + when(network.getVpcId()).thenReturn(null); + when(networkDao.acquireInLockTable(NETWORK_ID, 1200)).thenReturn(network); + + final NetworkOfferingVO offering = mock(NetworkOfferingVO.class); + when(offering.getId()).thenReturn(NETWORK_ID); + when(offering.getTrafficType()).thenReturn(TrafficType.Guest); + when(ntwkOfferDao.findById(NETWORK_ID)).thenReturn(offering); + + final DomainVO domain = mock(DomainVO.class); + 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(guru.trash(network, offering)); + } + } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java index a8bed6d1199..a29e3d7894d 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java @@ -19,16 +19,9 @@ package com.cloud.network.manager; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; - -import javax.naming.ConfigurationException; - -import org.junit.Before; -import org.junit.Test; - +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.sync.SyncNuageVspCmsIdAnswer; import com.cloud.api.commands.DeleteNuageVspDeviceCmd; import com.cloud.api.commands.ListNuageVspDevicesCmd; import com.cloud.host.HostVO; @@ -42,6 +35,18 @@ import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.resource.ResourceManager; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.config.impl.ConfigurationVO; +import org.junit.Before; +import org.junit.Test; + +import javax.naming.ConfigurationException; +import java.util.ArrayList; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class NuageVspManagerTest { private static final long NETWORK_ID = 42L; @@ -53,6 +58,8 @@ public class NuageVspManagerTest { NuageVspDao nuageVspDao = mock(NuageVspDao.class); NetworkDao networkDao = mock(NetworkDao.class); HostDao hostDao = mock(HostDao.class); + AgentManager agentManager = mock(AgentManager.class); + ConfigurationDao configDao = mock(ConfigurationDao.class); NuageVspManagerImpl manager; @@ -67,6 +74,8 @@ public class NuageVspManagerTest { manager._nuageVspDao = nuageVspDao; manager._networkDao = networkDao; manager._hostDao = hostDao; + manager._agentMgr = agentManager; + manager._configDao = configDao; } @Test @@ -91,6 +100,14 @@ public class NuageVspManagerTest { final DeleteNuageVspDeviceCmd cmd = mock(DeleteNuageVspDeviceCmd.class); when(cmd.getNuageVspDeviceId()).thenReturn(NETWORK_ID); + ConfigurationVO cmsIdConfig = mock(ConfigurationVO.class); + when(cmsIdConfig.getValue()).thenReturn("1:1"); + when(configDao.findByName("nuagevsp.cms.id")).thenReturn(cmsIdConfig); + + final SyncNuageVspCmsIdAnswer answer = mock(SyncNuageVspCmsIdAnswer.class); + when(answer.getResult()).thenReturn(true); + when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); + manager.deleteNuageVspDevice(cmd); } 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 db359b6768a..770e13f0dc4 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,46 +19,35 @@ package com.cloud.network.resource; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.PingCommand; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.element.ApplyAclRuleVspCommand; +import com.cloud.agent.api.element.ApplyStaticNatVspCommand; +import com.cloud.agent.api.element.ShutDownVpcVspCommand; +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.sync.SyncVspCommand; +import com.cloud.host.Host; +import com.google.common.collect.Maps; import net.nuage.vsp.acs.client.NuageVspApiClient; import net.nuage.vsp.acs.client.NuageVspElementClient; import net.nuage.vsp.acs.client.NuageVspGuruClient; import net.nuage.vsp.acs.client.NuageVspSyncClient; - import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import com.cloud.agent.api.PingCommand; -import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.api.element.ApplyAclRuleVspAnswer; -import com.cloud.agent.api.element.ApplyAclRuleVspCommand; -import com.cloud.agent.api.element.ApplyStaticNatVspAnswer; -import com.cloud.agent.api.element.ApplyStaticNatVspCommand; -import com.cloud.agent.api.element.ShutDownVpcVspAnswer; -import com.cloud.agent.api.element.ShutDownVpcVspCommand; -import com.cloud.agent.api.guru.DeallocateVmVspAnswer; -import com.cloud.agent.api.guru.DeallocateVmVspCommand; -import com.cloud.agent.api.guru.ImplementNetworkVspAnswer; -import com.cloud.agent.api.guru.ImplementNetworkVspCommand; -import com.cloud.agent.api.guru.ReleaseVmVspAnswer; -import com.cloud.agent.api.guru.ReleaseVmVspCommand; -import com.cloud.agent.api.guru.ReserveVmInterfaceVspAnswer; -import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; -import com.cloud.agent.api.guru.TrashNetworkVspAnswer; -import com.cloud.agent.api.guru.TrashNetworkVspCommand; -import com.cloud.agent.api.sync.SyncVspAnswer; -import com.cloud.agent.api.sync.SyncVspCommand; -import com.cloud.host.Host; +import javax.naming.ConfigurationException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; public class NuageVspResourceTest { NuageVspResource _resource; @@ -66,9 +55,10 @@ public class NuageVspResourceTest { NuageVspElementClient _mockNuageVspElementClient = mock(NuageVspElementClient.class); NuageVspGuruClient _mockNuageVspGuruClient = mock(NuageVspGuruClient.class); NuageVspSyncClient _mockNuageVspSyncClient = mock(NuageVspSyncClient.class); - Map _parameters; + NuageVspResource.Configuration _resourceConfiguration; + Map _hostDetails; - Answer genericAnswer = new Answer() { + org.mockito.stubbing.Answer genericAnswer = new org.mockito.stubbing.Answer() { public Object answer(InvocationOnMock invocation) { return null; } @@ -88,34 +78,36 @@ public class NuageVspResourceTest { } - protected void isNuageVspApiLoaded() throws Exception { + protected void isNuageVspApiLoaded() throws ConfigurationException { } - protected void isNuageVspGuruLoaded() throws Exception { + protected void isNuageVspGuruLoaded() throws ConfigurationException { } - protected void isNuageVspElementLoaded() throws Exception { + protected void isNuageVspElementLoaded() throws ConfigurationException { } - protected void isNuageVspSyncLoaded() throws Exception { + protected void isNuageVspSyncLoaded() throws ConfigurationException { } - protected void login() throws Exception { + protected void login() throws ConfigurationException { } }; - _parameters = new HashMap(); - _parameters.put("name", "nuagevsptestdevice"); - _parameters.put("guid", "aaaaa-bbbbb-ccccc"); - _parameters.put("zoneId", "blublub"); - _parameters.put("hostname", "nuagevsd"); - _parameters.put("cmsuser", "cmsuser"); - _parameters.put("cmsuserpass", "cmsuserpass"); - _parameters.put("port", "8443"); - _parameters.put("apirelativepath", "nuage/api/v1_0"); - _parameters.put("retrycount", "3"); - _parameters.put("retryinterval", "3"); + _resourceConfiguration = new NuageVspResource.Configuration() + .name("nuagevsptestdevice") + .guid("aaaaa-bbbbb-ccccc") + .zoneId("blublub") + .hostName("nuagevsd") + .cmsUser("cmsuser") + .cmsUserPassword("cmsuserpass") + .port("8443") + .apiVersion("v3_2") + .apiRelativePath("nuage/api/v3_2") + .retryCount("3") + .retryInterval("3"); + _hostDetails = Maps.newHashMap(_resourceConfiguration.build()); } @Test(expected = Exception.class) @@ -125,7 +117,7 @@ public class NuageVspResourceTest { @Test public void resourceConfigure() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); assertTrue("nuagevsptestdevice".equals(_resource.getName())); assertTrue(_resource.getType() == Host.Type.L2Networking); @@ -133,7 +125,7 @@ public class NuageVspResourceTest { @Test public void testInitialization() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); StartupCommand[] sc = _resource.initialize(); assertTrue(sc.length == 1); @@ -144,7 +136,7 @@ public class NuageVspResourceTest { @Test public void testPingCommandStatus() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); PingCommand ping = _resource.getCurrentStatus(42); assertTrue(ping != null); @@ -154,99 +146,102 @@ public class NuageVspResourceTest { @Test public void testImplementNetworkVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - ImplementNetworkVspCommand impNtwkCmd = new ImplementNetworkVspCommand("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName", - "networkAccountUuid", "networkName", "networkCidr", "networkGateway", "networkUuid", true, "vpcName", "vpcUuid", true, new ArrayList()); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName", "networkAccountUuid", - "networkName", "networkCidr", "networkGateway", "networkUuid", true, "vpcName", "vpcUuid", true, new ArrayList()); - ImplementNetworkVspAnswer implNtwkAns = (ImplementNetworkVspAnswer)_resource.executeRequest(impNtwkCmd); + ImplementNetworkVspCommand.Builder cmdBuilder = new ImplementNetworkVspCommand.Builder().networkDomainName("networkDomainName").networkDomainPath("networkDomainPath") + .networkDomainUuid("networkDomainUuid").networkAccountName("networkAccountName").networkAccountUuid("networkAccountUuid").networkName("networkName") + .networkCidr("networkCidr").networkGateway("networkGateway").networkAclId(0L).dnsServers(new ArrayList()).gatewaySystemIds(new ArrayList()) + .networkUuid("networkUuid").isL3Network(true).isVpc(true).isSharedNetwork(true).vpcName("vpcName").vpcUuid("vpcUuid").defaultEgressPolicy(true) + .ipAddressRange(new ArrayList()).domainTemplateName("domainTemplateName"); + doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName", + "networkAccountUuid", "networkName", "networkCidr", "networkGateway", 0L, new ArrayList(), new ArrayList(), true, true, true, "networkUuid", + "vpcName", "vpcUuid", true, new ArrayList(), "domainTemplateName"); + com.cloud.agent.api.Answer implNtwkAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(implNtwkAns.getResult()); } @Test public void testReserveVmInterfaceVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - ReserveVmInterfaceVspCommand rsrvVmInfCmd = new ReserveVmInterfaceVspCommand("nicUuid", "nicMacAddress", "networkUuid", true, "vpcUuid", "networkDomainUuid", - "networksAccountUuid", false, "domainRouterIp", "vmInstanceName", "vmUuid", "vmUserName", "vmUserDomainName"); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).reserve("nicUuid", "nicMacAddress", "networkUuid", true, "vpcUuid", "networkDomainUuid", "networksAccountUuid", - false, "domainRouterIp", "vmInstanceName", "vmUuid"); - ReserveVmInterfaceVspAnswer rsrvVmInfAns = (ReserveVmInterfaceVspAnswer)_resource.executeRequest(rsrvVmInfCmd); + ReserveVmInterfaceVspCommand.Builder cmdBuilder = new ReserveVmInterfaceVspCommand.Builder().nicUuid("nicUuid").nicMacAddress("nicMacAddress") + .networkUuid("networkUuid").isL3Network(true).isSharedNetwork(true).vpcUuid("vpcUuid").networkDomainUuid("networkDomainUuid") + .networksAccountUuid("networksAccountUuid").isDomainRouter(false).domainRouterIp("domainRouterIp").vmInstanceName("vmInstanceName").vmUuid("vmUuid") + .vmUserName("vmUserName").vmUserDomainName("vmUserDomainName").useStaticIp(true).staticIp("staticIp").staticNatIpUuid("staticNatIpUuid") + .staticNatIpAddress("staticNatIpAddress").isStaticNatIpAllocated(true).isOneToOneNat(true).staticNatVlanUuid("staticNatVlanUuid") + .staticNatVlanGateway("staticNatVlanGateway").staticNatVlanNetmask("staticNatVlanNetmask"); + doAnswer(genericAnswer).when(_mockNuageVspGuruClient).reserve("nicUuid", "nicMacAddress", "networkUuid", true, true, "vpcUuid", "networkDomainUuid", + "networksAccountUuid", false, "domainRouterIp", "vmInstanceName", "vmUuid", true, "staticIp", "staticNatIpUuid", "staticNatIpAddress", + true, true, "staticNatVlanUuid", "staticNatVlanGateway", "staticNatVlanNetmask"); + Answer rsrvVmInfAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(rsrvVmInfAns.getResult()); } - @Test - public void testReleaseVmVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); - - ReleaseVmVspCommand releaseVmCmd = new ReleaseVmVspCommand("networkUuid", "vmUuid", "vmInstanceName"); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).release("networkUuid", "vmUuid", "vmInstanceName"); - ReleaseVmVspAnswer releaseVmAns = (ReleaseVmVspAnswer)_resource.executeRequest(releaseVmCmd); - assertTrue(releaseVmAns.getResult()); - } - @Test public void testDeallocateVmVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - DeallocateVmVspCommand dellocateVmCmd = new DeallocateVmVspCommand("networkUuid", "nicFrmDdUuid", "nicMacAddress", "nicIp4Address", true, "vpcUuid", "networksDomainUuid", - "vmInstanceName", "vmUuid"); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).deallocate("networkUuid", "nicFrmDdUuid", "nicMacAddress", "nicIp4Address", true, "vpcUuid", "networksDomainUuid", - "vmInstanceName", "vmUuid"); - DeallocateVmVspAnswer dellocateVmAns = (DeallocateVmVspAnswer)_resource.executeRequest(dellocateVmCmd); + DeallocateVmVspCommand.Builder cmdBuilder = new DeallocateVmVspCommand.Builder().networkUuid("networkUuid").nicFromDbUuid("nicFromDbUuid") + .nicMacAddress("nicMacAddress").nicIp4Address("nicIp4Address").isL3Network(true).isSharedNetwork(true).vpcUuid("vpcUuid") + .networksDomainUuid("networksDomainUuid").vmInstanceName("vmInstanceName").vmUuid("vmUuid").isExpungingState(true); + doAnswer(genericAnswer).when(_mockNuageVspGuruClient).deallocate("networkUuid", "nicFrmDdUuid", "nicMacAddress", "nicIp4Address", true, true, "vpcUuid", "networksDomainUuid", + "vmInstanceName", "vmUuid", true); + Answer dellocateVmAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(dellocateVmAns.getResult()); } @Test public void testTrashNetworkVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - TrashNetworkVspCommand trashNtwkCmd = new TrashNetworkVspCommand("domainUuid", "networkUuid", true, "vpcUuid"); - doAnswer(genericAnswer).when(_mockNuageVspGuruClient).trash("domainUuid", "networkUuid", true, "vpcUuid"); - TrashNetworkVspAnswer trashNtwkAns = (TrashNetworkVspAnswer)_resource.executeRequest(trashNtwkCmd); + TrashNetworkVspCommand.Builder cmdBuilder = new TrashNetworkVspCommand.Builder().domainUuid("domainUuid").networkUuid("networkUuid") + .isL3Network(true).isSharedNetwork(true).vpcUuid("vpcUuid").domainTemplateName("domainTemplateName"); + doAnswer(genericAnswer).when(_mockNuageVspGuruClient).trash("domainUuid", "networkUuid", true, true, "vpcUuid", "domainTemplateName"); + Answer trashNtwkAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(trashNtwkAns.getResult()); } @Test public void testApplyStaticNatVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - ApplyStaticNatVspCommand applyNatCmd = new ApplyStaticNatVspCommand("networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList>()); - doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyStaticNats("networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList>()); - ApplyStaticNatVspAnswer applyNatAns = (ApplyStaticNatVspAnswer)_resource.executeRequest(applyNatCmd); + ApplyStaticNatVspCommand.Builder cmdBuilder = new ApplyStaticNatVspCommand.Builder().networkDomainUuid("networkDomainUuid").networkUuid("networkUuid") + .vpcOrSubnetUuid("vpcOrSubnetUuid").isL3Network(true).isVpc(true).staticNatDetails(new ArrayList>()); + doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyStaticNats("networkDomainUuid", "networkUuid", "vpcOrSubnetUuid", true, true, new ArrayList>()); + Answer applyNatAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(applyNatAns.getResult()); } @Test public void testApplyAclRuleVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - ApplyAclRuleVspCommand applyAclCmd = new ApplyAclRuleVspCommand("networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList>(), false, - 100); - doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyAclRules("networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList>(), - false, 100); - ApplyAclRuleVspAnswer applyAclAns = (ApplyAclRuleVspAnswer)_resource.executeRequest(applyAclCmd); + ApplyAclRuleVspCommand.Builder cmdBuilder = new ApplyAclRuleVspCommand.Builder().networkAcl(true).networkUuid("networkUuid").networkDomainUuid("networkDomainUuid") + .vpcOrSubnetUuid("vpcOrSubnetUuid").networkName("networkName").isL2Network(true).aclRules(new ArrayList>()).networkId(100) + .egressDefaultPolicy(false).acsIngressAcl(true).networkReset(true).domainTemplateName("domainTemplateName"); + doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyAclRules(true, "networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", "networkName", true, + new ArrayList>(), 100, false, true, true, "domainTemplateName"); + Answer applyAclAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(applyAclAns.getResult()); } @Test public void testShutDownVpcVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); - ShutDownVpcVspCommand shutVpcCmd = new ShutDownVpcVspCommand("domainUuid", "vpcUuid"); - doAnswer(genericAnswer).when(_mockNuageVspElementClient).shutDownVpc("domainUuid", "vpcUuid"); - ShutDownVpcVspAnswer shutVpcAns = (ShutDownVpcVspAnswer)_resource.executeRequest(shutVpcCmd); + ShutDownVpcVspCommand.Builder cmdBuilder = new ShutDownVpcVspCommand.Builder().domainUuid("domainUuid").vpcUuid("vpcUuid").domainTemplateName("domainTemplateName"); + doAnswer(genericAnswer).when(_mockNuageVspElementClient).shutdownVpc("domainUuid", "vpcUuid", "domainTemplateName"); + Answer shutVpcAns = _resource.executeRequest(cmdBuilder.build()); assertTrue(shutVpcAns.getResult()); } @Test public void testSyncVspCommand() throws Exception { - _resource.configure("NuageVspResource", _parameters); + _resource.configure("NuageVspResource", _hostDetails); SyncVspCommand shutVpcCmd = new SyncVspCommand("nuageVspEntity"); doAnswer(genericAnswer).when(_mockNuageVspSyncClient).syncWithNuageVsp("nuageVspEntity"); - SyncVspAnswer shutVpcAns = (SyncVspAnswer)_resource.executeRequest(shutVpcCmd); + Answer shutVpcAns = _resource.executeRequest(shutVpcCmd); assertTrue(shutVpcAns.getResult()); } } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java index f9e503d5aeb..23430d4685a 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java @@ -19,23 +19,22 @@ package com.cloud.network.sync; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.Arrays; - -import org.junit.Before; -import org.junit.Test; - import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -import com.cloud.agent.api.sync.SyncVspAnswer; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.dao.NuageVspDao; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class NuageVspSyncTest { private static final long NETWORK_ID = 42L; @@ -64,7 +63,7 @@ public class NuageVspSyncTest { when(host.getId()).thenReturn(NETWORK_ID); when(hostDao.findById(NETWORK_ID)).thenReturn(host); - final SyncVspAnswer answer = mock(SyncVspAnswer.class); + final Answer answer = mock(Answer.class); when(answer.getResult()).thenReturn(true); when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 69e70e6cd9e..ccbc0b0ef06 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -4602,10 +4602,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati @Override public boolean isOfferingForVpc(final NetworkOffering offering) { final boolean vpcProvider = _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.VPCVirtualRouter) || - _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.JuniperContrailVpcRouter) || - _ntwkOffServiceMapDao.getDistinctProviders(offering.getId()).contains(Provider.NuageVsp.getName()); + _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.JuniperContrailVpcRouter); + final boolean nuageVpcProvider = _ntwkOffServiceMapDao.getDistinctProviders(offering.getId()).contains(Provider.NuageVsp.getName()) + && offering.getIsPersistent(); - return vpcProvider; + return vpcProvider || nuageVpcProvider; } @Override diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 9686f8087dd..018ab906ebc 100644 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java @@ -21,6 +21,7 @@ import java.util.List; import javax.ejb.Local; import javax.inject.Inject; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.log4j.Logger; @@ -98,6 +99,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { NicDao _nicDao; @Inject IpAddressManager _ipAddrMgr; + @Inject + NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao; private static final TrafficType[] TrafficTypes = {TrafficType.Guest}; @@ -118,7 +121,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { protected boolean canHandle(NetworkOffering offering, DataCenter dc) { // this guru handles only Guest networks in Advance zone with source nat service disabled - if (dc.getNetworkType() == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == GuestType.Shared) { + if (dc.getNetworkType() == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == GuestType.Shared + && !_ntwkOfferingSrvcDao.isProviderForNetworkOffering(offering.getId(), Network.Provider.NuageVsp)) { return true; } else { s_logger.trace("We only take care of Guest networks of type " + GuestType.Shared); diff --git a/test/integration/component/test_nuage_vsp.py b/test/integration/component/test_nuage_vsp.py index ee7fc68cacd..e7bd10e2019 100644 --- a/test/integration/component/test_nuage_vsp.py +++ b/test/integration/component/test_nuage_vsp.py @@ -23,7 +23,11 @@ from marvin.cloudstackTestCase import cloudstackTestCase from marvin.cloudstackAPI import (listPhysicalNetworks, listNetworkServiceProviders, addNetworkServiceProvider, - addNuageVspDevice) + deleteNetworkServiceProvider, + deleteNuageVspDevice, + updateNetworkServiceProvider, + addNuageVspDevice, + destroyVirtualMachine) from marvin.lib.utils import (cleanup_resources) from marvin.lib.base import (Account, VirtualMachine, @@ -34,6 +38,9 @@ from marvin.lib.common import (get_domain, get_zone, get_template) +import logging +import unittest + class Services: @@ -41,12 +48,13 @@ class Services: """ def __init__(self): + print "in __init__" self.services = { "account": { "email": "cloudstack@cloudmonkey.com", "firstname": "cloudstack", "lastname": "bob", - "username": "bobbuilder", + "username": "admin", "password": "password", }, "service_offering": { @@ -61,17 +69,17 @@ class Services: "username": "root", "password": "password", "ssh_port": 22, - "hypervisor": 'XenServer', + "hypervisor": 'KVM', "privateport": 22, "publicport": 22, "protocol": 'TCP', }, "nuage_vsp_device": { - "hostname": '192.168.0.7', - "username": 'testusername', - "password": 'testpassword', + "hostname": '172.31.222.162', + "username": 'cloudstackuser1', + "password": 'cloudstackuser1', "port": '8443', - "apiversion": 'v1_0', + "apiversion": 'v3_2', "retrycount": '4', "retryinterval": '60' }, @@ -92,12 +100,15 @@ class Services: "SourceNat": 'NuageVsp', "Firewall": 'NuageVsp' }, + "serviceCapabilityList": { + "SourceNat": {"SupportedSourceNatTypes": "perzone"}, + } }, "network": { "name": "nuage", "displaytext": "nuage", }, - "ostype": 'CentOS 5.3 (64-bit)', + "ostype": 'CentOS 5.5 (64-bit)', "sleep": 60, "timeout": 10 } @@ -107,6 +118,7 @@ class TestNuageVsp(cloudstackTestCase): @classmethod def setUpClass(cls): + print "In setup class" cls._cleanup = [] cls.testClient = super(TestNuageVsp, cls).getClsTestClient() cls.api_client = cls.testClient.getApiClient() @@ -125,10 +137,14 @@ class TestNuageVsp(cloudstackTestCase): try: resp = listPhysicalNetworks.listPhysicalNetworksCmd() + print "in cls.setupClass- resp: %s" % resp resp.zoneid = cls.zone.id physical_networks = cls.api_client.listPhysicalNetworks(resp) - if isinstance(physical_networks, list): - physical_network = physical_networks[0] + for pn in physical_networks: + if pn.isolationmethods=='VSP': + physical_network = pn + #if isinstance(physical_networks, list): + # physical_network = physical_networks[1] resp = listNetworkServiceProviders.listNetworkServiceProvidersCmd() resp.name = 'NuageVsp' resp.physicalnetworkid = physical_network.id @@ -141,11 +157,17 @@ class TestNuageVsp(cloudstackTestCase): resp_add_nsp.name = 'NuageVsp' resp_add_nsp.physicalnetworkid = physical_network.id cls.api_client.addNetworkServiceProvider(resp_add_nsp) + #Get NSP ID + nw_service_providers = cls.api_client.listNetworkServiceProviders( + resp) + cls.debug("NuageVsp NSP ID: %s" % nw_service_providers[0].id) + resp_add_device = addNuageVspDevice.addNuageVspDeviceCmd() resp_add_device.physicalnetworkid = physical_network.id resp_add_device.username = cls.nuage_services["username"] resp_add_device.password = cls.nuage_services["password"] resp_add_device.hostname = cls.nuage_services["hostname"] + resp_add_device.port = cls.nuage_services["port"] resp_add_device.apiversion = cls.nuage_services[ "apiversion"] resp_add_device.retrycount = cls.nuage_services[ @@ -154,6 +176,13 @@ class TestNuageVsp(cloudstackTestCase): "retryinterval"] cls.nuage = cls.api_client.addNuageVspDevice( resp_add_device) + #Enable NuageVsp NSP + cls.debug("NuageVsp NSP ID : %s" % nw_service_providers[0].id) + resp_up_nsp = \ + updateNetworkServiceProvider.updateNetworkServiceProviderCmd() + resp_up_nsp.id = nw_service_providers[0].id + resp_up_nsp.state = 'Enabled' + cls.api_client.updateNetworkServiceProvider(resp_up_nsp) cls.network_offering = NetworkOffering.create( cls.api_client, @@ -172,7 +201,7 @@ class TestNuageVsp(cloudstackTestCase): cls._cleanup.append(cls.service_offering) except Exception as e: cls.tearDownClass() - raise Exception("Warning: Exception in setUpClass: %s" % e) + raise unittest.SkipTest("Unable to add VSP device") return @classmethod @@ -183,6 +212,7 @@ class TestNuageVsp(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + def setUp(self): self.apiclient = self.testClient.getApiClient() self.dbclient = self.testClient.getDbConnection() @@ -195,6 +225,7 @@ class TestNuageVsp(cloudstackTestCase): self.cleanup = [self.account] return + def tearDown(self): try: self.debug("Cleaning up the resources") @@ -204,7 +235,7 @@ class TestNuageVsp(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags=["invalid"]) + @attr(tags=["advanced"]) def test_network_vsp(self): """Test nuage Network and VM Creation """ @@ -217,7 +248,9 @@ class TestNuageVsp(cloudstackTestCase): accountid=self.account.name, domainid=self.account.domainid, networkofferingid=self.network_offering.id, - zoneid=self.zone.id + zoneid=self.zone.id, + gateway = "10.1.1.1", + netmask = '255.255.255.0' ) self.debug("Created network with ID: %s" % self.network.id) @@ -292,7 +325,7 @@ class TestNuageVsp(cloudstackTestCase): VirtualMachine.delete(virtual_machine_1, self.apiclient, expunge=True) - # Deleting a single VM + # # Deleting a single VM VirtualMachine.delete(virtual_machine_2, self.apiclient, expunge=True) # Delete Network diff --git a/test/integration/component/test_vpcnetwork_nuage.py b/test/integration/component/test_vpcnetwork_nuage.py new file mode 100644 index 00000000000..be76fa65ecb --- /dev/null +++ b/test/integration/component/test_vpcnetwork_nuage.py @@ -0,0 +1,295 @@ +# 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. +""" Tests for NuageNetwork VPC +""" +#Import Local Modules +from marvin.cloudstackTestCase import cloudstackTestCase, unittest +from marvin.lib.utils import (cleanup_resources) +from marvin.cloudstackAPI import (listPhysicalNetworks, + listNetworkServiceProviders, + addNetworkServiceProvider, + updateNetworkServiceProvider, + addNuageVspDevice, + destroyVirtualMachine) +from marvin.lib.base import (VirtualMachine, + ServiceOffering, + Account, + NetworkOffering, + Network, + VPC, + VpcOffering, + NetworkACL, + NetworkACLList) +from marvin.lib.common import (get_zone, + get_domain, + get_template, + wait_for_cleanup, + list_networks) + +from nose.plugins.attrib import attr + +class Services: + + """Test NuageVsp plugin + """ + + def __init__(self): + self.services = { + "account": { + "email": "cloudstack@cloudmonkey.com", + "firstname": "cloudstack", + "lastname": "bob", + "username": "admin", + "password": "password", + }, + "service_offering": { + "name": "Tiny Instance", + "displaytext": "Tiny Instance", + "cpunumber": 1, + "cpuspeed": 100, # in MHz + "memory": 128, # In MBs + }, + "virtual_machine": { + "displayname": "TestVM", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "nuage_vsp_device": { + #"hostname": '192.168.0.7', + #"hostname": '10.31.43.226', + "hostname": '172.31.222.162', + "username": 'cloudstackuser1', + "password": 'cloudstackuser1', + "port": '8443', + "apiversion": 'v3_2', + "retrycount": '4', + "retryinterval": '60' + }, + # services supported by Nuage for VPC networks. + "vpc_network_offering": { + "name": 'nuage_vpc_marvin', + "displaytext": 'nuage_vpc_marvin', + "guestiptype": 'Isolated', + "supportedservices": 'UserData,Dhcp,SourceNat,StaticNat,NetworkACL,Connectivity', + "traffictype": 'GUEST', + "useVpc": 'on', + "serviceProviderList": { + "Dhcp": "NuageVsp", + "SourceNat": "NuageVsp", + "StaticNat": "NuageVsp", + "NetworkACL": "NuageVsp", + "UserData": "VpcVirtualRouter", + "Connectivity": "NuageVsp" + }, + "serviceCapabilityList": { + "SourceNat": {"SupportedSourceNatTypes": "perzone"} + } + }, + "vpc": { + "name": "vpc-networkacl-nuage", + "displaytext": "vpc-networkacl-nuage", + "cidr": '10.1.0.0/16' + }, + "vpcnetwork": { + "name": "nuagevpcnetwork", + "displaytext": "nuagevpcnetwork", + "netmask": '255.255.255.128' + }, + "ostype": 'CentOS 5.5 (64-bit)', + "sleep": 60, + "timeout": 10 + } + + +class TestVpcNetworkNuage(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + cls._cleanup = [] + cls.testClient = super(TestVpcNetworkNuage, cls).getClsTestClient() + cls.api_client = cls.testClient.getApiClient() + + cls.services = Services().services + # Get Zone, Domain and templates + cls.domain = get_domain(cls.api_client) + cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests()) + cls.template = get_template( + cls.api_client, + cls.zone.id, + cls.services["ostype"] + ) + # nuage vsp device brings the Nuage virtual service platform into play + cls.nuage_services = cls.services["nuage_vsp_device"] + try: + + resp = listPhysicalNetworks.listPhysicalNetworksCmd() + print "in cls.setupClass- resp: %s" % resp + resp.zoneid = cls.zone.id + physical_networks = cls.api_client.listPhysicalNetworks(resp) + for pn in physical_networks: + if pn.isolationmethods=='VSP': + physical_network = pn + #if isinstance(physical_networks, list): + # physical_network = physical_networks[1] + resp = listNetworkServiceProviders.listNetworkServiceProvidersCmd() + resp.name = 'NuageVsp' + resp.physicalnetworkid = physical_network.id + nw_service_providers = cls.api_client.listNetworkServiceProviders( + resp) + if not isinstance(nw_service_providers, list): + # create network service provider and add nuage vsp device + resp_add_nsp = \ + addNetworkServiceProvider.addNetworkServiceProviderCmd() + resp_add_nsp.name = 'NuageVsp' + resp_add_nsp.physicalnetworkid = physical_network.id + cls.api_client.addNetworkServiceProvider(resp_add_nsp) + #Get NSP ID + nw_service_providers = cls.api_client.listNetworkServiceProviders( + resp) + cls.debug("NuageVsp NSP ID: %s" % nw_service_providers[0].id) + + resp_add_device = addNuageVspDevice.addNuageVspDeviceCmd() + resp_add_device.physicalnetworkid = physical_network.id + resp_add_device.username = cls.nuage_services["username"] + resp_add_device.password = cls.nuage_services["password"] + resp_add_device.hostname = cls.nuage_services["hostname"] + resp_add_device.port = cls.nuage_services["port"] + resp_add_device.apiversion = cls.nuage_services[ + "apiversion"] + resp_add_device.retrycount = cls.nuage_services[ + "retrycount"] + resp_add_device.retryinterval = cls.nuage_services[ + "retryinterval"] + cls.nuage = cls.api_client.addNuageVspDevice( + resp_add_device) + #Enable NuageVsp NSP + cls.debug("NuageVsp NSP ID : %s" % nw_service_providers[0].id) + resp_up_nsp = \ + updateNetworkServiceProvider.updateNetworkServiceProviderCmd() + resp_up_nsp.id = nw_service_providers[0].id + resp_up_nsp.state = 'Enabled' + cls.api_client.updateNetworkServiceProvider(resp_up_nsp) + + cls.network_offering = NetworkOffering.create( + cls.api_client, + cls.services["vpc_network_offering"], + conservemode=False + ) + cls._cleanup.append(cls.network_offering) + + cls.network_offering.update(cls.api_client, state='Enabled') + cls.services["virtual_machine"]["zoneid"] = cls.zone.id + cls.services["virtual_machine"]["template"] = cls.template.id + cls.service_offering = ServiceOffering.create( + cls.api_client, + cls.services["service_offering"] + ) + cls._cleanup.append(cls.service_offering) + except Exception as e: + cls.tearDownClass() + raise unittest.SkipTest("Unable to add VSP device") + return + + @attr(tags=["advanced"]) + def test_vpcnetwork_nuage(self): + """Test network VPC for Nuage""" + + # 1) Create VPC with Nuage VPC offering + vpcOffering = VpcOffering.list(self.apiclient,name="Nuage VSP VPC offering") + self.assert_(vpcOffering is not None and len(vpcOffering)>0, "Nuage VPC offering not found") + vpc = VPC.create( + apiclient=self.apiclient, + services=self.services["vpc"], + networkDomain="vpc.networkacl", + vpcofferingid=vpcOffering[0].id, + zoneid=self.zone.id, + account=self.account.name, + domainid=self.account.domainid + ) + self.assert_(vpc is not None, "VPC creation failed") + + # 2) Create ACL + aclgroup = NetworkACLList.create(apiclient=self.apiclient, services={}, name="acl", description="acl", vpcid=vpc.id) + self.assertIsNotNone(aclgroup, "Failed to create NetworkACL list") + self.debug("Created a network ACL list %s" % aclgroup.name) + + # 3) Create ACL Item + aclitem = NetworkACL.create(apiclient=self.apiclient, services={}, + protocol="TCP", number="10", action="Deny", aclid=aclgroup.id, cidrlist=["0.0.0.0/0"]) + self.assertIsNotNone(aclitem, "Network failed to aclItem") + self.debug("Added a network ACL %s to ACL list %s" % (aclitem.id, aclgroup.name)) + + # 4) Create network with ACL + nwNuage = Network.create( + self.apiclient, + self.services["vpcnetwork"], + accountid=self.account.name, + domainid=self.account.domainid, + networkofferingid=self.network_offering.id, + zoneid=self.zone.id, + vpcid=vpc.id, + aclid=aclgroup.id, + gateway='10.1.0.1' + ) + self.debug("Network %s created in VPC %s" %(nwNuage.id, vpc.id)) + + # 5) Deploy a vm + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machine"], + accountid=self.account.name, + domainid=self.account.domainid, + serviceofferingid=self.service_offering.id, + networkids=[str(nwNuage.id)] + ) + self.assert_(vm is not None, "VM failed to deploy") + self.assert_(vm.state == 'Running', "VM is not running") + self.debug("VM %s deployed in VPC %s" %(vm.id, vpc.id)) + + @classmethod + def tearDownClass(cls): + try: + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def setUp(self): + self.apiclient = self.testClient.getApiClient() + self.dbclient = self.testClient.getDbConnection() + self.account = Account.create( + self.apiclient, + self.services["account"], + admin=True, + domainid=self.domain.id + ) + self.cleanup = [self.account] + return + + def tearDown(self): + try: + self.debug("Cleaning up the resources") + cleanup_resources(self.apiclient, self.cleanup) + self.debug("Cleanup complete!") + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return