You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by hu...@apache.org on 2014/07/21 10:50:17 UTC
[1/4] CLOUDSTACK-6845 : NuageVsp Network plugin
Repository: cloudstack
Updated Branches:
refs/heads/master 43dffaad5 -> 03de9cc33
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..a8bed6d
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/manager/NuageVspManagerTest.java
@@ -0,0 +1,111 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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.api.commands.DeleteNuageVspDeviceCmd;
+import com.cloud.api.commands.ListNuageVspDevicesCmd;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.NuageVspDeviceVO;
+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.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.resource.ResourceManager;
+
+public class NuageVspManagerTest {
+ private static final long NETWORK_ID = 42L;
+
+ PhysicalNetworkDao physicalNetworkDao = mock(PhysicalNetworkDao.class);
+ PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao = mock(PhysicalNetworkServiceProviderDao.class);
+ ResourceManager resourceMgr = mock(ResourceManager.class);
+ HostDetailsDao hostDetailsDao = mock(HostDetailsDao.class);
+ NuageVspDao nuageVspDao = mock(NuageVspDao.class);
+ NetworkDao networkDao = mock(NetworkDao.class);
+ HostDao hostDao = mock(HostDao.class);
+
+ NuageVspManagerImpl manager;
+
+ @Before
+ public void setUp() {
+ manager = new NuageVspManagerImpl();
+
+ manager._physicalNetworkServiceProviderDao = physicalNetworkServiceProviderDao;
+ manager._physicalNetworkDao = physicalNetworkDao;
+ manager._resourceMgr = resourceMgr;
+ manager._hostDetailsDao = hostDetailsDao;
+ manager._nuageVspDao = nuageVspDao;
+ manager._networkDao = networkDao;
+ manager._hostDao = hostDao;
+ }
+
+ @Test
+ public void testDeleteNuageVspDevice() throws ConfigurationException {
+
+ final PhysicalNetworkVO physicalNetwork = mock(PhysicalNetworkVO.class);
+ when(physicalNetwork.getDataCenterId()).thenReturn(NETWORK_ID);
+ when(physicalNetwork.getId()).thenReturn(NETWORK_ID);
+ when(physicalNetworkDao.findById(NETWORK_ID)).thenReturn(physicalNetwork);
+
+ final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class);
+ when(nuageVspDevice.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID);
+ when(nuageVspDao.findById(NETWORK_ID)).thenReturn(nuageVspDevice);
+
+ when(networkDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(new ArrayList<NetworkVO>());
+
+ final HostVO host = mock(HostVO.class);
+ when(host.getId()).thenReturn(NETWORK_ID);
+ when(hostDao.findById(NETWORK_ID)).thenReturn(host);
+
+ final DeleteNuageVspDeviceCmd cmd = mock(DeleteNuageVspDeviceCmd.class);
+ when(cmd.getNuageVspDeviceId()).thenReturn(NETWORK_ID);
+
+ manager.deleteNuageVspDevice(cmd);
+ }
+
+ @Test
+ public void testListNuageVspDevices() {
+ final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class);
+ when(nuageVspDevice.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+
+ final PhysicalNetworkVO phyNtwkVO = mock(PhysicalNetworkVO.class);
+ when(physicalNetworkDao.findById(NETWORK_ID)).thenReturn(phyNtwkVO);
+ when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(new ArrayList<NuageVspDeviceVO>());
+
+ final ListNuageVspDevicesCmd cmd = mock(ListNuageVspDevicesCmd.class);
+ when(cmd.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(cmd.getNuageVspDeviceId()).thenReturn(null);
+ manager.listNuageVspDevices(cmd);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..db359b6
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/resource/NuageVspResourceTest.java
@@ -0,0 +1,252 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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 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;
+
+public class NuageVspResourceTest {
+ NuageVspResource _resource;
+ NuageVspApiClient _mockNuageVspApiClient = mock(NuageVspApiClient.class);
+ NuageVspElementClient _mockNuageVspElementClient = mock(NuageVspElementClient.class);
+ NuageVspGuruClient _mockNuageVspGuruClient = mock(NuageVspGuruClient.class);
+ NuageVspSyncClient _mockNuageVspSyncClient = mock(NuageVspSyncClient.class);
+ Map<String, Object> _parameters;
+
+ Answer<Object> genericAnswer = new Answer<Object>() {
+ public Object answer(InvocationOnMock invocation) {
+ return null;
+ }
+ };
+
+ @Before
+ public void setUp() throws Exception {
+ _resource = new NuageVspResource() {
+
+ @Override
+ protected void loadNuageClient() {
+ _isNuageVspClientLoaded = true;
+ _nuageVspApiClient = _mockNuageVspApiClient;
+ _nuageVspElementClient = _mockNuageVspElementClient;
+ _nuageVspGuruClient = _mockNuageVspGuruClient;
+ _nuageVspSyncClient = _mockNuageVspSyncClient;
+
+ }
+
+ protected void isNuageVspApiLoaded() throws Exception {
+ }
+
+ protected void isNuageVspGuruLoaded() throws Exception {
+ }
+
+ protected void isNuageVspElementLoaded() throws Exception {
+ }
+
+ protected void isNuageVspSyncLoaded() throws Exception {
+ }
+
+ protected void login() throws Exception {
+ }
+
+ };
+
+ _parameters = new HashMap<String, Object>();
+ _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");
+ }
+
+ @Test(expected = Exception.class)
+ public void resourceConfigureFailure() throws Exception {
+ _resource.configure("NuageVspResource", Collections.<String, Object> emptyMap());
+ }
+
+ @Test
+ public void resourceConfigure() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ assertTrue("nuagevsptestdevice".equals(_resource.getName()));
+ assertTrue(_resource.getType() == Host.Type.L2Networking);
+ }
+
+ @Test
+ public void testInitialization() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ StartupCommand[] sc = _resource.initialize();
+ assertTrue(sc.length == 1);
+ assertTrue("aaaaa-bbbbb-ccccc".equals(sc[0].getGuid()));
+ assertTrue("nuagevsptestdevice".equals(sc[0].getName()));
+ assertTrue("blublub".equals(sc[0].getDataCenter()));
+ }
+
+ @Test
+ public void testPingCommandStatus() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ PingCommand ping = _resource.getCurrentStatus(42);
+ assertTrue(ping != null);
+ assertTrue(ping.getHostId() == 42);
+ assertTrue(ping.getHostType() == Host.Type.L2Networking);
+ }
+
+ @Test
+ public void testImplementNetworkVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ ImplementNetworkVspCommand impNtwkCmd = new ImplementNetworkVspCommand("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName",
+ "networkAccountUuid", "networkName", "networkCidr", "networkGateway", "networkUuid", true, "vpcName", "vpcUuid", true, new ArrayList<String>());
+ doAnswer(genericAnswer).when(_mockNuageVspGuruClient).implement("networkDomainName", "networkDomainPath", "networkDomainUuid", "networkAccountName", "networkAccountUuid",
+ "networkName", "networkCidr", "networkGateway", "networkUuid", true, "vpcName", "vpcUuid", true, new ArrayList<String>());
+ ImplementNetworkVspAnswer implNtwkAns = (ImplementNetworkVspAnswer)_resource.executeRequest(impNtwkCmd);
+ assertTrue(implNtwkAns.getResult());
+ }
+
+ @Test
+ public void testReserveVmInterfaceVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ 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);
+ 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);
+
+ 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);
+ assertTrue(dellocateVmAns.getResult());
+ }
+
+ @Test
+ public void testTrashNetworkVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ TrashNetworkVspCommand trashNtwkCmd = new TrashNetworkVspCommand("domainUuid", "networkUuid", true, "vpcUuid");
+ doAnswer(genericAnswer).when(_mockNuageVspGuruClient).trash("domainUuid", "networkUuid", true, "vpcUuid");
+ TrashNetworkVspAnswer trashNtwkAns = (TrashNetworkVspAnswer)_resource.executeRequest(trashNtwkCmd);
+ assertTrue(trashNtwkAns.getResult());
+ }
+
+ @Test
+ public void testApplyStaticNatVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ ApplyStaticNatVspCommand applyNatCmd = new ApplyStaticNatVspCommand("networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>());
+ doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyStaticNats("networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>());
+ ApplyStaticNatVspAnswer applyNatAns = (ApplyStaticNatVspAnswer)_resource.executeRequest(applyNatCmd);
+ assertTrue(applyNatAns.getResult());
+ }
+
+ @Test
+ public void testApplyAclRuleVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ ApplyAclRuleVspCommand applyAclCmd = new ApplyAclRuleVspCommand("networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>(), false,
+ 100);
+ doAnswer(genericAnswer).when(_mockNuageVspElementClient).applyAclRules("networkUuid", "networkDomainUuid", "vpcOrSubnetUuid", true, new ArrayList<Map<String, Object>>(),
+ false, 100);
+ ApplyAclRuleVspAnswer applyAclAns = (ApplyAclRuleVspAnswer)_resource.executeRequest(applyAclCmd);
+ assertTrue(applyAclAns.getResult());
+ }
+
+ @Test
+ public void testShutDownVpcVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ ShutDownVpcVspCommand shutVpcCmd = new ShutDownVpcVspCommand("domainUuid", "vpcUuid");
+ doAnswer(genericAnswer).when(_mockNuageVspElementClient).shutDownVpc("domainUuid", "vpcUuid");
+ ShutDownVpcVspAnswer shutVpcAns = (ShutDownVpcVspAnswer)_resource.executeRequest(shutVpcCmd);
+ assertTrue(shutVpcAns.getResult());
+ }
+
+ @Test
+ public void testSyncVspCommand() throws Exception {
+ _resource.configure("NuageVspResource", _parameters);
+
+ SyncVspCommand shutVpcCmd = new SyncVspCommand("nuageVspEntity");
+ doAnswer(genericAnswer).when(_mockNuageVspSyncClient).syncWithNuageVsp("nuageVspEntity");
+ SyncVspAnswer shutVpcAns = (SyncVspAnswer)_resource.executeRequest(shutVpcCmd);
+ assertTrue(shutVpcAns.getResult());
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f9e503d
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/sync/NuageVspSyncTest.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.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.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;
+
+public class NuageVspSyncTest {
+ private static final long NETWORK_ID = 42L;
+ NuageVspDao nuageVspDao = mock(NuageVspDao.class);
+ AgentManager agentManager = mock(AgentManager.class);
+ HostDao hostDao = mock(HostDao.class);
+
+ NuageVspSyncImpl sync;
+
+ @Before
+ public void setUp() {
+ sync = new NuageVspSyncImpl();
+ sync._nuageVspDao = nuageVspDao;
+ sync._agentMgr = agentManager;
+ sync._hostDao = hostDao;
+ }
+
+ @Test
+ public void testSyncWithNuageVsp() {
+ final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class);
+ when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID);
+ when(nuageVspDevice.getId()).thenReturn(NETWORK_ID);
+ when(nuageVspDao.listAll()).thenReturn(Arrays.asList(new NuageVspDeviceVO[] {nuageVspDevice}));
+
+ final HostVO host = mock(HostVO.class);
+ when(host.getId()).thenReturn(NETWORK_ID);
+ when(hostDao.findById(NETWORK_ID)).thenReturn(host);
+
+ final SyncVspAnswer answer = mock(SyncVspAnswer.class);
+ when(answer.getResult()).thenReturn(true);
+ when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+
+ sync.syncWithNuageVsp("users");
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/pom.xml b/plugins/pom.xml
index 802e2ea..eff5a01 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -164,6 +164,17 @@
</modules>
</profile>
<profile>
+ <id>nuagevsp</id>
+ <activation>
+ <property>
+ <name>noredist</name>
+ </property>
+ </activation>
+ <modules>
+ <module>network-elements/nuage-vsp</module>
+ </modules>
+ </profile>
+ <profile>
<id>vmware</id>
<activation>
<property>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 51122e0..013da0b 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -2304,7 +2304,7 @@ public class ApiResponseHelper implements ResponseGenerator {
for (Network.Provider serviceProvider : serviceProviders) {
// return only Virtual Router/JuniperSRX/CiscoVnmc as a provider for the firewall
if (service == Service.Firewall
- && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.JuniperSRX || serviceProvider == Provider.CiscoVnmc || serviceProvider == Provider.PaloAlto)) {
+ && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.JuniperSRX || serviceProvider == Provider.CiscoVnmc || serviceProvider == Provider.PaloAlto || serviceProvider == Provider.NuageVsp)) {
continue;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 1940f48..42ac19f 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -4496,7 +4496,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override
public boolean isOfferingForVpc(NetworkOffering offering) {
boolean vpcProvider = _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.VPCVirtualRouter) ||
- _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.JuniperContrailVpcRouter);
+ _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(), Provider.JuniperContrailVpcRouter) ||
+ _ntwkOffServiceMapDao.getDistinctProviders(offering.getId()).contains(Provider.NuageVsp.getName());
return vpcProvider;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index c7237c1..9971bd5 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -207,7 +207,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
private final List<Service> nonSupportedServices = Arrays.asList(Service.SecurityGroup, Service.Firewall);
private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter,
Provider.NiciraNvp, Provider.InternalLbVm, Provider.Netscaler, Provider.JuniperContrailVpcRouter,
- Provider.Ovs);
+ Provider.Ovs, Provider.NuageVsp);
int _cleanupInterval;
int _maxNetworks;
@@ -320,6 +320,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
Set<Network.Provider> sdnProviders = new HashSet<Network.Provider>();
sdnProviders.add(Provider.NiciraNvp);
sdnProviders.add(Provider.JuniperContrailVpcRouter);
+ sdnProviders.add(Provider.NuageVsp);
boolean sourceNatSvc = false;
boolean firewallSvs = false;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/setup/db/db/schema-440to450.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-440to450.sql b/setup/db/db/schema-440to450.sql
index d047060..6cb81c6 100644
--- a/setup/db/db/schema-440to450.sql
+++ b/setup/db/db/schema-440to450.sql
@@ -63,6 +63,18 @@ CREATE VIEW `cloud`.`disk_offering_view` AS
where
disk_offering.state='ACTIVE';
+DROP TABLE IF EXISTS `cloud`.`external_nuage_vsp_devices`;
+CREATE TABLE `cloud`.`external_nuage_vsp_devices` (
+ `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
+ `uuid` varchar(255) UNIQUE,
+ `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which nuage vsp is added',
+ `provider_name` varchar(255) NOT NULL COMMENT 'the service provider name corresponding to this nuage vsp device',
+ `device_name` varchar(255) NOT NULL COMMENT 'the name of the nuage vsp device',
+ `host_id` bigint unsigned NOT NULL COMMENT 'host id corresponding to the external nuage vsp device',
+ PRIMARY KEY (`id`),
+ CONSTRAINT `fk_external_nuage_vsp_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE,
+ CONSTRAINT `fk_external_nuage_vsp_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP VIEW IF EXISTS `cloud`.`service_offering_view`;
CREATE VIEW `cloud`.`service_offering_view` AS
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/test/integration/component/test_nuage_vsp.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_nuage_vsp.py b/test/integration/component/test_nuage_vsp.py
new file mode 100644
index 0000000..143fe39
--- /dev/null
+++ b/test/integration/component/test_nuage_vsp.py
@@ -0,0 +1,312 @@
+# 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.
+
+""" P1 tests for NuageVsp network Plugin
+"""
+#Import Local Modules
+from nose.plugins.attrib import attr
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.cloudstackAPI import *
+from marvin.lib.utils import (cleanup_resources,
+ random_gen, validateList)
+from marvin.lib.base import (Account,
+ VirtualMachine,
+ PublicIPAddress,
+ LoadBalancerRule,
+ ServiceOffering,
+ NetworkOffering,
+ Host,
+ Network,
+ NATRule,
+ Configurations)
+from marvin.lib.common import (get_domain,
+ get_zone,
+ get_template)
+from marvin.sshClient import SshClient
+from marvin.codes import PASS
+import time
+
+
+class Services:
+ """Test NuageVsp plugin
+ """
+
+ def __init__(self):
+ self.services = {
+ "account": {
+ "email": "cloudstack@cloudmonkey.com",
+ "firstname": "cloudstack",
+ "lastname": "bob",
+ "username": "bobbuilder",
+ "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": 'XenServer',
+ "privateport": 22,
+ "publicport": 22,
+ "protocol": 'TCP',
+ },
+ "nuage_vsp_device": {
+ "hostname": '192.168.0.7',
+ "username": 'testusername',
+ "password": 'testpassword',
+ "port": '8443',
+ "apiversion": 'v1_0',
+ "retrycount": '4',
+ "retryinterval": '60'
+ },
+ #services supported by Nuage for isolated networks.
+ "network_offering": {
+ "name": 'nuage_marvin',
+ "displaytext": 'nuage_marvin',
+ "guestiptype": 'Isolated',
+ "supportedservices": 'Dhcp,SourceNat,Connectivity,StaticNat,UserData,Firewall',
+ "traffictype": 'GUEST',
+ "availability": 'Optional',
+ "serviceProviderList": {
+ "UserData": 'VirtualRouter',
+ "Dhcp" : 'NuageVsp',
+ "Connectivity" : 'NuageVsp',
+ "StaticNat" : 'NuageVsp',
+ "SourceNat" : 'NuageVsp',
+ "Firewall" : 'NuageVsp'
+ },
+ },
+ "network": {
+ "name": "nuage",
+ "displaytext": "nuage",
+ },
+ "ostype": 'CentOS 5.3 (64-bit)',
+ "sleep": 60,
+ "timeout": 10
+ }
+
+class TestNuageVsp(cloudstackTestCase):
+
+
+ @classmethod
+ def setUpClass(cls):
+ cls._cleanup = []
+ cls.testClient = super(TestNuageVsp, 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()
+ resp.zoneid = cls.zone.id
+ physical_networks = cls.api_client.listPhysicalNetworks(resp)
+ 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 isinstance(nw_service_providers, list):
+ nuage_provider = nw_service_providers[0]
+ else:
+ #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
+ nuage_provider = cls.api_client.addNetworkServiceProvider(resp_add_nsp)
+ 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.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)
+
+ cls.network_offering = NetworkOffering.create(
+ cls.api_client,
+ cls.services["network_offering"],
+ conservemode=True
+ )
+ 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 Exception ("Warning: Exception in setUpClass: %s" % e)
+ return
+
+ @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)
+ interval = Configurations.list(
+ self.apiclient,
+ name='network.gc.interval'
+ )
+ wait = Configurations.list(
+ self.apiclient,
+ name='network.gc.wait'
+ )
+ #time.sleep(int(interval[0].value) + int(wait[0].value))
+ self.debug("Cleanup complete!")
+ except Exception as e:
+ raise Exception("Warning: Exception during cleanup : %s" % e)
+ return
+
+
+ @attr(tags = ["advancedns"])
+ def test_network_vsp(self):
+ """Test nuage Network and VM Creation
+ """
+
+
+ self.debug("Creating network with network offering: %s" %
+ self.network_offering.id)
+ self.network = Network.create(
+ self.apiclient,
+ self.services["network"],
+ accountid=self.account.name,
+ domainid=self.account.domainid,
+ networkofferingid=self.network_offering.id,
+ zoneid=self.zone.id
+ )
+ self.debug("Created network with ID: %s" % self.network.id)
+
+ self.debug("Deploying VM in account: %s" % self.account.name)
+
+ virtual_machine_1 = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ accountid=self.account.name,
+ domainid=self.account.domainid,
+ serviceofferingid=self.service_offering.id,
+ networkids=[str(self.network.id)]
+ )
+ self.debug("Deployed VM in network: %s" % self.network.id)
+ list_vm_response = VirtualMachine.list(
+ self.apiclient,
+ id=virtual_machine_1.id
+ )
+
+ self.debug(
+ "Verify listVirtualMachines response for virtual machine: %s" \
+ % virtual_machine_1.id
+ )
+
+ self.assertEqual(
+ isinstance(list_vm_response, list),
+ True,
+ "Check list response returns a valid list"
+ )
+ vm_response = list_vm_response[0]
+
+ self.assertEqual(
+ vm_response.state,
+ "Running",
+ "VM state should be running after deployment"
+ )
+
+ self.debug("Deploying another VM in account: %s" %
+ self.account.name)
+
+ virtual_machine_2 = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ accountid=self.account.name,
+ domainid=self.account.domainid,
+ serviceofferingid=self.service_offering.id,
+ networkids=[str(self.network.id)]
+ )
+ self.debug("Deployed VM in network: %s" % self.network.id)
+ list_vm_response = VirtualMachine.list(
+ self.apiclient,
+ id=virtual_machine_2.id
+ )
+
+ self.debug(
+ "Verify listVirtualMachines response for virtual machine: %s" \
+ % virtual_machine_2.id
+ )
+
+ self.assertEqual(
+ isinstance(list_vm_response, list),
+ True,
+ "Check list response returns a valid list"
+ )
+ vm_response = list_vm_response[0]
+
+ self.assertEqual(
+ vm_response.state,
+ "Running",
+ "VM state should be running after deployment"
+ )
+
+ VirtualMachine.delete(virtual_machine_1, self.apiclient)
+
+ # Deleting a single VM
+ VirtualMachine.delete(virtual_machine_2, self.apiclient)
+
+ # Delete Network
+ Network.delete(self.network, self.apiclient)
+
+ return
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/tools/apidoc/gen_toc.py
----------------------------------------------------------------------
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index 827d6bf..bcc8417 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -133,6 +133,7 @@ known_categories = {
'Tags': 'Resource tags',
'NiciraNvpDevice': 'Nicira NVP',
'BigSwitchVnsDevice': 'BigSwitch VNS',
+ 'NuageVsp': 'Nuage VSP',
'AutoScale': 'AutoScale',
'Counter': 'AutoScale',
'Condition': 'AutoScale',
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/ui/dictionary.jsp
----------------------------------------------------------------------
diff --git a/ui/dictionary.jsp b/ui/dictionary.jsp
index e9d84de..c84d0dd 100644
--- a/ui/dictionary.jsp
+++ b/ui/dictionary.jsp
@@ -351,6 +351,7 @@ dictionary = {
'label.add.new.PA': '<fmt:message key="label.add.new.PA" />',
'label.add.new.tier': '<fmt:message key="label.add.new.tier" />',
'label.add.NiciraNvp.device': '<fmt:message key="label.add.NiciraNvp.device" />',
+'label.add.NuageVsp.device': '<fmt:message key="label.add.NuageVsp.device" />',
'label.add.pod': '<fmt:message key="label.add.pod" />',
'label.add.port.forwarding.rule': '<fmt:message key="label.add.port.forwarding.rule" />',
'label.add.primary.storage': '<fmt:message key="label.add.primary.storage" />',
@@ -399,6 +400,7 @@ dictionary = {
'label.anti.affinity.group': '<fmt:message key="label.anti.affinity.group" />',
'label.anti.affinity.groups': '<fmt:message key="label.anti.affinity.groups" />',
'label.api.key': '<fmt:message key="label.api.key" />',
+'label.api.version': '<fmt:message key="label.api.version" />',
'label.apply': '<fmt:message key="label.apply" />',
'label.assign': '<fmt:message key="label.assign" />',
'label.assign.to.load.balancer': '<fmt:message key="label.assign.to.load.balancer" />',
@@ -506,6 +508,7 @@ dictionary = {
'label.delete.gateway': '<fmt:message key="label.delete.gateway" />',
'label.delete.NetScaler': '<fmt:message key="label.delete.NetScaler" />',
'label.delete.NiciraNvp': '<fmt:message key="label.delete.NiciraNvp" />',
+'label.delete.NuageVsp': '<fmt:message key="label.delete.NuageVsp" />',
'label.delete.project': '<fmt:message key="label.delete.project" />',
'label.delete.SRX': '<fmt:message key="label.delete.SRX" />',
'label.delete.PA': '<fmt:message key="label.delete.PA" />',
@@ -998,6 +1001,7 @@ dictionary = {
'label.restart.required': '<fmt:message key="label.restart.required" />',
'label.restart.vpc': '<fmt:message key="label.restart.vpc" />',
'label.restore': '<fmt:message key="label.restore" />',
+'label.retry.interval': '<fmt:message key="label.retry.interval" />',
'label.review': '<fmt:message key="label.review" />',
'label.revoke.project.invite': '<fmt:message key="label.revoke.project.invite" />',
'label.role': '<fmt:message key="label.role" />',
@@ -1430,6 +1434,7 @@ dictionary = {
'message.confirm.action.force.reconnect': '<fmt:message key="message.confirm.action.force.reconnect" />',
'message.confirm.delete.F5': '<fmt:message key="message.confirm.delete.F5" />',
'message.confirm.delete.NetScaler': '<fmt:message key="message.confirm.delete.NetScaler" />',
+'message.confirm.delete.NuageVsp': '<fmt:message key="message.confirm.delete.NuageVsp" />',
'message.confirm.delete.SRX': '<fmt:message key="message.confirm.delete.SRX" />',
'message.confirm.delete.PA': '<fmt:message key="message.confirm.delete.PA" />',
'message.confirm.destroy.router': '<fmt:message key="message.confirm.destroy.router" />',
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/ui/scripts/configuration.js
----------------------------------------------------------------------
diff --git a/ui/scripts/configuration.js b/ui/scripts/configuration.js
index 9311e37..895f8e8 100644
--- a/ui/scripts/configuration.js
+++ b/ui/scripts/configuration.js
@@ -2176,7 +2176,7 @@
//p.s. Netscaler is supported in both vpc and non-vpc
if ($useVpc.is(':visible') && $useVpcCb.is(':checked')) { //*** vpc ***
$optionsOfProviders.each(function(index) {
- if ($(this).val() == 'InternalLbVm' || $(this).val() == 'VpcVirtualRouter' || $(this).val() == 'Netscaler') {
+ if ($(this).val() == 'InternalLbVm' || $(this).val() == 'VpcVirtualRouter' || $(this).val() == 'Netscaler' || $(this).val() == 'NuageVsp' || $(this).val() == 'NuageVspVpc') {
$(this).attr('disabled', false);
} else {
$(this).attr('disabled', true);
@@ -3456,7 +3456,9 @@
var networkServiceObjs = [];
networkServiceObjs.push({
name: 'Dhcp',
- provider: [{name: 'VpcVirtualRouter'}]
+ provider: [
+ {name: 'VpcVirtualRouter'},
+ {name: 'NuageVsp'}]
});
networkServiceObjs.push({
name: 'Dns',
@@ -3472,15 +3474,21 @@
});
networkServiceObjs.push({
name: 'StaticNat',
- provider: [{name: 'VpcVirtualRouter'}]
+ provider: [
+ {name: 'VpcVirtualRouter'},
+ {name: 'NuageVsp'}]
});
networkServiceObjs.push({
name: 'SourceNat',
- provider: [{name: 'VpcVirtualRouter'}]
+ provider: [
+ {name: 'VpcVirtualRouter'},
+ {name: 'NuageVsp'}]
});
networkServiceObjs.push({
name: 'NetworkACL',
- provider: [{name: 'VpcVirtualRouter'}]
+ provider: [
+ {name: 'VpcVirtualRouter'},
+ {name: 'NuageVsp'}]
});
networkServiceObjs.push({
name: 'PortForwarding',
@@ -3500,7 +3508,8 @@
provider: [
{name: 'NiciraNvp'},
{name: 'Ovs'},
- {name: 'JuniperContrailVpcRouter'}
+ {name: 'JuniperContrailVpcRouter'},
+ {name: 'NuageVsp'}
]
});
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/ui/scripts/docs.js
----------------------------------------------------------------------
diff --git a/ui/scripts/docs.js b/ui/scripts/docs.js
index 74a08bc..2075e30 100755
--- a/ui/scripts/docs.js
+++ b/ui/scripts/docs.js
@@ -1250,5 +1250,34 @@ cloudStack.docs = {
helpVpcOfferingDescription: {
desc: 'A short description of the offering that can be displayed to users',
externalLink: ''
+ },
+ // Add Nuage VSP
+ helpVspHostname: {
+ desc: 'The hostname/IP address of Nuage VSD',
+ externalLink: ''
+ },
+ helpVspUsername: {
+ desc: 'A name of the CMS user in Nuage VSD.',
+ externalLink: ''
+ },
+ helpVspPassword: {
+ desc: 'The password for the CMS user in Nuage VSD.',
+ externalLink: ''
+ },
+ helpVspPort: {
+ desc: 'The port to communicate with Nuage VSD. e.g. Unspecified/0 if using HAProxy for load balancing or 8443 if connecting directly to a VSD server.',
+ externalLink: ''
+ },
+ helpVspApiVersion: {
+ desc: 'The API version of Nuage VSD',
+ externalLink: ''
+ },
+ helpVspRetries: {
+ desc: 'Number of times to attempt a command on Nuage VSD before considering the operation failed. Valid values [1 - 10].',
+ externalLink: ''
+ },
+ helpVspRetryInterval: {
+ desc: 'The interval of time in milliseconds to wait on failure before attempting to resend the command to Nuage VSD. Valid values [0 - 10000].',
+ externalLink: ''
}
};
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index 9012580..502007f 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -6689,6 +6689,249 @@
}
}
},
+ // Nuage Vsp provider detail view
+ nuageVsp: {
+ type: 'detailView',
+ id: 'nuageVspProvider',
+ label: 'label.nuageVsp',
+ viewAll: {
+ label: 'label.devices',
+ path: '_zone.nuageVspDevices'
+ },
+ tabs: {
+ details: {
+ title: 'label.details',
+ fields: [{
+ name: {
+ label: 'label.name'
+ }
+ }, {
+ state: {
+ label: 'label.state'
+ }
+ }],
+ dataProvider: function(args) {
+ refreshNspData("NuageVsp");
+ var providerObj;
+ $(nspHardcodingArray).each(function() {
+ if (this.id == "nuageVsp") {
+ providerObj = this;
+ return false; //break each loop
+ }
+ });
+ args.response.success({
+ data: providerObj,
+ actionFilter: networkProviderActionFilter('nuageVsp')
+ });
+ }
+ }
+ },
+ actions: {
+ add: {
+ label: 'label.add.NuageVsp.device',
+ createForm: {
+ title: 'label.add.NuageVsp.device',
+ preFilter: function(args) {},
+ fields: {
+ hostname: {
+ label: 'label.host.name',
+ validation: {
+ required: true
+ },
+ docID: 'helpVspHostname'
+ },
+ username: {
+ label: 'label.username',
+ validation: {
+ required: true
+ },
+ docID: 'helpVspUsername'
+ },
+ password: {
+ label: 'label.password',
+ isPassword: true,
+ validation: {
+ required: true
+ },
+ docID: 'helpVspPassword'
+ },
+ port: {
+ label: 'label.port',
+ validation: {
+ required: false,
+ number: true
+ },
+ docID: 'helpVspPort'
+ },
+ apiversion: {
+ label: 'label.api.version',
+ defaultValue: 'v1_0',
+ validation: {
+ required: true
+ },
+ docID: 'helpVspApiVersion'
+ },
+ retrycount: {
+ label: 'label.numretries',
+ defaultValue: '4',
+ validation: {
+ required: true,
+ number: true
+ },
+ docID: 'helpVspRetries'
+ },
+ retryinterval: {
+ label: 'label.retry.interval',
+ defaultValue: '60',
+ validation: {
+ required: false,
+ number: true
+ },
+ docID: 'helpVspRetryInterval'
+ }
+ }
+ },
+ action: function(args) {
+ if (nspMap["nuageVsp"] == null) {
+ $.ajax({
+ url: createURL("addNetworkServiceProvider&name=NuageVsp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
+ dataType: "json",
+ async: true,
+ success: function(json) {
+ var jobId = json.addnetworkserviceproviderresponse.jobid;
+ var addNuageVspProviderIntervalID = setInterval(function() {
+ $.ajax({
+ url: createURL("queryAsyncJobResult&jobId=" + jobId),
+ dataType: "json",
+ success: function(json) {
+ var result = json.queryasyncjobresultresponse;
+ if (result.jobstatus == 0) {
+ return; //Job has not completed
+ } else {
+ clearInterval(addNuageVspProviderIntervalID);
+ if (result.jobstatus == 1) {
+ nspMap["nuageVsp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
+ addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
+ } else if (result.jobstatus == 2) {
+ alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + _s(result.jobresult.errortext));
+ }
+ }
+ },
+ error: function(XMLHttpResponse) {
+ var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
+ alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + errorMsg);
+ }
+ });
+ }, g_queryAsyncJobResultInterval);
+ }
+ });
+ } else {
+ addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
+ }
+ },
+ messages: {
+ notification: function(args) {
+ return 'label.add.NuageVsp.device';
+ }
+ },
+ notification: {
+ poll: pollAsyncJobResult
+ }
+ },
+ enable: {
+ label: 'label.enable.provider',
+ action: function(args) {
+ $.ajax({
+ url: createURL("updateNetworkServiceProvider&id=" + nspMap["nuageVsp"].id + "&state=Enabled"),
+ dataType: "json",
+ success: function(json) {
+ var jid = json.updatenetworkserviceproviderresponse.jobid;
+ args.response.success({
+ _custom: {
+ jobId: jid,
+ getUpdatedItem: function(json) {
+ $(window).trigger('cloudStack.fullRefresh');
+ }
+ }
+ });
+ }
+ });
+ },
+ messages: {
+ confirm: function(args) {
+ return 'message.confirm.enable.provider';
+ },
+ notification: function() {
+ return 'label.enable.provider';
+ }
+ },
+ notification: {
+ poll: pollAsyncJobResult
+ }
+ },
+ disable: {
+ label: 'label.disable.provider',
+ action: function(args) {
+ $.ajax({
+ url: createURL("updateNetworkServiceProvider&id=" + nspMap["nuageVsp"].id + "&state=Disabled"),
+ dataType: "json",
+ success: function(json) {
+ var jid = json.updatenetworkserviceproviderresponse.jobid;
+ args.response.success({
+ _custom: {
+ jobId: jid,
+ getUpdatedItem: function(json) {
+ $(window).trigger('cloudStack.fullRefresh');
+ }
+ }
+ });
+ }
+ });
+ },
+ messages: {
+ confirm: function(args) {
+ return 'message.confirm.disable.provider';
+ },
+ notification: function() {
+ return 'label.disable.provider';
+ }
+ },
+ notification: {
+ poll: pollAsyncJobResult
+ }
+ },
+ destroy: {
+ label: 'label.shutdown.provider',
+ action: function(args) {
+ $.ajax({
+ url: createURL("deleteNetworkServiceProvider&id=" + nspMap["nuageVsp"].id),
+ dataType: "json",
+ success: function(json) {
+ var jid = json.deletenetworkserviceproviderresponse.jobid;
+ args.response.success({
+ _custom: {
+ jobId: jid
+ }
+ });
+
+ $(window).trigger('cloudStack.fullRefresh');
+ }
+ });
+ },
+ messages: {
+ confirm: function(args) {
+ return 'message.confirm.shutdown.provider';
+ },
+ notification: function(args) {
+ return 'label.shutdown.provider';
+ }
+ },
+ notification: {
+ poll: pollAsyncJobResult
+ }
+ }
+ }
+ },
Opendaylight: {
type: 'detailView',
id: 'openDaylightProvider',
@@ -11953,6 +12196,202 @@
}
}
},
+ nuageVspDevices: {
+ id: 'nuageVspDevices',
+ title: 'label.devices',
+ listView: {
+ id: 'nuageVspDevices',
+ fields: {
+ hostname: {
+ label: 'label.host.name'
+ },
+ port: {
+ label: 'label.port'
+ },
+ apiversion: {
+ label: 'label.api.version'
+ },
+ retrycount: {
+ label: 'label.numretries',
+ },
+ retryinterval: {
+ label: 'label.retry.interval'
+ }
+ },
+ actions: {
+ add: {
+ label: 'label.add.NuageVsp.device',
+ createForm: {
+ title: 'label.add.NuageVsp.device',
+ preFilter: function(args) {},
+ fields: {
+ hostname: {
+ label: 'label.host.name'
+ },
+ username: {
+ label: 'label.username'
+ },
+ password: {
+ label: 'label.password',
+ isPassword: true
+ },
+ port: {
+ label: 'label.port'
+ },
+ apiversion: {
+ label: 'label.api.version',
+ defaultValue: 'v1_0'
+ },
+ retrycount: {
+ label: 'label.numretries',
+ defaultValue: '4'
+ },
+ retryinterval: {
+ label: 'label.retry.interval',
+ defaultValue: '60'
+ }
+ }
+ },
+ action: function(args) {
+ if (nspMap["nuageVsp"] == null) {
+ $.ajax({
+ url: createURL("addNetworkServiceProvider&name=NuageVsp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
+ dataType: "json",
+ async: true,
+ success: function(json) {
+ var jobId = json.addnetworkserviceproviderresponse.jobid;
+ var addNuageVspProviderIntervalID = setInterval(function() {
+ $.ajax({
+ url: createURL("queryAsyncJobResult&jobId=" + jobId),
+ dataType: "json",
+ success: function(json) {
+ var result = json.queryasyncjobresultresponse;
+ if (result.jobstatus == 0) {
+ return;
+ } else {
+ clearInterval(addNuageVspProviderIntervalID);
+ if (result.jobstatus == 1) {
+ nspMap["nuageVsp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
+ addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
+ } else if (result.jobstatus == 2) {
+ alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + _s(result.jobresult.errortext));
+ }
+ }
+ },
+ error: function(XMLHttpResponse) {
+ var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
+ alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + errorMsg);
+ }
+ });
+ }, g_queryAsyncJobResultInterval);
+ }
+ });
+ } else {
+ addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
+ }
+ },
+
+ messages: {
+ notification: function(args) {
+ return 'Added new Nuage Vsp Controller';
+ }
+ },
+ notification: {
+ poll: pollAsyncJobResult
+ }
+ }
+ },
+ dataProvider: function(args) {
+ $.ajax({
+ url: createURL("listNuageVspDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
+ data: {
+ page: args.page,
+ pageSize: pageSize
+ },
+ dataType: "json",
+ async: false,
+ success: function(json) {
+ var items = json.listnuagevspdeviceresponse.nuagevspdevice;
+ args.response.success({
+ data: items
+ });
+ }
+ });
+ },
+ detailView: {
+ name: 'Nuage Vsp details',
+ actions: {
+ 'remove': {
+ label: 'label.delete.NuageVsp',
+ messages: {
+ confirm: function(args) {
+ return 'message.confirm.delete.NuageVsp';
+ },
+ notification: function(args) {
+ return 'label.delete.NuageVsp';
+ }
+ },
+ action: function(args) {
+ $.ajax({
+ url: createURL("deleteNuageVspDevice&vspdeviceid=" + args.context.nuageVspDevices[0].vspdeviceid),
+ dataType: "json",
+ async: true,
+ success: function(json) {
+ var jid = json.deletenuagevspdeviceresponse.jobid;
+ args.response.success({
+ _custom: {
+ jobId: jid
+ }
+ });
+ }
+ });
+ },
+ notification: {
+ poll: pollAsyncJobResult
+ }
+ }
+ },
+ tabs: {
+ details: {
+ title: 'label.details',
+ fields: [{
+ vspdeviceid: {
+ label: 'label.id'
+ },
+ hostname: {
+ label: 'label.host.name'
+ },
+ port: {
+ label: 'label.port'
+ },
+ apiversion: {
+ label: 'label.api.version'
+ },
+ retrycount: {
+ label: 'label.numretries',
+ },
+ retryinterval: {
+ label: 'label.retry.interval'
+ }
+ }],
+ dataProvider: function(args) {
+ $.ajax({
+ url: createURL("listNuageVspDevices&vspdeviceid=" + args.context.nuageVspDevices[0].vspdeviceid),
+ dataType: "json",
+ async: true,
+ success: function(json) {
+ var item = json.listnuagevspdeviceresponse.nuagevspdevice[0];
+ args.response.success({
+ data: item
+ });
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+ },
pods: {
title: 'label.pods',
listView: {
@@ -18817,8 +19256,39 @@
});
}
- var afterCreateZonePhysicalNetworkTrafficTypes = function (args, newZoneObj, newPhysicalnetwork) {
+ function addNuageVspDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
+ var array1 = [];
+ array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
+ array1.push("&hostname=" + todb(args.data.hostname));
+ array1.push("&username=" + todb(args.data.username));
+ array1.push("&password=" + todb(args.data.password));
+ array1.push("&port=" + todb(args.data.port));
+ array1.push("&apiversion=" + todb(args.data.apiversion));
+ array1.push("&retrycount=" + todb(args.data.retrycount));
+ array1.push("&retryinterval=" + todb(args.data.retryinterval));
+
$.ajax({
+ url: createURL(apiCmd + array1.join("")),
+ dataType: "json",
+ type: "POST",
+ success: function(json) {
+ var jid = json[apiCmdRes].jobid;
+ args.response.success({
+ _custom: {
+ jobId: jid,
+ getUpdatedItem: function(json) {
+ var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
+
+ return item;
+ }
+ }
+ });
+ }
+ });
+ }
+
+ var afterCreateZonePhysicalNetworkTrafficTypes = function (args, newZoneObj, newPhysicalnetwork) {
+ $.ajax({
url: createURL("updatePhysicalNetwork&state=Enabled&id=" + newPhysicalnetwork.id),
dataType: "json",
success: function (json) {
@@ -19495,6 +19965,9 @@
case "Opendaylight":
nspMap[ "Opendaylight"] = items[i];
break;
+ case "NuageVsp":
+ nspMap["nuageVsp"] = items[i];
+ break;
}
}
}
@@ -19560,6 +20033,12 @@
name: 'MidoNet',
state: nspMap.midoNet ? nspMap.midoNet.state: 'Disabled'
});
+
+ nspHardcodingArray.push({
+ id: 'nuageVsp',
+ name: 'Nuage Vsp',
+ state: nspMap.nuageVsp ? nspMap.nuageVsp.state : 'Disabled'
+ });
nspHardcodingArray.push({
id: 'InternalLbVm',
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/ui/scripts/ui-custom/zoneWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui-custom/zoneWizard.js b/ui/scripts/ui-custom/zoneWizard.js
index 4091c03..645c2b1 100644
--- a/ui/scripts/ui-custom/zoneWizard.js
+++ b/ui/scripts/ui-custom/zoneWizard.js
@@ -726,7 +726,10 @@
}).html('ODL'),
$('<option>').attr({
value: 'L3VPN'
- }).html('L3VPN')
+ }).html('L3VPN'),
+ $('<option>').attr({
+ value: 'VSP'
+ }).html('VSP')
)
)
);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index dd55439..f48f25f 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -27,6 +27,22 @@ import java.util.Map;
import org.apache.log4j.Logger;
+import com.cloud.exception.CloudException;
+import com.cloud.hypervisor.vmware.util.VmwareContext;
+import com.cloud.hypervisor.vmware.util.VmwareHelper;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.utils.ActionDelegate;
+import com.cloud.utils.Pair;
+import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper;
+import com.cloud.utils.cisco.n1kv.vsm.PolicyMap;
+import com.cloud.utils.cisco.n1kv.vsm.PortProfile;
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.BindingType;
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.OperationType;
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.PortProfileType;
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.SwitchPortMode;
+import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
import com.vmware.vim25.AlreadyExistsFaultMsg;
import com.vmware.vim25.BoolPolicy;
import com.vmware.vim25.CustomFieldStringValue;
@@ -54,6 +70,7 @@ import com.vmware.vim25.OvfCreateImportSpecResult;
import com.vmware.vim25.OvfFileItem;
import com.vmware.vim25.VMwareDVSConfigSpec;
import com.vmware.vim25.VMwareDVSPortSetting;
+import com.vmware.vim25.VMwareDVSPortgroupPolicy;
import com.vmware.vim25.VMwareDVSPvlanConfigSpec;
import com.vmware.vim25.VMwareDVSPvlanMapEntry;
import com.vmware.vim25.VirtualDeviceConfigSpec;
@@ -68,23 +85,6 @@ import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec;
import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec;
import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanSpec;
-import com.cloud.exception.CloudException;
-import com.cloud.hypervisor.vmware.util.VmwareContext;
-import com.cloud.hypervisor.vmware.util.VmwareHelper;
-import com.cloud.network.Networks.BroadcastDomainType;
-import com.cloud.utils.ActionDelegate;
-import com.cloud.utils.Pair;
-import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper;
-import com.cloud.utils.cisco.n1kv.vsm.PolicyMap;
-import com.cloud.utils.cisco.n1kv.vsm.PortProfile;
-import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.BindingType;
-import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.OperationType;
-import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.PortProfileType;
-import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.SwitchPortMode;
-import com.cloud.utils.db.GlobalLock;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.net.NetUtils;
-
public class HypervisorHostHelper {
private static final Logger s_logger = Logger.getLogger(HypervisorHostHelper.class);
private static final int DEFAULT_LOCK_TIMEOUT_SECONDS = 600;
@@ -458,7 +458,7 @@ public class HypervisorHostHelper {
*/
BroadcastDomainType[] supportedBroadcastTypes =
new BroadcastDomainType[] {BroadcastDomainType.Lswitch, BroadcastDomainType.LinkLocal, BroadcastDomainType.Native, BroadcastDomainType.Pvlan,
- BroadcastDomainType.Storage, BroadcastDomainType.UnDecided, BroadcastDomainType.Vlan};
+ BroadcastDomainType.Storage, BroadcastDomainType.UnDecided, BroadcastDomainType.Vlan, BroadcastDomainType.Vsp};
if (!Arrays.asList(supportedBroadcastTypes).contains(broadcastDomainType)) {
throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType + " it not supported on a VMWare hypervisor at this time.");
@@ -529,8 +529,16 @@ public class HypervisorHostHelper {
setupPVlanPair(dvSwitchMo, morDvSwitch, vid, spvlanid);
}
+ VMwareDVSPortgroupPolicy portGroupPolicy = null;
+ if (broadcastDomainType == BroadcastDomainType.Vsp) {
+ //If the broadcastDomainType is Vsp, then set the VMwareDVSPortgroupPolicy
+ portGroupPolicy = new VMwareDVSPortgroupPolicy();
+ portGroupPolicy.setVlanOverrideAllowed(true);
+ portGroupPolicy.setBlockOverrideAllowed(true);
+ portGroupPolicy.setPortConfigResetAtDisconnect(true);
+ }
// Next, create the port group. For this, we need to create a VLAN spec.
- createPortGroup(physicalNetwork, networkName, vid, spvlanid, dataCenterMo, shapingPolicy, secPolicy, dvSwitchMo, numPorts, autoExpandSupported);
+ createPortGroup(physicalNetwork, networkName, vid, spvlanid, dataCenterMo, shapingPolicy, secPolicy, portGroupPolicy, dvSwitchMo, numPorts, autoExpandSupported);
bWaitPortGroupReady = true;
}
} else if (vSwitchType == VirtualSwitchType.NexusDistributedVirtualSwitch) {
@@ -664,7 +672,7 @@ public class HypervisorHostHelper {
}
private static void createPortGroup(String physicalNetwork, String networkName, Integer vid, Integer spvlanid, DatacenterMO dataCenterMo,
- DVSTrafficShapingPolicy shapingPolicy, DVSSecurityPolicy secPolicy, DistributedVirtualSwitchMO dvSwitchMo, int numPorts, boolean autoExpandSupported)
+ DVSTrafficShapingPolicy shapingPolicy, DVSSecurityPolicy secPolicy, VMwareDVSPortgroupPolicy portGroupPolicy, DistributedVirtualSwitchMO dvSwitchMo, int numPorts, boolean autoExpandSupported)
throws Exception {
VmwareDistributedVirtualSwitchVlanSpec vlanSpec = null;
VmwareDistributedVirtualSwitchPvlanSpec pvlanSpec = null;
@@ -690,6 +698,10 @@ public class HypervisorHostHelper {
}
dvPortGroupSpec = createDvPortGroupSpec(networkName, dvsPortSetting, numPorts, autoExpandSupported);
+ if (portGroupPolicy != null)
+ {
+ dvPortGroupSpec.setPolicy(portGroupPolicy);
+ }
if (!dataCenterMo.hasDvPortGroup(networkName)) {
s_logger.info("Distributed Virtual Port group " + networkName + " not found.");
@@ -888,7 +900,7 @@ public class HypervisorHostHelper {
*/
BroadcastDomainType[] supportedBroadcastTypes =
new BroadcastDomainType[] {BroadcastDomainType.Lswitch, BroadcastDomainType.LinkLocal, BroadcastDomainType.Native, BroadcastDomainType.Pvlan,
- BroadcastDomainType.Storage, BroadcastDomainType.UnDecided, BroadcastDomainType.Vlan};
+ BroadcastDomainType.Storage, BroadcastDomainType.UnDecided, BroadcastDomainType.Vlan, BroadcastDomainType.Vsp};
if (!Arrays.asList(supportedBroadcastTypes).contains(broadcastDomainType)) {
throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType + " it not supported on a VMWare hypervisor at this time.");
[3/4] CLOUDSTACK-6845 : NuageVsp Network plugin
Posted by hu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..ae81c84
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/DeleteNuageVspDeviceCmd.java
@@ -0,0 +1,105 @@
+//
+// 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 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;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.manager.NuageVspManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "deleteNuageVspDevice", responseObject = SuccessResponse.class, description = "delete a nuage vsp device")
+public class DeleteNuageVspDeviceCmd extends BaseAsyncCmd {
+ private static final String s_name = "deletenuagevspdeviceresponse";
+ @Inject
+ NuageVspManager _nuageVspManager;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name = VspConstants.NUAGE_VSP_DEVICE_ID, type = CommandType.UUID, entityType = NuageVspDeviceResponse.class, required = true, description = "Nuage device ID")
+ private Long nuageVspDeviceId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getNuageVspDeviceId() {
+ return nuageVspDeviceId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+ try {
+ boolean result = _nuageVspManager.deleteNuageVspDevice(this);
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Nuage device.");
+ }
+ } 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_DELETE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "Deleting Nuage VSD";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f0e3ff8
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/IssueNuageVspResourceRequestCmd.java
@@ -0,0 +1,215 @@
+//
+// 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 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;
+import com.cloud.api.response.NuageVspResourceResponse;
+import com.cloud.domain.dao.DomainDao;
+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.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.network.dao.NuageVspDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+
+@APICommand(name = "issueNuageVspResourceRequest", responseObject = NuageVspResourceResponse.class, description = "Issues a Nuage VSP REST API resource request")
+public class IssueNuageVspResourceRequestCmd extends BaseCmd {
+ private static final Logger s_logger = Logger.getLogger(IssueNuageVspResourceRequestCmd.class.getName());
+ private static final String s_name = "nuagevspresourceresponse";
+
+ @Inject
+ protected AccountManager _accountMgr;
+ @Inject
+ protected DomainDao _domainDao;
+ @Inject
+ protected NuageVspDao _nuageConfigDao;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ AgentManager _agentMgr;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.NETWORK_OFFERING_ID, type = CommandType.UUID, entityType = NetworkOfferingResponse.class, required = true, description = "the network offering id")
+ private Long networkOfferingId;
+
+ @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the Zone ID for the network")
+ private Long zoneId;
+
+ @Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = CommandType.UUID, entityType = PhysicalNetworkResponse.class, description = "the ID of the physical network in to which Nuage VSP Controller is added")
+ private Long physicalNetworkId;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_METHOD, type = CommandType.STRING, required = true, description = "the Nuage VSP REST API method type")
+ private String method;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_RESOURCE, type = CommandType.STRING, required = true, description = "the resource in Nuage VSP")
+ private String resource;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_RESOURCE_ID, type = CommandType.STRING, description = "the ID of the resource in Nuage VSP")
+ private String resourceId;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_CHILD_RESOURCE, type = CommandType.STRING, description = "the child resource in Nuage VSP")
+ private String childResource;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_RESOURCE_FILTER, type = CommandType.STRING, description = "the resource filter in Nuage VSP")
+ private String resourceFilter;
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getNetworkOfferingId() {
+ return networkOfferingId;
+ }
+
+ public Long getZoneId() {
+ Long physicalNetworkId = getPhysicalNetworkId();
+
+ if (physicalNetworkId == null && zoneId == null) {
+ throw new InvalidParameterValueException("Zone id is required");
+ }
+
+ return zoneId;
+ }
+
+ public Long getPhysicalNetworkId() {
+ if (physicalNetworkId != null) {
+ return physicalNetworkId;
+ }
+
+ NetworkOffering offering = _entityMgr.findById(NetworkOffering.class, networkOfferingId);
+ if (offering == null) {
+ throw new InvalidParameterValueException("Unable to find network offering by id " + networkOfferingId);
+ }
+
+ if (zoneId == null) {
+ throw new InvalidParameterValueException("ZoneId is required as physicalNetworkId is null");
+ }
+ return _networkService.findPhysicalNetworkId(zoneId, offering.getTags(), offering.getTrafficType());
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public String getResource() {
+ return resource;
+ }
+
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+
+ public String getResourceId() {
+ return resourceId;
+ }
+
+ public void setResourceId(String resourceId) {
+ this.resourceId = resourceId;
+ }
+
+ public String getChildResource() {
+ return childResource;
+ }
+
+ public void setChildResource(String childResource) {
+ this.childResource = childResource;
+ }
+
+ public String getResourceFilter() {
+ return resourceFilter;
+ }
+
+ public void setResourceFilter(String resourceFilter) {
+ this.resourceFilter = resourceFilter;
+ }
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+ long accountId = CallContext.current().getCallingAccount().getAccountId();
+ Account account = _accountMgr.getAccount(accountId);
+
+ List<NuageVspDeviceVO> nuageVspDevices = _nuageConfigDao.listByPhysicalNetwork(getPhysicalNetworkId());
+ if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) {
+ NuageVspDeviceVO config = nuageVspDevices.iterator().next();
+ HostVO nuageVspHost = _hostDao.findById(config.getHostId());
+ VspResourceCommand cmd = new VspResourceCommand(method, resource, resourceId, childResource, null, resourceFilter, null, null);
+ VspResourceAnswer answer = (VspResourceAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
+ if (answer == null || !answer.getResult()) {
+ s_logger.error("VspResourceCommand failed");
+ if ((null != answer) && (null != answer.getDetails())) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, answer.getDetails());
+ }
+ } else {
+ NuageVspResourceResponse response = new NuageVspResourceResponse();
+ response.setResourceInfo(StringUtils.isBlank(answer.getResourceInfo()) ? "" : answer.getResourceInfo());
+ response.setObjectName("nuagevspresource");
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ }
+ } else {
+ String errorMessage = "No Nuage VSP Controller configured on physical network " + getPhysicalNetworkId();
+ s_logger.error(errorMessage);
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, errorMessage);
+ }
+ }
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ return CallContext.current().getCallingAccount().getId();
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..46797e0
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDevicesCmd.java
@@ -0,0 +1,107 @@
+//
+// 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 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;
+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;
+
+@APICommand(name = "listNuageVspDevices", responseObject = NuageVspDeviceResponse.class, description = "Lists Nuage VSP devices")
+public class ListNuageVspDevicesCmd extends BaseListCmd {
+ private static final String s_name = "listnuagevspdeviceresponse";
+ @Inject
+ NuageVspManager _nuageVspManager;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = CommandType.UUID, entityType = PhysicalNetworkResponse.class, description = "the Physical Network ID")
+ private Long physicalNetworkId;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_DEVICE_ID, type = CommandType.UUID, entityType = NuageVspDeviceResponse.class, description = "the Nuage VSP device ID")
+ private Long nuageVspDeviceId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getNuageVspDeviceId() {
+ return nuageVspDeviceId;
+ }
+
+ public Long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+ try {
+ List<NuageVspDeviceVO> nuageDevices = _nuageVspManager.listNuageVspDevices(this);
+ ListResponse<NuageVspDeviceResponse> response = new ListResponse<NuageVspDeviceResponse>();
+ List<NuageVspDeviceResponse> nuageDevicesResponse = new ArrayList<NuageVspDeviceResponse>();
+
+ if (nuageDevices != null && !nuageDevices.isEmpty()) {
+ for (NuageVspDeviceVO nuageDeviceVO : nuageDevices) {
+ NuageVspDeviceResponse nuageDeviceResponse = _nuageVspManager.createNuageVspDeviceResponse(nuageDeviceVO);
+ nuageDevicesResponse.add(nuageDeviceResponse);
+ }
+ }
+
+ response.setResponses(nuageDevicesResponse);
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ } 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;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/VspConstants.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/VspConstants.java b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/VspConstants.java
new file mode 100644
index 0000000..2372890
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/VspConstants.java
@@ -0,0 +1,35 @@
+//
+// 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;
+
+public class VspConstants {
+ public static final String NUAGE_VSP_DEVICE_ID = "vspdeviceid";
+ public static final String NUAGE_VSP_DEVICE_NAME = "nuagedevicename";
+ public static final String NUAGE_VSP_API_PORT = "port";
+ public static final String NUAGE_VSP_API_VERSION = "apiversion";
+ public static final String NUAGE_VSP_API_RETRY_COUNT = "retrycount";
+ public static final String NUAGE_VSP_API_RETRY_INTERVAL = "retryinterval";
+ public static final String NUAGE_VSP_API_METHOD = "method";
+ public static final String NUAGE_VSP_API_RESOURCE = "resource";
+ public static final String NUAGE_VSP_API_RESOURCE_ID = "resourceid";
+ public static final String NUAGE_VSP_API_CHILD_RESOURCE = "childresource";
+ public static final String NUAGE_VSP_API_RESOURCE_FILTER = "resourcefilter";
+ public static final String NUAGE_VSP_API_RESOURCE_INFO = "resourceinfo";
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..b0bbcc8
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspDeviceResponse.java
@@ -0,0 +1,105 @@
+//
+// 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.response;
+
+import com.cloud.api.commands.VspConstants;
+import com.cloud.network.NuageVspDeviceVO;
+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)
+ @Param(description = "the device id of the Nuage VSD")
+ private String id;
+
+ @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID)
+ @Param(description = "the ID of the physical network to which this Nuage VSP belongs to")
+ private String physicalNetworkId;
+
+ @SerializedName(ApiConstants.PROVIDER)
+ @Param(description = "the service provider name corresponding to this Nuage VSP device")
+ private String providerName;
+
+ @SerializedName(VspConstants.NUAGE_VSP_DEVICE_NAME)
+ @Param(description = "the name of the Nuage VSP device")
+ private String deviceName;
+
+ @SerializedName(VspConstants.NUAGE_VSP_API_PORT)
+ @Param(description = "the port to communicate to Nuage VSD")
+ private int port;
+
+ @SerializedName(ApiConstants.HOST_NAME)
+ @Param(description = "the hostname of the Nuage VSD")
+ private String hostName;
+
+ @SerializedName(VspConstants.NUAGE_VSP_API_VERSION)
+ @Param(description = "the version of the API to use to communicate to Nuage VSD")
+ private String apiVersion;
+
+ @SerializedName(VspConstants.NUAGE_VSP_API_RETRY_COUNT)
+ @Param(description = "the number of retries on failure to communicate to Nuage VSD")
+ private int apiRetryCount;
+
+ @SerializedName(VspConstants.NUAGE_VSP_API_RETRY_INTERVAL)
+ @Param(description = "the time to wait after failure before retrying to communicate to Nuage VSD")
+ private long apiRetryInterval;
+
+ public void setId(String vspDetailsId) {
+ this.id = vspDetailsId;
+ }
+
+ public void setPhysicalNetworkId(String physicalNetworkId) {
+ this.physicalNetworkId = physicalNetworkId;
+ }
+
+ public void setProviderName(String providerName) {
+ this.providerName = providerName;
+ }
+
+ public void setDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public void setHostName(String hostName) {
+ this.hostName = hostName;
+ }
+
+ public void setApiVersion(String apiVersion) {
+ this.apiVersion = apiVersion;
+ }
+
+ public void setApiRetryCount(int apiRetryCount) {
+ this.apiRetryCount = apiRetryCount;
+ }
+
+ public void setApiRetryInterval(long apiRetryInterval) {
+ this.apiRetryInterval = apiRetryInterval;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..8e620ed
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/response/NuageVspResourceResponse.java
@@ -0,0 +1,41 @@
+//
+// 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.response;
+
+import com.cloud.api.commands.VspConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+public class NuageVspResourceResponse extends BaseResponse {
+ @SerializedName(VspConstants.NUAGE_VSP_API_RESOURCE_INFO)
+ @Param(description = "the details of the Nuage VSP resource")
+ private String resourceInfo;
+
+ public String getResourceInfo() {
+ return resourceInfo;
+ }
+
+ public void setResourceInfo(String resourceInfo) {
+ this.resourceInfo = resourceInfo;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..00cb1e4
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/NuageVspDeviceVO.java
@@ -0,0 +1,98 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network;
+
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+@Entity
+@Table(name = "external_nuage_vsp_devices")
+public class NuageVspDeviceVO implements InternalIdentity {
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private long id;
+
+ @Column(name = "uuid")
+ private String uuid;
+
+ @Column(name = "host_id")
+ private long hostId;
+
+ @Column(name = "physical_network_id")
+ private long physicalNetworkId;
+
+ @Column(name = "provider_name")
+ private String providerName;
+
+ @Column(name = "device_name")
+ private String deviceName;
+
+ public NuageVspDeviceVO() {
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ public NuageVspDeviceVO(long hostId, long physicalNetworkId,
+ String providerName, String deviceName){
+ super();
+ this.hostId = hostId;
+ this.physicalNetworkId = physicalNetworkId;
+ this.providerName = providerName;
+ this.deviceName = deviceName;
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public long getHostId() {
+ return hostId;
+ }
+
+ public long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ public String getProviderName() {
+ return providerName;
+ }
+
+ public String getDeviceName() {
+ return deviceName;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..6cf7e1a
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDao.java
@@ -0,0 +1,36 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.dao;
+
+import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.utils.db.GenericDao;
+
+import java.util.List;
+
+public interface NuageVspDao extends GenericDao<NuageVspDeviceVO, Long> {
+ /**
+ * List all the Nuage Vsp devices added in to this physical network
+ *
+ * @param physicalNetworkId physical Network Id
+ * @return list of NuageVspDeviceVO for this physical network.
+ */
+ List<NuageVspDeviceVO> listByPhysicalNetwork(long physicalNetworkId);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..bc55f43
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/dao/NuageVspDaoImpl.java
@@ -0,0 +1,52 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.dao;
+
+import javax.ejb.Local;
+
+import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.db.GenericDaoBase;
+
+import java.util.List;
+
+@Component
+@Local(value = NuageVspDao.class)
+public class NuageVspDaoImpl extends GenericDaoBase<NuageVspDeviceVO, Long>
+ implements NuageVspDao {
+
+ protected final SearchBuilder<NuageVspDeviceVO> physicalNetworkIdSearch;
+
+ public NuageVspDaoImpl() {
+ physicalNetworkIdSearch = createSearchBuilder();
+ physicalNetworkIdSearch.and("physicalNetworkId", physicalNetworkIdSearch.entity().getPhysicalNetworkId(), SearchCriteria.Op.EQ);
+ physicalNetworkIdSearch.done();
+ }
+
+ @Override
+ public List<NuageVspDeviceVO> listByPhysicalNetwork(long physicalNetworkId) {
+ SearchCriteria<NuageVspDeviceVO> sc = physicalNetworkIdSearch.create();
+ sc.setParameters("physicalNetworkId", physicalNetworkId);
+ return search(sc, null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..06f9733
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/element/NuageVspElement.java
@@ -0,0 +1,534 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.element;
+
+import 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.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.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;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.Provider;
+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.PhysicalNetworkServiceProvider;
+import com.cloud.network.PublicIpAddress;
+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.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.FirewallRuleType;
+import com.cloud.network.rules.StaticNat;
+import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceStateAdapter;
+import com.cloud.resource.ServerResource;
+import com.cloud.resource.UnableDeleteHostException;
+import com.cloud.utils.component.AdapterBase;
+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;
+
+@Local(value = {NetworkElement.class, ConnectivityProvider.class, IpDeployer.class, SourceNatServiceProvider.class, StaticNatServiceProvider.class, FirewallServiceProvider.class,
+ DhcpServiceProvider.class, NetworkACLServiceProvider.class})
+public class NuageVspElement extends AdapterBase implements ConnectivityProvider, IpDeployer, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider,
+ DhcpServiceProvider, NetworkACLServiceProvider, ResourceStateAdapter {
+
+ private static final Logger s_logger = Logger.getLogger(NuageVspElement.class);
+
+ private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
+
+ public static final ExternalNetworkDeviceManager.NetworkDevice NuageVspDevice = new ExternalNetworkDeviceManager.NetworkDevice("NuageVsp", Provider.NuageVsp.getName());
+
+ @Inject
+ ResourceManager _resourceMgr;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ NetworkModel _networkModel;
+ @Inject
+ NetworkServiceMapDao _ntwkSrvcDao;
+ @Inject
+ NuageVspDao _nuageVspDao;
+ @Inject
+ NetworkDao _networkDao;
+ @Inject
+ protected DomainDao _domainDao;
+ @Inject
+ protected DataCenterDao _dcDao;
+ @Inject
+ IPAddressDao _ipAddressDao;
+ @Inject
+ VlanDao _vlanDao;
+ @Inject
+ NicDao _nicDao;
+ @Inject
+ VpcDao _vpcDao;
+ @Inject
+ NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
+ @Inject
+ AgentManager _agentMgr;
+ @Inject
+ NetworkOfferingDao _ntwkOfferingDao;
+
+ @Override
+ public boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddress, Set<Service> service) throws ResourceUnavailableException {
+ return false;
+ }
+
+ @Override
+ public Map<Service, Map<Capability, String>> getCapabilities() {
+ return capabilities;
+ }
+
+ private static Map<Service, Map<Capability, String>> setCapabilities() {
+ Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
+
+ // L2 Support : SDN provisioning
+ capabilities.put(Service.Connectivity, null);
+
+ // L3 Support : Generic
+ capabilities.put(Service.Gateway, null);
+
+ // L3 Support : SourceNat
+ Map<Capability, String> sourceNatCapabilities = new HashMap<Capability, String>();
+ sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "peraccount");
+ sourceNatCapabilities.put(Capability.RedundantRouter, "false");
+ capabilities.put(Service.SourceNat, sourceNatCapabilities);
+
+ // L3 support : StaticNat
+ capabilities.put(Service.StaticNat, null);
+
+ // Set capabilities for Firewall service
+ Map<Capability, String> firewallCapabilities = new HashMap<Capability, String>();
+ firewallCapabilities.put(Capability.TrafficStatistics, "per public ip");
+ firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp,icmp");
+ firewallCapabilities.put(Capability.SupportedEgressProtocols, "tcp,udp,icmp, all");
+ firewallCapabilities.put(Capability.SupportedTrafficDirection, "ingress, egress");
+ firewallCapabilities.put(Capability.MultipleIps, "true");
+ capabilities.put(Service.Firewall, firewallCapabilities);
+
+ // L3 Support : DHCP
+ Map<Capability, String> dhcpCapabilities = new HashMap<Capability, String>();
+ capabilities.put(Service.Dhcp, dhcpCapabilities);
+
+ //add network ACL capability
+ Map<Network.Capability, String> networkACLCapabilities = new HashMap<Network.Capability, String>();
+ networkACLCapabilities.put(Network.Capability.SupportedProtocols, "tcp,udp,icmp");
+ capabilities.put(Network.Service.NetworkACL, networkACLCapabilities);
+
+ return capabilities;
+ }
+
+ @Override
+ public Provider getProvider() {
+ return Provider.NuageVsp;
+ }
+
+ @Override
+ public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+ super.configure(name, params);
+ _resourceMgr.registerResourceStateAdapter(name, this);
+ return true;
+ }
+
+ @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 (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ if (network.getBroadcastUri() == null) {
+ s_logger.error("Nic has no broadcast Uri with the virtual router IP");
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
+ ResourceUnavailableException, InsufficientCapacityException {
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ if (network.getBroadcastUri() == null) {
+ s_logger.error("Nic has no broadcast Uri with the virtual router IP");
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ if (network.getBroadcastUri() == null) {
+ s_logger.error("Nic has no broadcast Uri with the virtual router IP");
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean isReady(PhysicalNetworkServiceProvider provider) {
+ return true;
+ }
+
+ @Override
+ public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+ return true;
+ }
+
+ @Override
+ public boolean canEnableIndividualServices() {
+ return false;
+ }
+
+ @Override
+ public boolean destroy(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean verifyServicesCombination(Set<Service> services) {
+ // This element can only function in a NuageVsp based
+ // SDN network, so Connectivity needs to be present here
+ if (!services.contains(Service.Connectivity)) {
+ s_logger.warn("Unable to support services combination without Connectivity service provided by Nuage VSP.");
+ return false;
+ }
+
+ if ((services.contains(Service.StaticNat)) && (!services.contains(Service.SourceNat))) {
+ s_logger.warn("Unable to provide StaticNat without the SourceNat service.");
+ return false;
+ }
+
+ if (services.contains(Service.Vpn) || services.contains(Service.Dns) || services.contains(Service.Lb) || services.contains(Service.PortForwarding)
+ || services.contains(Service.SecurityGroup)) {
+ // NuageVsp doesn't implement any of these services, and we don't
+ // want anyone else to do it for us. So if these services
+ // exist, we can't handle it.
+ s_logger.warn("Unable to support services combination. The services list contains service(s) not supported by Nuage VSP.");
+ return false;
+ }
+
+ return true;
+ }
+
+ protected boolean canHandle(Network network, Service service) {
+
+ if (network.getBroadcastDomainType() != Networks.BroadcastDomainType.Vsp) {
+ return false;
+ }
+
+ if (!_networkModel.isProviderForNetwork(getProvider(), network.getId())) {
+ s_logger.debug("NuageElement 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());
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
+ InsufficientCapacityException, ResourceUnavailableException {
+ return true;
+ }
+
+ @Override
+ public boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+ throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
+ return true;
+ }
+
+ @Override
+ public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException {
+ return true;
+ }
+
+ @Override
+ public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
+ //Check if the network is associated to a VPC
+ Long vpcId = config.getVpcId();
+ String vpcOrSubnetUuid = null;
+ if (vpcId != null) {
+ Vpc vpcObj = _vpcDao.findById(vpcId);
+ vpcOrSubnetUuid = vpcObj.getUuid();
+ } else {
+ vpcOrSubnetUuid = config.getUuid();
+ }
+ Domain networkDomain = _domainDao.findById(config.getDomainId());
+
+ long networkOfferingId = _ntwkOfferingDao.findById(config.getNetworkOfferingId()).getId();
+ boolean isL3Network = isL3Network(networkOfferingId);
+
+ List<Map<String, Object>> sourceNatDetails = new ArrayList<Map<String, Object>>();
+ for (StaticNat staticNat : rules) {
+ Map<String, Object> sourceNatDetail = new HashMap<String, Object>();
+ IPAddressVO sourceNatIp = _ipAddressDao.findById(staticNat.getSourceIpAddressId());
+ VlanVO sourceNatVan = _vlanDao.findById(sourceNatIp.getVlanId());
+ NicVO nicVO = _nicDao.findByIp4AddressAndNetworkId(staticNat.getDestIpAddress(), staticNat.getNetworkId());
+ //Just get all the information about the sourceNat which will be used by NuageVsp
+ //client to process the request
+ sourceNatDetail.put("sourceNatIpUuid", sourceNatIp.getUuid());
+ sourceNatDetail.put("sourceNatIpAddress", sourceNatIp.getAddress().addr());
+ sourceNatDetail.put("nicMacAddress", nicVO == null ? null : nicVO.getMacAddress());
+ sourceNatDetail.put("isRevoke", staticNat.isForRevoke());
+ sourceNatDetail.put("sourceNatVlanUuid", sourceNatVan.getUuid());
+ sourceNatDetail.put("sourceNatVlanGateway", sourceNatVan.getVlanGateway());
+ 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());
+ }
+ } catch (Exception e) {
+ throw new ResourceUnavailableException("Failed to apply Static NAT in VSP", Network.class, config.getId(), e);
+ }
+
+ return true;
+ }
+
+ @Override
+ public IpDeployer getIpDeployer(Network network) {
+ return this;
+ }
+
+ @Override
+ public boolean applyFWRules(Network network, List<? extends FirewallRule> 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);
+ return true;
+ }
+ return applyACLRules(network, rules, false);
+ }
+
+ @Override
+ public boolean applyNetworkACLs(Network network, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
+ s_logger.debug("Handling applyNetworkACLs for network " + network.getName() + " with " + rules.size() + " Network ACLs");
+ 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());
+ } else {
+ s_logger.debug("New rules has to applied. So, delete all the existing ACL in VSP from Subnet with uuid " + network.getUuid());
+ }
+ applyACLRules(network, rules, true);
+ return true;
+ }
+
+ protected boolean applyACLRules(Network network, List<? extends InternalIdentity> 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<Map<String, Object>> aclRules = new ArrayList<Map<String, Object>>();
+ for (InternalIdentity acl : rules) {
+ aclRules.add(getACLRuleDetails(acl, egressDefaultPolicy));
+ }
+
+ 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);
+ if (answer == null || !answer.getResult()) {
+ s_logger.error("ApplyAclRuleNuageVspCommand for network " + network.getUuid() + " failed");
+ if ((null != answer) && (null != answer.getDetails())) {
+ throw new ResourceUnavailableException(answer.getDetails(), Network.class, network.getId());
+ }
+ }
+
+ } catch (Exception e1) {
+ throw new ResourceUnavailableException(e1.getMessage(), Network.class, network.getId());
+ }
+
+ return true;
+ }
+
+ @Override
+ public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
+ return null;
+ }
+
+ @Override
+ public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details, List<String> hostTags) {
+ if (!(startup[0] instanceof StartupVspCommand)) {
+ return null;
+ }
+ host.setType(Host.Type.L2Networking);
+ return host;
+ }
+
+ @Override
+ public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
+ if (!(host.getType() == Host.Type.L2Networking)) {
+ return null;
+ }
+ return new DeleteHostAnswer(true);
+ }
+
+ protected HostVO getNuageVspHost(Long physicalNetworkId) throws CloudException {
+ HostVO nuageVspHost;
+ List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
+ if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) {
+ NuageVspDeviceVO config = nuageVspDevices.iterator().next();
+ nuageVspHost = _hostDao.findById(config.getHostId());
+ _hostDao.loadDetails(nuageVspHost);
+ } else {
+ throw new CloudException("Nuage VSD is not configured on physical network " + physicalNetworkId);
+ }
+ return nuageVspHost;
+ }
+
+ protected boolean isL3Network(Long offeringId) {
+ return _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.SourceNat)
+ || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.StaticNat);
+ }
+
+ private Map<String, Object> getACLRuleDetails(Object aclRule, boolean egressDefaultPolicy) {
+ Map<String, Object> aclDetails = new HashMap<String, Object>();
+ if (aclRule instanceof FirewallRule) {
+ FirewallRule firewallRule = (FirewallRule)aclRule;
+ aclDetails.put("sourceCidrList", firewallRule.getSourceCidrList());
+ aclDetails.put("uuid", firewallRule.getUuid());
+ aclDetails.put("protocol", firewallRule.getProtocol());
+ aclDetails.put("startPort", firewallRule.getSourcePortStart());
+ aclDetails.put("endPort", firewallRule.getSourcePortEnd());
+ aclDetails.put("state", firewallRule.getState().name());
+ aclDetails.put("trafficType", firewallRule.getTrafficType().name());
+ if (firewallRule.getSourceIpAddressId() != null) {
+ //add the source IP
+ IPAddressVO ipaddress = _ipAddressDao.findById(((FirewallRule)aclRule).getSourceIpAddressId());
+ aclDetails.put("sourceIpAddress", ipaddress != null ? ipaddress.getVmIp() + "/32" : null);
+ }
+ if (firewallRule.getTrafficType().equals(FirewallRule.TrafficType.Egress) && egressDefaultPolicy) {
+ aclDetails.put("action", "Deny");
+ } else {
+ aclDetails.put("action", "Allow");
+ }
+ aclDetails.put("priority", -1);
+ aclDetails.put("type", "Firewall");
+ } else {
+ NetworkACLItem networkAcl = (NetworkACLItem)aclRule;
+ aclDetails.put("sourceCidrList", networkAcl.getSourceCidrList());
+ aclDetails.put("uuid", networkAcl.getUuid());
+ aclDetails.put("protocol", networkAcl.getProtocol());
+ aclDetails.put("startPort", networkAcl.getSourcePortStart());
+ aclDetails.put("endPort", networkAcl.getSourcePortEnd());
+ aclDetails.put("state", networkAcl.getState().name());
+ aclDetails.put("trafficType", networkAcl.getTrafficType().name());
+ //Set sourceIP to null as it is not applicable
+ aclDetails.put("sourceIpAddress", null);
+ aclDetails.put("action", networkAcl.getAction().name());
+ aclDetails.put("priority", networkAcl.getNumber());
+ aclDetails.put("type", "NetworkACL");
+ }
+ return aclDetails;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d9882ea
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java
@@ -0,0 +1,416 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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.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.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.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.network.Network;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.Service;
+import com.cloud.network.Network.State;
+import com.cloud.network.NetworkProfile;
+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.NetworkVO;
+import com.cloud.network.dao.NuageVspDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+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.utils.db.DB;
+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;
+
+@Local(value = NetworkGuru.class)
+public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
+ public static final Logger s_logger = Logger.getLogger(NuageVspGuestNetworkGuru.class);
+
+ @Inject
+ NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
+ @Inject
+ NetworkOfferingDao _ntwkOfferingDao;
+ @Inject
+ DomainDao _domainDao;
+ @Inject
+ AccountDao _accountDao;
+ @Inject
+ NuageVspDao _nuageVspDao;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ VpcDao _vpcDao;
+ @Inject
+ AgentManager _agentMgr;
+
+ public NuageVspGuestNetworkGuru() {
+ super();
+ _isolationMethods = new IsolationMethod[] {IsolationMethod.VSP};
+ }
+
+ @Override
+ public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) {
+ 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");
+ return null;
+ }
+
+ NetworkVO networkObject = (NetworkVO)super.design(offering, plan, userSpecified, owner);
+ if (networkObject == null) {
+ return null;
+ }
+
+ networkObject.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp);
+ return networkObject;
+ }
+
+ @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);
+ if (network.getGateway() != null) {
+ implemented.setGateway(network.getGateway());
+ }
+ if (network.getCidr() != null) {
+ implemented.setCidr(network.getCidr());
+ }
+ Collection<String> ipAddressRange = new ArrayList<String>();
+ 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();
+ }
+
+ 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());
+ }
+ return null;
+ }
+ s_logger.info("Implemented OK, network " + networkUuid + " in tenant " + tenantId + " linked to " + implemented.getBroadcastUri().toString());
+ return implemented;
+ }
+
+ @Override
+ public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
+
+ return super.allocate(network, nic, vm);
+ }
+
+ @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());
+ }
+
+ //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<Map<String, String>> 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.getIp4Address() + " from a VM " + vm.getInstanceName() + " with state " + vm.getVirtualMachine().getState());
+ DomainVO networksDomain = _domainDao.findById(network.getDomainId());
+ NicVO nicFrmDd = _nicDao.findById(nic.getId());
+ long networkOfferingId = _ntwkOfferingDao.findById(network.getNetworkOfferingId()).getId();
+ Long vpcId = network.getVpcId();
+ String vpcUuid = null;
+ if (vpcId != null) {
+ Vpc vpcObj = _vpcDao.findById(vpcId);
+ vpcUuid = vpcObj.getUuid();
+ }
+ HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId());
+ DeallocateVmVspCommand cmd = new DeallocateVmVspCommand(network.getUuid(), nicFrmDd.getUuid(), nic.getMacAddress(), nic.getIp4Address(),
+ isL3Network(networkOfferingId), vpcUuid, networksDomain.getUuid(), vm.getInstanceName(), vm.getUuid());
+ DeallocateVmVspAnswer answer = (DeallocateVmVspAnswer)_agentMgr.easySend(nuageVspHost.getId(), cmd);
+ if (answer == null || !answer.getResult()) {
+ s_logger.error("DeallocateVmNuageVspCommand for VM " + vm.getUuid() + " failed");
+ 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.getIp4Address()
+ + " is getting destroyed. REST API failed to update the VM state in NuageVsp", e);
+ }
+ super.deallocate(network, nic, vm);
+ }
+
+ @Override
+ public void shutdown(NetworkProfile profile, NetworkOffering offering) {
+ super.shutdown(profile, offering);
+ }
+
+ @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();
+ }
+ try {
+ 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);
+ 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());
+ }
+ }
+ } catch (Exception e) {
+ s_logger.warn("Failed to clean up network information in Vsp " + e.getMessage());
+ }
+
+ return super.trash(network, offering);
+ }
+
+ private String getVirtualRouterIP(Network network, Collection<String> addressRange) throws InsufficientVirtualNetworkCapacityException {
+ String virtualRouterIp;
+ String subnet = NetUtils.getCidrSubNet(network.getCidr());
+ String netmask = NetUtils.getCidrNetmask(network.getCidr());
+ long cidrSize = NetUtils.getCidrSize(netmask);
+
+ Set<Long> allIPsInCidr = NetUtils.getAllIpsFromCidr(subnet, cidrSize, new HashSet<Long>());
+
+ if (allIPsInCidr.size() > 3) {
+ Iterator<Long> 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() + ")");
+ } 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() + ")");
+ }
+ addressRange.add(NetUtils.long2Ip(ipIterator.next()));
+ addressRange.add(NetUtils.long2Ip((Long)allIPsInCidr.toArray()[allIPsInCidr.size() - 1]));
+ return virtualRouterIp;
+ }
+
+ throw new InsufficientVirtualNetworkCapacityException("VSP allocates an IP for VirtualRouter." + " So, subnet should have atleast minimum 4 hosts ", Network.class,
+ network.getId());
+ }
+
+ private void setIPGatewayMaskInfo(Network network, NicProfile nic, List<Map<String, String>> vmInterfacesDetails) throws InsufficientVirtualNetworkCapacityException {
+ try {
+ for (Map<String, String> interfaces : vmInterfacesDetails) {
+ String macFromNuage = interfaces.get("mac");
+ if (StringUtils.equals(macFromNuage, nic.getMacAddress())) {
+ nic.setIp4Address(interfaces.get("ip4Address"));
+ nic.setGateway(interfaces.get("gateway"));
+ nic.setNetmask(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(Long offeringId) {
+ return _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.SourceNat)
+ || _ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offeringId, Service.StaticNat);
+ }
+
+ private HostVO getNuageVspHost(long physicalNetworkId) throws InsufficientVirtualNetworkCapacityException {
+ HostVO nuageVspHost;
+ List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
+ if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) {
+ NuageVspDeviceVO config = nuageVspDevices.iterator().next();
+ nuageVspHost = _hostDao.findById(config.getHostId());
+ _hostDao.loadDetails(nuageVspHost);
+ } else {
+ throw new InsufficientVirtualNetworkCapacityException("Nuage VSD is not configured on physical network ", PhysicalNetwork.class, physicalNetworkId);
+ }
+ return nuageVspHost;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..2b4d2b5
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManager.java
@@ -0,0 +1,55 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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.response.NuageVspDeviceResponse;
+import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.utils.component.PluggableService;
+
+public interface NuageVspManager extends PluggableService {
+
+ static final String NUAGE_VPC_OFFERING_NAME = "Default VPC offering with NuageVsp";
+
+ static final String NUAGE_VPC_OFFERING_DISPLAY_TEXT = "Default VPC offering with NuageVsp";
+
+ static final ConfigKey<Integer> NuageVspSyncInterval = new ConfigKey<Integer>(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 ConfigKey<Integer> NuageVspSyncWorkers = new ConfigKey<Integer>(Integer.class, "nuagevsp.sync.workers", "Advanced", "1",
+ "Number of workers to synchronize the information between CloudStack and NuageVsp", false, Scope.Global, 1);
+
+ NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd);
+
+ NuageVspDeviceResponse createNuageVspDeviceResponse(NuageVspDeviceVO nuageVspDeviceVO);
+
+ boolean deleteNuageVspDevice(DeleteNuageVspDeviceCmd cmd);
+
+ List<NuageVspDeviceVO> listNuageVspDevices(ListNuageVspDevicesCmd cmd);
+
+}
[4/4] git commit: updated refs/heads/master to 03de9cc
Posted by hu...@apache.org.
CLOUDSTACK-6845 : NuageVsp Network plugin
Signed-off-by: Hugo Trippaers <ht...@schubergphilis.com>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/03de9cc3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/03de9cc3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/03de9cc3
Branch: refs/heads/master
Commit: 03de9cc33507400e0e06ccd84a36334a4660ef4e
Parents: 43dffaa
Author: Suresh Ramamurthy <su...@nuagenetworks.net>
Authored: Mon Jul 21 09:40:45 2014 +0200
Committer: Hugo Trippaers <ht...@schubergphilis.com>
Committed: Mon Jul 21 10:49:49 2014 +0200
----------------------------------------------------------------------
api/src/com/cloud/event/EventTypes.java | 7 +
api/src/com/cloud/network/Network.java | 3 +
api/src/com/cloud/network/Networks.java | 3 +-
api/src/com/cloud/network/PhysicalNetwork.java | 2 +-
.../classes/resources/messages.properties | 5 +
.../classes/resources/messages_zh_CN.properties | 5 +
client/pom.xml | 20 +
client/tomcatconf/commands.properties.in | 7 +
.../hypervisor/kvm/resource/OvsVifDriver.java | 4 +
.../vmware/resource/VmwareResource.java | 13 +
.../xenserver/resource/CitrixResourceBase.java | 11 +-
plugins/network-elements/nuage-vsp/pom.xml | 48 ++
.../META-INF/cloudstack/vsp/module.properties | 21 +
.../cloudstack/vsp/spring-vsp-context.xml | 41 ++
.../com/cloud/agent/api/StartupVspCommand.java | 29 +
.../com/cloud/agent/api/VspResourceAnswer.java | 42 ++
.../com/cloud/agent/api/VspResourceCommand.java | 82 +++
.../api/element/ApplyAclRuleVspAnswer.java | 34 ++
.../api/element/ApplyAclRuleVspCommand.java | 82 +++
.../api/element/ApplyStaticNatVspAnswer.java | 34 ++
.../api/element/ApplyStaticNatVspCommand.java | 63 +++
.../agent/api/element/ShutDownVpcVspAnswer.java | 34 ++
.../api/element/ShutDownVpcVspCommand.java | 48 ++
.../agent/api/guru/DeallocateVmVspAnswer.java | 34 ++
.../agent/api/guru/DeallocateVmVspCommand.java | 91 ++++
.../api/guru/ImplementNetworkVspAnswer.java | 35 ++
.../api/guru/ImplementNetworkVspCommand.java | 124 +++++
.../agent/api/guru/ReleaseVmVspAnswer.java | 34 ++
.../agent/api/guru/ReleaseVmVspCommand.java | 54 ++
.../api/guru/ReserveVmInterfaceVspAnswer.java | 44 ++
.../api/guru/ReserveVmInterfaceVspCommand.java | 115 ++++
.../agent/api/guru/TrashNetworkVspAnswer.java | 34 ++
.../agent/api/guru/TrashNetworkVspCommand.java | 60 +++
.../com/cloud/agent/api/sync/SyncVspAnswer.java | 34 ++
.../cloud/agent/api/sync/SyncVspCommand.java | 42 ++
.../api/commands/AddNuageVspDeviceCmd.java | 179 +++++++
.../api/commands/DeleteNuageVspDeviceCmd.java | 105 ++++
.../IssueNuageVspResourceRequestCmd.java | 215 ++++++++
.../api/commands/ListNuageVspDevicesCmd.java | 107 ++++
.../com/cloud/api/commands/VspConstants.java | 35 ++
.../api/response/NuageVspDeviceResponse.java | 105 ++++
.../api/response/NuageVspResourceResponse.java | 41 ++
.../src/com/cloud/network/NuageVspDeviceVO.java | 98 ++++
.../src/com/cloud/network/dao/NuageVspDao.java | 36 ++
.../com/cloud/network/dao/NuageVspDaoImpl.java | 52 ++
.../cloud/network/element/NuageVspElement.java | 534 +++++++++++++++++++
.../network/guru/NuageVspGuestNetworkGuru.java | 416 +++++++++++++++
.../cloud/network/manager/NuageVspManager.java | 55 ++
.../network/manager/NuageVspManagerImpl.java | 353 ++++++++++++
.../network/resource/NuageVspResource.java | 467 ++++++++++++++++
.../com/cloud/network/sync/NuageVspSync.java | 26 +
.../cloud/network/sync/NuageVspSyncImpl.java | 72 +++
.../vsp/acs/NuageVspPluginClientLoader.java | 46 ++
.../nuage/vsp/acs/client/NuageVspApiClient.java | 30 ++
.../vsp/acs/client/NuageVspElementClient.java | 36 ++
.../vsp/acs/client/NuageVspGuruClient.java | 44 ++
.../vsp/acs/client/NuageVspSyncClient.java | 27 +
.../network/element/NuageVspElementTest.java | 280 ++++++++++
.../guru/NuageVspGuestNetworkGuruTest.java | 386 ++++++++++++++
.../network/manager/NuageVspManagerTest.java | 111 ++++
.../network/resource/NuageVspResourceTest.java | 252 +++++++++
.../cloud/network/sync/NuageVspSyncTest.java | 73 +++
plugins/pom.xml | 11 +
server/src/com/cloud/api/ApiResponseHelper.java | 2 +-
.../configuration/ConfigurationManagerImpl.java | 3 +-
.../com/cloud/network/vpc/VpcManagerImpl.java | 3 +-
setup/db/db/schema-440to450.sql | 12 +
test/integration/component/test_nuage_vsp.py | 312 +++++++++++
tools/apidoc/gen_toc.py | 1 +
ui/dictionary.jsp | 5 +
ui/scripts/configuration.js | 21 +-
ui/scripts/docs.js | 29 +
ui/scripts/system.js | 481 ++++++++++++++++-
ui/scripts/ui-custom/zoneWizard.js | 5 +-
.../vmware/mo/HypervisorHostHelper.java | 54 +-
75 files changed, 6424 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index 71bfdb6..411f620 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -428,6 +428,9 @@ public class EventTypes {
public static final String EVENT_EXTERNAL_OVS_CONTROLLER_ADD = "PHYSICAL.OVSCONTROLLER.ADD";
public static final String EVENT_EXTERNAL_OVS_CONTROLLER_DELETE = "PHYSICAL.OVSCONTROLLER.DELETE";
+ // 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_DELETE = "PHYSICAL.NUAGE.VSD.DELETE";
// AutoScale
public static final String EVENT_COUNTER_CREATE = "COUNTER.CREATE";
public static final String EVENT_COUNTER_DELETE = "COUNTER.DELETE";
@@ -824,6 +827,10 @@ public class EventTypes {
entityEventDetails.put(EVENT_EXTERNAL_NVP_CONTROLLER_DELETE, "NvpController");
entityEventDetails.put(EVENT_EXTERNAL_NVP_CONTROLLER_CONFIGURE, "NvpController");
+ // external network mapping events
+ entityEventDetails.put(EVENT_EXTERNAL_VSP_VSD_ADD, "NuageVsp");
+ entityEventDetails.put(EVENT_EXTERNAL_VSP_VSD_DELETE, "NuageVsp");
+
// AutoScale
entityEventDetails.put(EVENT_COUNTER_CREATE, AutoScaleCounter.class);
entityEventDetails.put(EVENT_COUNTER_DELETE, AutoScaleCounter.class);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index 885bffe..0a08f28 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -132,6 +132,9 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
// add new Ovs provider
public static final Provider Ovs = new Provider("Ovs", false);
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);
private final String name;
private final boolean isExternal;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/api/src/com/cloud/network/Networks.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Networks.java b/api/src/com/cloud/network/Networks.java
index 1e4d229..1ad3350 100755
--- a/api/src/com/cloud/network/Networks.java
+++ b/api/src/com/cloud/network/Networks.java
@@ -109,7 +109,8 @@ public class Networks {
}
}
},
- UnDecided(null, null), OpenDaylight("opendaylight", String.class);
+ UnDecided(null, null), OpenDaylight("opendaylight", String.class),
+ Vsp("vsp", String.class),;
private final String scheme;
private final Class<?> type;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/api/src/com/cloud/network/PhysicalNetwork.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/PhysicalNetwork.java b/api/src/com/cloud/network/PhysicalNetwork.java
index 8cc214e..024b3ce 100644
--- a/api/src/com/cloud/network/PhysicalNetwork.java
+++ b/api/src/com/cloud/network/PhysicalNetwork.java
@@ -33,7 +33,7 @@ public interface PhysicalNetwork extends Identity, InternalIdentity {
}
public enum IsolationMethod {
- VLAN, L3, GRE, STT, VNS, MIDO, SSP, VXLAN, ODL, L3VPN;
+ VLAN, L3, GRE, STT, VNS, MIDO, SSP, VXLAN, ODL, L3VPN, VSP;
}
public enum BroadcastDomainRange {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/client/WEB-INF/classes/resources/messages.properties
----------------------------------------------------------------------
diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties
index b192cb0..bb75b08 100644
--- a/client/WEB-INF/classes/resources/messages.properties
+++ b/client/WEB-INF/classes/resources/messages.properties
@@ -327,6 +327,7 @@ label.add.new.SRX=Add new SRX
label.add.new.PA=Add new Palo Alto
label.add.new.tier=Add new tier
label.add.NiciraNvp.device=Add Nvp Controller
+label.add.NuageVsp.device=Add Nuage Virtualized Services Directory (VSD)
label.add.physical.network=Add physical network
label.add.pod=Add Pod
label.add.port.forwarding.rule=Add port forwarding rule
@@ -387,6 +388,7 @@ label.anti.affinity.group=Anti-affinity Group
label.anti.affinity.groups=Anti-affinity Groups
label.anti.affinity=Anti-affinity
label.api.key=API Key
+label.api.version=API Version
label.apply=Apply
label.assign.to.load.balancer=Assigning instance to load balancer
label.assign=Assign
@@ -501,6 +503,7 @@ label.delete.F5=Delete F5
label.delete.gateway=delete gateway
label.delete.NetScaler=Delete NetScaler
label.delete.NiciraNvp=Remove Nvp Controller
+label.delete.NuageVsp=Remove Nuage VSD
label.delete.project=Delete project
label.delete.SRX=Delete SRX
label.delete.PA=Delete Palo Alto
@@ -1009,6 +1012,7 @@ label.restart.network=Restart network
label.restart.required=Restart required
label.restart.vpc=restart VPC
label.restore=Restore
+label.retry.interval=Retry Interval
label.review=Review
label.revoke.project.invite=Revoke invitation
label.role=Role
@@ -1631,6 +1635,7 @@ message.configuring.storage.traffic=Configuring storage traffic
message.confirm.action.force.reconnect=Please confirm that you want to force reconnect this host.
message.confirm.delete.F5=Please confirm that you would like to delete F5
message.confirm.delete.NetScaler=Please confirm that you would like to delete NetScaler
+message.confirm.delete.NuageVsp=Please confirm that you would like to delete Nuage Virtualized Services Directory
message.confirm.delete.SRX=Please confirm that you would like to delete SRX
message.confirm.delete.PA=Please confirm that you would like to delete Palo Alto
message.confirm.destroy.router=Please confirm that you would like to destroy this router
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/client/WEB-INF/classes/resources/messages_zh_CN.properties
----------------------------------------------------------------------
diff --git a/client/WEB-INF/classes/resources/messages_zh_CN.properties b/client/WEB-INF/classes/resources/messages_zh_CN.properties
index 1ec4e95..d7a0ca9 100644
--- a/client/WEB-INF/classes/resources/messages_zh_CN.properties
+++ b/client/WEB-INF/classes/resources/messages_zh_CN.properties
@@ -297,6 +297,7 @@ label.add.new.SRX=\u6dfb\u52a0\u65b0 SRX
label.add.new.tier=\u6dfb\u52a0\u65b0\u5c42
label.add.nfs.secondary.staging.store=\u6dfb\u52a0 NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8
label.add.NiciraNvp.device=\u6dfb\u52a0 Nvp \u63a7\u5236\u5668
+label.add.NuageVsp.device=\u6DFB\u52A0 Nuage \u865A\u62DF\u670D\u52A1\u76EE\u5F55 (VSD)
label.add.OpenDaylight.device=\u6dfb\u52a0 OpenDaylight \u63a7\u5236\u5668
label.add.PA.device=\u6dfb\u52a0 Palo Alto \u8bbe\u5907
label.add.physical.network=\u6dfb\u52a0\u7269\u7406\u7f51\u7edc
@@ -355,6 +356,7 @@ label.anti.affinity.groups=\u53cd\u5173\u8054\u6027\u7ec4
label.anti.affinity.group=\u53cd\u5173\u8054\u6027\u7ec4
label.anti.affinity=\u53cd\u5173\u8054\u6027
label.api.key=API \u5bc6\u94a5
+label.api.version=API \u7248\u672C
label.apply=\u5e94\u7528
label.app.name=CloudStack
label.archive.alerts=\u5b58\u6863\u8b66\u62a5
@@ -508,6 +510,7 @@ label.delete.F5=\u5220\u9664 F5
label.delete.gateway=\u5220\u9664\u7f51\u5173
label.delete.NetScaler=\u5220\u9664 NetScaler
label.delete.NiciraNvp=\u79fb\u9664 Nvp \u63a7\u5236\u5668
+label.delete.NuageVsp=\u5220\u9664 Nuage VSD
label.delete.OpenDaylight.device=\u5220\u9664 OpenDaylight \u63a7\u5236\u5668
label.delete.PA=\u5220\u9664 Palo Alto
label.delete.portable.ip.range=\u5220\u9664\u53ef\u79fb\u690d IP \u8303\u56f4
@@ -1142,6 +1145,7 @@ label.restart.network=\u91cd\u65b0\u542f\u52a8\u7f51\u7edc
label.restart.required=\u9700\u8981\u91cd\u65b0\u542f\u52a8
label.restart.vpc=\u91cd\u65b0\u542f\u52a8 VPC
label.restore=\u8fd8\u539f
+label.retry.interval=\u91cd\u8bd5\u95f4\u9694
label.review=\u6838\u5bf9
label.revoke.project.invite=\u64a4\u9500\u9080\u8bf7
label.role=\u89d2\u8272
@@ -1607,6 +1611,7 @@ message.confirm.dedicate.zone=\u662f\u5426\u8981\u5c06\u6b64\u8d44\u6e90\u57df\u
message.confirm.delete.ciscovnmc.resource=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 CiscoVNMC \u8d44\u6e90
message.confirm.delete.F5=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 F5
message.confirm.delete.NetScaler=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 NetScaler
+message.confirm.delete.NuageVsp=\u8BF7\u786E\u8BA4\u5220\u9664 Nuage \u865A\u62DF\u670D\u52A1\u76EE\u5F55
message.confirm.delete.PA=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Palo Alto
message.confirm.delete.secondary.staging.store=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8\u3002
message.confirm.delete.SRX=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 SRX
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/client/pom.xml
----------------------------------------------------------------------
diff --git a/client/pom.xml b/client/pom.xml
index 46933d9..1621a05 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -106,6 +106,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloud-plugin-network-vsp</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.cloudstack</groupId>
<artifactId>cloud-plugin-network-ovs</artifactId>
<version>${project.version}</version>
@@ -944,6 +949,21 @@
</dependencies>
</profile>
<profile>
+ <id>nuagevsp</id>
+ <activation>
+ <property>
+ <name>noredist</name>
+ </property>
+ </activation>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloud-plugin-network-vsp</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </profile>
+ <profile>
<id>srx</id>
<activation>
<property>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index b9ac27b..aa03949 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -618,6 +618,13 @@ listBigSwitchVnsDevices=1
addStratosphereSsp=1
deleteStratoshereSsp=1
+#### nuage vsp commands
+
+addNuageVspDevice=1
+deleteNuageVspDevice=1
+listNuageVspDevices=1
+issueNuageVspResourceRequest=15
+
#### host simulator commands
configureSimulator=1
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java
index 8e4c710..1420682 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java
@@ -93,6 +93,10 @@ public class OvsVifDriver extends VifDriverBase {
String brName = "OVSTunnel" + vnetId;
s_logger.debug("nic " + nic + " needs to be connected to LogicalSwitch " + brName);
intf.defBridgeNet(brName, null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), networkRateKBps);
+ } else if (nic.getBroadcastType() == Networks.BroadcastDomainType.Vsp) {
+ intf.setVirtualPortInterfaceId(nic.getUuid());
+ String brName = (trafficLabel != null && !trafficLabel.isEmpty()) ? _pifs.get(trafficLabel) : _pifs.get("private");
+ intf.defBridgeNet(brName, null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), networkRateKBps);
} else {
intf.defBridgeNet(_bridges.get("guest"), null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), networkRateKBps);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 0922765..7b73b19 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -931,6 +931,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
vmConfigSpec.getDeviceChange().add(deviceConfigSpec);
+ setNuageVspVrIpInExtraConfig(vmConfigSpec.getExtraConfig(), nicTo);
if (!vmMo.configureVm(vmConfigSpec)) {
throw new Exception("Failed to configure devices when running PlugNicCommand");
}
@@ -1900,11 +1901,23 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
newVal.setKey("nvp.iface-id." + nicNum);
newVal.setValue(nicTo.getUuid());
extraOptions.add(newVal);
+ setNuageVspVrIpInExtraConfig(extraOptions, nicTo);
}
nicNum++;
}
}
+ private static void setNuageVspVrIpInExtraConfig(List<OptionValue> extraOptions, NicTO nicTo) {
+ URI broadcastUri = nicTo.getBroadcastUri();
+ if (broadcastUri != null && broadcastUri.getScheme().equalsIgnoreCase(Networks.BroadcastDomainType.Vsp.scheme())) {
+ String path = broadcastUri.getPath();
+ OptionValue newVal = new OptionValue();
+ newVal.setKey("vsp.vr-ip." + nicTo.getMac());
+ newVal.setValue(path.substring(1));
+ extraOptions.add(newVal);
+ }
+ }
+
private static void configCustomExtraOption(List<OptionValue> extraOptions, VirtualMachineTO vmSpec) {
// we no longer to validation anymore
for (Map.Entry<String, String> entry : vmSpec.getDetails().entrySet()) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index a2b9625..71aa01e 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -1037,7 +1037,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
assert (BroadcastDomainType.getSchemeValue(uri) == BroadcastDomainType.Vlan);
long vlan = Long.parseLong(BroadcastDomainType.getValue(uri));
return enableVlanNetwork(conn, vlan, network);
- } else if (type == BroadcastDomainType.Native || type == BroadcastDomainType.LinkLocal) {
+ } else if (type == BroadcastDomainType.Native || type == BroadcastDomainType.LinkLocal ||
+ type == BroadcastDomainType.Vsp) {
return network.getNetwork();
} else if (uri != null && type == BroadcastDomainType.Vswitch) {
String header = uri.toString().substring(Networks.BroadcastDomainType.Vswitch.scheme().length() + "://".length());
@@ -1105,6 +1106,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
// when bridge is setup for distributed routing
vifr.otherConfig.put("cloudstack-network-id", nic.getNetworkUuid());
+ // Nuage Vsp needs Virtual Router IP to be passed in the otherconfig
+ // get the virtual router IP information from broadcast uri
+ URI broadcastUri = nic.getBroadcastUri();
+ if (broadcastUri != null && broadcastUri.getScheme().equalsIgnoreCase(Networks.BroadcastDomainType.Vsp.scheme())) {
+ String path = broadcastUri.getPath();
+ vifr.otherConfig.put("vsp-vr-ip", path.substring(1));
+ }
vifr.network = getNetwork(conn, nic);
if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) {
@@ -1302,6 +1310,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
vmr.nameLabel = vmSpec.getName();
vmr.actionsAfterCrash = Types.OnCrashBehaviour.DESTROY;
vmr.actionsAfterShutdown = Types.OnNormalExit.DESTROY;
+ vmr.otherConfig.put("vm_uuid", vmSpec.getUuid());
if (isDmcEnabled(conn, host) && vmSpec.isEnableDynamicallyScaleVm()) {
//scaling is allowed
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/pom.xml b/plugins/network-elements/nuage-vsp/pom.xml
new file mode 100644
index 0000000..694ebf0
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/pom.xml
@@ -0,0 +1,48 @@
+<!--
+
+ 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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>cloud-plugin-network-vsp</artifactId>
+ <name>Apache CloudStack Plugin - Nuage VSP</name>
+ <parent>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloudstack-plugins</artifactId>
+ <version>4.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.mycila</groupId>
+ <artifactId>license-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>cloudstack-checklicence</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/module.properties
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/module.properties b/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/module.properties
new file mode 100644
index 0000000..e51229e
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/module.properties
@@ -0,0 +1,21 @@
+#
+# 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.
+#
+
+name=vsp
+parent=network
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/spring-vsp-context.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/spring-vsp-context.xml b/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/spring-vsp-context.xml
new file mode 100644
index 0000000..c579789
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/resources/META-INF/cloudstack/vsp/spring-vsp-context.xml
@@ -0,0 +1,41 @@
+<!--
+
+ 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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.0.xsd"
+ >
+
+ <bean id="nuageVspDaoImpl" class="com.cloud.network.dao.NuageVspDaoImpl" />
+ <bean id="NuageVspGuestNetworkGuru" class="com.cloud.network.guru.NuageVspGuestNetworkGuru">
+ <property name="name" value="NuageVspGuestNetworkGuru" />
+ </bean>
+ <bean id="NuageVspElement" class="com.cloud.network.element.NuageVspElement">
+ <property name="name" value="NuageVspElement" />
+ </bean>
+ <bean id="NuageVspManager" class="com.cloud.network.manager.NuageVspManagerImpl" />
+ <bean id="NuageVspSync" class="com.cloud.network.sync.NuageVspSyncImpl" />
+</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..6dba882
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/StartupVspCommand.java
@@ -0,0 +1,29 @@
+//
+// 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 StartupVspCommand extends StartupCommand {
+
+ public StartupVspCommand() {
+ super(Host.Type.L2Networking);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..9327809
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceAnswer.java
@@ -0,0 +1,42 @@
+//
+// 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;
+
+public class VspResourceAnswer extends Answer {
+
+ String _resourceInfo;
+
+ public VspResourceAnswer(Command cmd, String resourceInfo, String details) {
+ super(cmd, true, details);
+ this._resourceInfo = resourceInfo;
+ }
+
+ public VspResourceAnswer(VspResourceCommand cmd, boolean success, String details) {
+ super(cmd, success, details);
+ }
+
+ public VspResourceAnswer(VspResourceCommand cmd, Exception e) {
+ super(cmd, e);
+ }
+
+ public String getResourceInfo() {
+ return this._resourceInfo;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f7e1417
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/VspResourceCommand.java
@@ -0,0 +1,82 @@
+//
+// 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;
+
+public class VspResourceCommand extends Command {
+
+ String _method;
+ String _resource;
+ String _resourceId;
+ String _childResource;
+ Object _entityDetails;
+ String _resourceFilter;
+ String _proxyUserUuid;
+ String _proxyUserDomainuuid;
+
+ public VspResourceCommand(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid,
+ String proxyUserDomainuuid) {
+ super();
+ this._method = method;
+ this._resource = resource;
+ this._resourceId = resourceId;
+ this._childResource = childResource;
+ this._entityDetails = entityDetails;
+ this._resourceFilter = resourceFilter;
+ this._proxyUserUuid = proxyUserUuid;
+ this._proxyUserDomainuuid = proxyUserDomainuuid;
+ }
+
+ public String getRequestType() {
+ return _method;
+ }
+
+ public String getResource() {
+ return _resource;
+ }
+
+ public String getResourceId() {
+ return _resourceId;
+ }
+
+ public String getChildResource() {
+ return _childResource;
+ }
+
+ public Object getEntityDetails() {
+ return _entityDetails;
+ }
+
+ public String getResourceFilter() {
+ return _resourceFilter;
+ }
+
+ public String getProxyUserUuid() {
+ return _proxyUserUuid;
+ }
+
+ public String getProxyUserDomainuuid() {
+ return _proxyUserDomainuuid;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..2b41266
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..5376466
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyAclRuleVspCommand.java
@@ -0,0 +1,82 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.agent.api.element;
+
+import java.util.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<Map<String, Object>> _aclRules;
+ boolean _isVpc;
+ long _networkId;
+
+ public ApplyAclRuleVspCommand(String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> aclRules, boolean isVpc,
+ long networkId) {
+ super();
+ this._networkUuid = networkUuid;
+ this._networkDomainUuid = networkDomainUuid;
+ this._vpcOrSubnetUuid = vpcOrSubnetUuid;
+ this._isL3Network = isL3Network;
+ this._aclRules = aclRules;
+ this._isVpc = isVpc;
+ this._networkId = networkId;
+ }
+
+ public String getNetworkUuid() {
+ return _networkUuid;
+ }
+
+ public String getNetworkDomainUuid() {
+ return _networkDomainUuid;
+ }
+
+ public String getVpcOrSubnetUuid() {
+ return _vpcOrSubnetUuid;
+ }
+
+ public boolean isL3Network() {
+ return _isL3Network;
+ }
+
+ public List<Map<String, Object>> getAclRules() {
+ return _aclRules;
+ }
+
+ public boolean isVpc() {
+ return _isVpc;
+ }
+
+ public long getNetworkId() {
+ return this._networkId;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..c40c1a3
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..b013634
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ApplyStaticNatVspCommand.java
@@ -0,0 +1,63 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.agent.api.element;
+
+import java.util.List;
+import java.util.Map;
+
+import com.cloud.agent.api.Command;
+
+public class ApplyStaticNatVspCommand extends Command {
+
+ String _networkDomainUuid;
+ String _vpcOrSubnetUuid;
+ boolean _isL3Network;
+ List<Map<String, Object>> _staticNatDetails;
+
+ public ApplyStaticNatVspCommand(String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> staticNatDetails) {
+ super();
+ this._networkDomainUuid = networkDomainUuid;
+ this._vpcOrSubnetUuid = vpcOrSubnetUuid;
+ this._isL3Network = isL3Network;
+ this._staticNatDetails = staticNatDetails;
+ }
+
+ public String getNetworkDomainUuid() {
+ return _networkDomainUuid;
+ }
+
+ public String getVpcOrSubnetUuid() {
+ return _vpcOrSubnetUuid;
+ }
+
+ public boolean isL3Network() {
+ return _isL3Network;
+ }
+
+ public List<Map<String, Object>> getStaticNatDetails() {
+ return _staticNatDetails;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..592216e
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..fc05559
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/element/ShutDownVpcVspCommand.java
@@ -0,0 +1,48 @@
+//
+// 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.Command;
+
+public class ShutDownVpcVspCommand extends Command {
+
+ String _domainUuid;
+ String _vpcUuid;
+
+ public ShutDownVpcVspCommand(String domainUuid, String vpcUuid) {
+ super();
+ this._domainUuid = domainUuid;
+ this._vpcUuid = vpcUuid;
+ }
+
+ public String getDomainUuid() {
+ return _domainUuid;
+ }
+
+ public String getVpcUuid() {
+ return _vpcUuid;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..57ecf29
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..19c904f
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/DeallocateVmVspCommand.java
@@ -0,0 +1,91 @@
+//
+// 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.Command;
+
+public class DeallocateVmVspCommand extends Command {
+
+ String _networkUuid;
+ String _nicFrmDdUuid;
+ String _nicMacAddress;
+ String _nicIp4Address;
+ boolean _isL3Network;
+ String _vpcUuid;
+ String _networksDomainUuid;
+ String _vmInstanceName;
+ String _vmUuid;
+
+ public DeallocateVmVspCommand(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, String vpcUuid,
+ String networksDomainUuid, String vmInstanceName, String vmUuid) {
+ super();
+ this._networkUuid = networkUuid;
+ this._nicFrmDdUuid = nicFrmDdUuid;
+ this._nicMacAddress = nicMacAddress;
+ this._nicIp4Address = nicIp4Address;
+ this._isL3Network = isL3Network;
+ this._vpcUuid = vpcUuid;
+ this._networksDomainUuid = networksDomainUuid;
+ this._vmInstanceName = vmInstanceName;
+ this._vmUuid = vmUuid;
+ }
+
+ public String getNetworkUuid() {
+ return _networkUuid;
+ }
+
+ public String getNicFrmDdUuid() {
+ return _nicFrmDdUuid;
+ }
+
+ public String getNicMacAddress() {
+ return _nicMacAddress;
+ }
+
+ public String getNicIp4Address() {
+ return _nicIp4Address;
+ }
+
+ public boolean isL3Network() {
+ return _isL3Network;
+ }
+
+ public String getVpcUuid() {
+ return _vpcUuid;
+ }
+
+ public String getNetworksDomainUuid() {
+ return _networksDomainUuid;
+ }
+
+ public String getVmInstanceName() {
+ return _vmInstanceName;
+ }
+
+ public String getVmUuid() {
+ return _vmUuid;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java
----------------------------------------------------------------------
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/guru/ImplementNetworkVspAnswer.java
new file mode 100644
index 0000000..87e7b32
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspAnswer.java
@@ -0,0 +1,35 @@
+//
+// 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 ImplementNetworkVspAnswer extends Answer {
+
+ public ImplementNetworkVspAnswer(Command command, Exception e) {
+ super(command, e);
+ }
+
+ public ImplementNetworkVspAnswer(ImplementNetworkVspCommand cmd, boolean success, String details) {
+ super(cmd, success, details);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..0ffbda4
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ImplementNetworkVspCommand.java
@@ -0,0 +1,124 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.agent.api.guru;
+
+import java.util.Collection;
+
+import com.cloud.agent.api.Command;
+
+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<String> _ipAddressRange;
+
+ 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<String> ipAddressRange) {
+ super();
+ this._networkDomainName = networkDomainName;
+ this._networkDomainPath = networkDomainPath;
+ this._networkDomainUuid = networkDomainUuid;
+ this._networkAccountName = networkAccountName;
+ this._networkAccountUuid = networkAccountUuid;
+ this._networkName = networkName;
+ this._networkCidr = networkCidr;
+ this._networkGateway = networkGateway;
+ this._networkUuid = networkUuid;
+ this._isL3Network = isL3Network;
+ this._vpcName = vpcName;
+ this._vpcUuid = vpcUuid;
+ this._defaultEgressPolicy = defaultEgressPolicy;
+ this._ipAddressRange = ipAddressRange;
+ }
+
+ public String getNetworkDomainName() {
+ return _networkDomainName;
+ }
+
+ public String getNetworkDomainPath() {
+ return _networkDomainPath;
+ }
+
+ public String getNetworkDomainUuid() {
+ return _networkDomainUuid;
+ }
+
+ public String getNetworkAccountName() {
+ return _networkAccountName;
+ }
+
+ public String getNetworkAccountUuid() {
+ return _networkAccountUuid;
+ }
+
+ public String getNetworkName() {
+ return _networkName;
+ }
+
+ public String getNetworkCidr() {
+ return _networkCidr;
+ }
+
+ public String getNetworkGateway() {
+ return _networkGateway;
+ }
+
+ public String getNetworkUuid() {
+ return _networkUuid;
+ }
+
+ public boolean isL3Network() {
+ return _isL3Network;
+ }
+
+ public String getVpcName() {
+ return _vpcName;
+ }
+
+ public String getVpcUuid() {
+ return _vpcUuid;
+ }
+
+ public boolean isDefaultEgressPolicy() {
+ return _defaultEgressPolicy;
+ }
+
+ public Collection<String> getIpAddressRange() {
+ return _ipAddressRange;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..8bc8e4c
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java
----------------------------------------------------------------------
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/guru/ReleaseVmVspCommand.java
new file mode 100644
index 0000000..9a6a4d7
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReleaseVmVspCommand.java
@@ -0,0 +1,54 @@
+//
+// 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.Command;
+
+public class ReleaseVmVspCommand extends Command {
+
+ String _networkUuid;
+ String _vmUuid;
+ String _vmInstanceName;
+
+ public ReleaseVmVspCommand(String networkUuid, String vmUuid, String vmInstanceName) {
+ super();
+ this._networkUuid = networkUuid;
+ this._vmUuid = vmUuid;
+ this._vmInstanceName = vmInstanceName;
+ }
+
+ public String getNetworkUuid() {
+ return _networkUuid;
+ }
+
+ public String getVmUuid() {
+ return _vmUuid;
+ }
+
+ public String getVmInstanceName() {
+ return _vmInstanceName;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java
new file mode 100644
index 0000000..8fabbef
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspAnswer.java
@@ -0,0 +1,44 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.agent.api.guru;
+
+import java.util.List;
+import java.util.Map;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
+public class ReserveVmInterfaceVspAnswer extends Answer {
+
+ public List<Map<String, String>> _interfaceDetails;
+
+ public ReserveVmInterfaceVspAnswer(Command cmd, List<Map<String, String>> interfaceDetails, String details) {
+ super(cmd, true, details);
+ this._interfaceDetails = interfaceDetails;
+ }
+
+ public ReserveVmInterfaceVspAnswer(Command cmd, Exception e) {
+ super(cmd, e);
+ }
+
+ public List<Map<String, String>> getInterfaceDetails() {
+ return this._interfaceDetails;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..6844bf9
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/ReserveVmInterfaceVspCommand.java
@@ -0,0 +1,115 @@
+//
+// 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.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;
+
+ 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) {
+ super();
+ this._nicUuid = nicUuid;
+ this._nicMacAddress = nicMacAddress;
+ this._networkUuid = networkUuid;
+ this._isL3Network = isL3Network;
+ this._vpcUuid = vpcUuid;
+ this._networkDomainUuid = networkDomainUuid;
+ this._networksAccountUuid = networksAccountUuid;
+ this._isDomainRouter = isDomainRouter;
+ this._domainRouterIp = domainRouterIp;
+ this._vmInstanceName = vmInstanceName;
+ this._vmUuid = vmUuid;
+ this._vmUserName = vmUserName;
+ this._vmUserDomainName = vmUserDomainName;
+ }
+
+ public String getNicUuid() {
+ return _nicUuid;
+ }
+
+ public String getNicMacAddress() {
+ return _nicMacAddress;
+ }
+
+ public String getNetworkUuid() {
+ return _networkUuid;
+ }
+
+ public boolean isL3Network() {
+ return _isL3Network;
+ }
+
+ public String getVpcUuid() {
+ return _vpcUuid;
+ }
+
+ public String getNetworkDomainUuid() {
+ return _networkDomainUuid;
+ }
+
+ public String getNetworksAccountUuid() {
+ return _networksAccountUuid;
+ }
+
+ public boolean isDomainRouter() {
+ return _isDomainRouter;
+ }
+
+ public String _getDomainRouterIp() {
+ return _domainRouterIp;
+ }
+
+ public String _getVmInstanceName() {
+ return _vmInstanceName;
+ }
+
+ public String _getVmUuid() {
+ return _vmUuid;
+ }
+
+ public String _getVmUserName() {
+ return _vmUserName;
+ }
+
+ public String _getVmUserDomainName() {
+ return _vmUserDomainName;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..0c0c0d2
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..e10e9be
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/guru/TrashNetworkVspCommand.java
@@ -0,0 +1,60 @@
+//
+// 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.Command;
+
+public class TrashNetworkVspCommand extends Command {
+
+ String _domainUuid;
+ String _networkUuid;
+ boolean _isL3Network;
+ String _vpcUuid;
+
+ public TrashNetworkVspCommand(String domainUuid, String networkUuid, boolean isL3Network, String vpcUuid) {
+ super();
+ this._domainUuid = domainUuid;
+ this._networkUuid = networkUuid;
+ this._isL3Network = isL3Network;
+ this._vpcUuid = vpcUuid;
+ }
+
+ public String getDomainUuid() {
+ return _domainUuid;
+ }
+
+ public String getNetworkUuid() {
+ return _networkUuid;
+ }
+
+ public boolean isL3Network() {
+ return _isL3Network;
+ }
+
+ public String getVpcUuid() {
+ return _vpcUuid;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java
----------------------------------------------------------------------
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/sync/SyncVspAnswer.java
new file mode 100644
index 0000000..52848e5
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspAnswer.java
@@ -0,0 +1,34 @@
+//
+// 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 SyncVspAnswer extends Answer {
+
+ public SyncVspAnswer(SyncVspCommand cmd, boolean success, String details) {
+ super(cmd, success, details);
+ }
+
+ public SyncVspAnswer(SyncVspCommand cmd, Exception e) {
+ super(cmd, e);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..8ccd84d
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/agent/api/sync/SyncVspCommand.java
@@ -0,0 +1,42 @@
+//
+// 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 SyncVspCommand extends Command {
+
+ String _nuageVspEntity;
+
+ public SyncVspCommand(String nuageVspEntity) {
+ super();
+ this._nuageVspEntity = nuageVspEntity;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
+ public String getNuageVspEntity() {
+ return _nuageVspEntity;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..19f2d09
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AddNuageVspDeviceCmd.java
@@ -0,0 +1,179 @@
+//
+// 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 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;
+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;
+
+@APICommand(name = "addNuageVspDevice", responseObject = NuageVspDeviceResponse.class, description = "Adds a Nuage VSP device")
+public class AddNuageVspDeviceCmd extends BaseAsyncCmd {
+ private static final String s_name = "addnuagevspdeviceresponse";
+
+ @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, required = true, description = "the port to communicate to Nuage VSD")
+ private int port;
+
+ @Parameter(name = ApiConstants.HOST_NAME, type = CommandType.STRING, required = true, description = "the hostname of the Nuage VSD")
+ private String hostName;
+
+ @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = true, description = "the user name of the CMS user in Nuage VSD")
+ private String userName;
+
+ @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, required = true, description = "the password of CMS user in Nuage VSD")
+ private String password;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_VERSION, type = CommandType.STRING, required = true, 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, required = true, description = "the number of retries on failure to communicate to Nuage VSD")
+ private int apiRetryCount;
+
+ @Parameter(name = VspConstants.NUAGE_VSP_API_RETRY_INTERVAL, type = CommandType.LONG, required = true, description = "the time to wait after failure before retrying to communicate to Nuage VSD")
+ private long apiRetryInterval;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int 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 int getApiRetryCount() {
+ return apiRetryCount;
+ }
+
+ public void setApiRetryCount(int 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.addNuageVspDevice(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_ADD;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "Adding a Nuage VSD";
+ }
+}
\ No newline at end of file
[2/4] CLOUDSTACK-6845 : NuageVsp Network plugin
Posted by hu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..fed970e
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java
@@ -0,0 +1,353 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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.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.response.NuageVspDeviceResponse;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.DetailVO;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.Network;
+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.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.NuageVspDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+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.dao.VpcDao;
+import com.cloud.network.vpc.dao.VpcOfferingDao;
+import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceState;
+import com.cloud.resource.ServerResource;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@Local(value = {NuageVspManager.class})
+public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, Configurable {
+
+ private static final Logger s_logger = Logger.getLogger(NuageVspManagerImpl.class);
+
+ private static final int ONE_MINUTE_MULTIPLIER = 60 * 1000;
+
+ @Inject
+ ResourceManager _resourceMgr;
+ @Inject
+ HostDetailsDao _hostDetailsDao;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ PhysicalNetworkDao _physicalNetworkDao;
+ @Inject
+ PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
+ @Inject
+ ConfigurationDao _configDao;
+ @Inject
+ NuageVspDao _nuageVspDao;
+ @Inject
+ NetworkDao _networkDao;
+ @Inject
+ VpcOfferingDao _vpcOffDao;
+ @Inject
+ VpcOfferingServiceMapDao _vpcOffSvcMapDao;
+ @Inject
+ VpcDao _vpcDao;
+ @Inject
+ NuageVspDao nuageVspDao;
+ @Inject
+ NuageVspSync nuageVspSync;
+
+ private ScheduledExecutorService scheduler;
+
+ @Override
+ public List<Class<?>> getCommands() {
+ List<Class<?>> cmdList = new ArrayList<Class<?>>();
+ cmdList.add(AddNuageVspDeviceCmd.class);
+ cmdList.add(DeleteNuageVspDeviceCmd.class);
+ cmdList.add(ListNuageVspDevicesCmd.class);
+ cmdList.add(IssueNuageVspResourceRequestCmd.class);
+
+ return cmdList;
+ }
+
+ @Override
+ public NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd) {
+ ServerResource resource = new NuageVspResource();
+ final String deviceName = Network.Provider.NuageVsp.getName();
+ ExternalNetworkDeviceManager.NetworkDevice networkDevice = ExternalNetworkDeviceManager.NetworkDevice.getNetworkDevice(deviceName);
+ final Long physicalNetworkId = cmd.getPhysicalNetworkId();
+ PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+ if (physicalNetwork == null) {
+ throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId);
+ }
+ long zoneId = physicalNetwork.getDataCenterId();
+
+ 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");
+ } 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");
+ }
+
+ if (_nuageVspDao.listByPhysicalNetwork(physicalNetworkId).size() != 0) {
+ throw new CloudRuntimeException("A NuageVsp device is already configured on this physical network");
+ }
+
+ Map<String, String> params = new HashMap<String, String>();
+ 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<String, Object> hostdetails = new HashMap<String, Object>();
+ hostdetails.putAll(params);
+
+ try {
+ resource.configure(cmd.getHostName(), hostdetails);
+
+ final Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.L2Networking, params);
+ if (host != null) {
+ return Transaction.execute(new TransactionCallback<NuageVspDeviceVO>() {
+ @Override
+ public NuageVspDeviceVO doInTransaction(TransactionStatus status) {
+ 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);
+
+ return nuageVspDevice;
+ }
+ });
+ } else {
+ throw new CloudRuntimeException("Failed to add Nuage Vsp Device due to internal error.");
+ }
+ } catch (ConfigurationException e) {
+ throw new CloudRuntimeException(e.getMessage());
+ }
+ }
+
+ @Override
+ public NuageVspDeviceResponse createNuageVspDeviceResponse(NuageVspDeviceVO nuageVspDeviceVO) {
+ HostVO nuageVspHost = _hostDao.findById(nuageVspDeviceVO.getHostId());
+ _hostDao.loadDetails(nuageVspHost);
+
+ NuageVspDeviceResponse response = new NuageVspDeviceResponse();
+ response.setDeviceName(nuageVspDeviceVO.getDeviceName());
+ PhysicalNetwork pnw = ApiDBUtils.findPhysicalNetworkById(nuageVspDeviceVO.getPhysicalNetworkId());
+ if (pnw != null) {
+ response.setPhysicalNetworkId(pnw.getUuid());
+ }
+ response.setId(nuageVspDeviceVO.getUuid());
+ response.setProviderName(nuageVspDeviceVO.getProviderName());
+ response.setHostName(nuageVspHost.getDetail("hostname"));
+ response.setPort(Integer.parseInt(nuageVspHost.getDetail("port")));
+ String apiRelativePath = nuageVspHost.getDetail("apirelativepath");
+ response.setApiVersion(apiRelativePath.substring(apiRelativePath.lastIndexOf('/') + 1));
+ response.setApiRetryCount(Integer.parseInt(nuageVspHost.getDetail("retrycount")));
+ response.setApiRetryInterval(Long.parseLong(nuageVspHost.getDetail("retryinterval")));
+ response.setObjectName("nuagevspdevice");
+ return response;
+ }
+
+ @Override
+ public boolean deleteNuageVspDevice(DeleteNuageVspDeviceCmd cmd) {
+ Long nuageDeviceId = cmd.getNuageVspDeviceId();
+ NuageVspDeviceVO nuageVspDevice = _nuageVspDao.findById(nuageDeviceId);
+ if (nuageVspDevice == null) {
+ throw new InvalidParameterValueException("Could not find a Nuage Vsp device with id " + nuageDeviceId);
+ }
+
+ // Find the physical network we work for
+ Long physicalNetworkId = nuageVspDevice.getPhysicalNetworkId();
+ PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+ if (physicalNetwork != null) {
+ // Lets see if there are networks that use us
+ // Find the NuageVsp on this physical network
+ List<NetworkVO> networkList = _networkDao.listByPhysicalNetwork(physicalNetworkId);
+
+ // Networks with broadcast type lswitch are ours
+ for (NetworkVO network : networkList) {
+ if (network.getBroadcastDomainType() == Networks.BroadcastDomainType.Vsp) {
+ if ((network.getState() != Network.State.Shutdown) && (network.getState() != Network.State.Destroy)) {
+ throw new CloudRuntimeException("This Nuage Vsp device can not be deleted as there are one or more logical networks provisioned by Cloudstack.");
+ }
+ }
+ }
+ }
+
+ HostVO nuageHost = _hostDao.findById(nuageVspDevice.getHostId());
+ Long hostId = nuageHost.getId();
+
+ nuageHost.setResourceState(ResourceState.Maintenance);
+ _hostDao.update(hostId, nuageHost);
+ _resourceMgr.deleteHost(hostId, false, false);
+
+ _nuageVspDao.remove(nuageDeviceId);
+ return true;
+ }
+
+ @Override
+ public List<NuageVspDeviceVO> listNuageVspDevices(ListNuageVspDevicesCmd cmd) {
+ Long physicalNetworkId = cmd.getPhysicalNetworkId();
+ Long nuageVspDeviceId = cmd.getNuageVspDeviceId();
+ List<NuageVspDeviceVO> responseList = new ArrayList<NuageVspDeviceVO>();
+
+ if (physicalNetworkId == null && nuageVspDeviceId == null) {
+ throw new InvalidParameterValueException("Either physical network Id or Nuage device Id must be specified");
+ }
+
+ if (nuageVspDeviceId != null) {
+ NuageVspDeviceVO nuageVspDevice = _nuageVspDao.findById(nuageVspDeviceId);
+ if (nuageVspDevice == null) {
+ throw new InvalidParameterValueException("Could not find Nuage Vsp device with id: " + nuageVspDeviceId);
+ }
+ responseList.add(nuageVspDevice);
+ } else {
+ PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+ if (physicalNetwork == null) {
+ throw new InvalidParameterValueException("Could not find a physical network with id: " + physicalNetworkId);
+ }
+ responseList = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
+ }
+
+ return responseList;
+ }
+
+ @Override
+ public boolean configure(String name, Map<String, Object> 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");
+ }
+ 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;
+ }
+ };
+ 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");
+ }
+ }
+
+ public class NuageVspSyncTask implements Runnable {
+
+ private String nuageVspEntity;
+
+ public NuageVspSyncTask(String nuageVspEntity) {
+ this.nuageVspEntity = nuageVspEntity;
+ }
+
+ public String getNuageVspEntity() {
+ return nuageVspEntity;
+ }
+
+ @Override
+ public void run() {
+ nuageVspSync.syncWithNuageVsp(nuageVspEntity);
+ }
+ }
+
+ @Override
+ public String getConfigComponentName() {
+ return NuageVspManager.class.getSimpleName();
+ }
+
+ @Override
+ public ConfigKey<?>[] getConfigKeys() {
+ return new ConfigKey<?>[] {NuageVspSyncWorkers, NuageVspSyncInterval};
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..65c8ae9
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/resource/NuageVspResource.java
@@ -0,0 +1,467 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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.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.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 com.cloud.resource.ServerResource;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class NuageVspResource extends ManagerBase implements ServerResource {
+ private static final Logger s_logger = Logger.getLogger(NuageVspResource.class);
+
+ private String _name;
+ private String _guid;
+ private String _zoneId;
+ private String[] _cmsUserInfo;
+ private String _relativePath;
+ private int _numRetries;
+ private int _retryInterval;
+
+ protected NuageVspApiClient _nuageVspApiClient;
+ protected NuageVspGuruClient _nuageVspGuruClient;
+ protected NuageVspElementClient _nuageVspElementClient;
+ protected NuageVspSyncClient _nuageVspSyncClient;
+ 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<String, Object> params) throws ConfigurationException {
+
+ _name = (String)params.get("name");
+ if (_name == null) {
+ throw new ConfigurationException("Unable to find name");
+ }
+
+ _guid = (String)params.get("guid");
+ if (_guid == null) {
+ throw new ConfigurationException("Unable to find the guid");
+ }
+
+ _zoneId = (String)params.get("zoneId");
+ if (_zoneId == null) {
+ throw new ConfigurationException("Unable to find zone");
+ }
+
+ String hostname = (String)params.get("hostname");
+ if (hostname == null) {
+ throw new ConfigurationException("Unable to find hostname");
+ }
+
+ String cmsUser = (String)params.get("cmsuser");
+ if (cmsUser == null) {
+ throw new ConfigurationException("Unable to find CMS username");
+ }
+
+ String cmsUserPassBase64 = (String)params.get("cmsuserpass");
+ if (cmsUserPassBase64 == null) {
+ throw new ConfigurationException("Unable to find CMS password");
+ }
+
+ String port = (String)params.get("port");
+ if (port == null) {
+ 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 {
+ throw new ConfigurationException("Unable to find API version");
+ }
+
+ String retryCount = (String)params.get("retrycount");
+ if ((retryCount != null) && (!retryCount.isEmpty())) {
+ try {
+ _numRetries = Integer.parseInt(retryCount);
+ } catch (NumberFormatException ex) {
+ throw new ConfigurationException("Number of retries has to be between 1 and 10");
+ }
+ if ((_numRetries < 1) || (_numRetries > 10)) {
+ throw new ConfigurationException("Number of retries has to be between 1 and 10");
+ }
+ } else {
+ throw new ConfigurationException("Unable to find number of retries");
+ }
+
+ String retryInterval = (String)params.get("retryinterval");
+ if ((retryInterval != null) && (!retryInterval.isEmpty())) {
+ try {
+ _retryInterval = Integer.parseInt(retryInterval);
+ } catch (NumberFormatException ex) {
+ throw new ConfigurationException("Retry interval has to be between 0 and 10000 ms");
+ }
+ if ((_retryInterval < 0) || (_retryInterval > 10000)) {
+ throw new ConfigurationException("Retry interval has to be between 0 and 10000 ms");
+ }
+ } else {
+ throw new ConfigurationException("Unable to find retry interval");
+ }
+
+ _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);
+ }
+
+ try {
+ login();
+ } catch (Exception e) {
+ s_logger.error("Failed to login to Nuage VSD on " + name + " as user " + cmsUser + " Exception " + e.getMessage());
+ throw new CloudRuntimeException("Failed to login to Nuage VSD on " + name + " as user " + cmsUser, e);
+ }
+
+ return true;
+ }
+
+ protected void login() throws Exception {
+ isNuageVspApiLoaded();
+ _nuageVspApiClient.login();
+ }
+
+ protected <A extends NuageVspApiClient, B extends NuageVspElementClient, C extends NuageVspSyncClient, D extends NuageVspGuruClient> void loadNuageClient() throws Exception {
+
+ 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);
+ _isNuageVspClientLoaded = true;
+ } catch (Exception 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);
+ }
+
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public Host.Type getType() {
+ return Host.Type.L2Networking;
+ }
+
+ @Override
+ public StartupCommand[] initialize() {
+ StartupVspCommand sc = new StartupVspCommand();
+ sc.setGuid(_guid);
+ sc.setName(_name);
+ sc.setDataCenter(_zoneId);
+ sc.setPod("");
+ sc.setPrivateIpAddress("");
+ sc.setStorageIpAddress("");
+ sc.setVersion(NuageVspResource.class.getPackage().getImplementationVersion());
+ return new StartupCommand[] {sc};
+ }
+
+ @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");
+ 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());
+ return null;
+ }
+ return new PingCommand(Host.Type.L2Networking, id);
+ }
+
+ @Override
+ public Answer executeRequest(Command cmd) {
+ if (cmd instanceof ReadyCommand) {
+ return executeRequest((ReadyCommand)cmd);
+ } else if (cmd instanceof MaintainCommand) {
+ return executeRequest((MaintainCommand)cmd);
+ } else if (cmd instanceof VspResourceCommand) {
+ return executeRequest((VspResourceCommand)cmd);
+ }
+ //Guru commands
+ else if (cmd instanceof ImplementNetworkVspCommand) {
+ 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) {
+ return executeRequest((ApplyAclRuleVspCommand)cmd);
+ } else if (cmd instanceof ApplyStaticNatVspCommand) {
+ return executeRequest((ApplyStaticNatVspCommand)cmd);
+ } else if (cmd instanceof ShutDownVpcVspCommand) {
+ return executeRequest((ShutDownVpcVspCommand)cmd);
+ }
+ //Sync Commands
+ else if (cmd instanceof SyncVspCommand) {
+ return executeRequest((SyncVspCommand)cmd);
+ }
+ s_logger.debug("Received unsupported command " + cmd.toString());
+ return Answer.createUnsupportedCommandAnswer(cmd);
+ }
+
+ @Override
+ public void disconnected() {
+ }
+
+ @Override
+ public IAgentControl getAgentControl() {
+ return null;
+ }
+
+ @Override
+ public void setAgentControl(IAgentControl agentControl) {
+ }
+
+ private Answer executeRequest(ReadyCommand cmd) {
+ return new ReadyAnswer(cmd);
+ }
+
+ private Answer executeRequest(MaintainCommand cmd) {
+ return new MaintainAnswer(cmd);
+ }
+
+ private Answer executeRequest(VspResourceCommand cmd) {
+ try {
+ isNuageVspApiLoaded();
+ if (cmd.getRequestType().equalsIgnoreCase("GETALL") || cmd.getRequestType().equalsIgnoreCase("GET") || cmd.getRequestType().equalsIgnoreCase("GETRELATED")) {
+ String resourceInfo = _nuageVspApiClient.executeRestApi(cmd.getRequestType(), cmd.getResource(), cmd.getResourceId(), cmd.getChildResource(),
+ cmd.getEntityDetails(), cmd.getResourceFilter(), cmd.getProxyUserUuid(), cmd.getProxyUserDomainuuid());
+ return new VspResourceAnswer(cmd, resourceInfo, "Executed Issue Resource command");
+ }
+ return new VspResourceAnswer(cmd, false, cmd.getRequestType() + " is not yet supported");
+ } catch (Exception e) {
+ return new VspResourceAnswer(cmd, e);
+ }
+ }
+
+ private Answer executeRequest(ImplementNetworkVspCommand cmd) {
+ 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);
+ }
+ }
+
+ private Answer executeRequest(ReserveVmInterfaceVspCommand cmd) {
+ try {
+ isNuageVspGuruLoaded();
+ List<Map<String, String>> 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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ private Answer executeRequest(SyncVspCommand cmd) {
+ try {
+ isNuageVspSyncLoaded();
+ _nuageVspSyncClient.syncWithNuageVsp(cmd.getNuageVspEntity());
+ return new SyncVspAnswer(cmd, true, "Synced " + cmd.getNuageVspEntity() + " in VSP");
+ } catch (Exception e) {
+ return new SyncVspAnswer(cmd, e);
+ }
+ }
+
+ protected void isNuageVspApiLoaded() throws Exception {
+ if (!_isNuageVspClientLoaded || _nuageVspApiClient == null) {
+ throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+ }
+ }
+
+ protected void isNuageVspGuruLoaded() throws Exception {
+ if (!_isNuageVspClientLoaded || _nuageVspGuruClient == null) {
+ throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+ }
+ }
+
+ protected void isNuageVspElementLoaded() throws Exception {
+ if (!_isNuageVspClientLoaded || _nuageVspElementClient == null) {
+ throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+ }
+ }
+
+ protected void isNuageVspSyncLoaded() throws Exception {
+ if (!_isNuageVspClientLoaded || _nuageVspSyncClient == null) {
+ throw new Exception(NUAGE_VSP_PLUGIN_ERROR_MESSAGE);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
new file mode 100644
index 0000000..4e1cc43
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSync.java
@@ -0,0 +1,26 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.sync;
+
+
+public interface NuageVspSync {
+
+ public void syncWithNuageVsp(String nuageVspEntity);
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f3d19c1
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/sync/NuageVspSyncImpl.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.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.sync.SyncVspCommand;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.network.NuageVspDeviceVO;
+import com.cloud.network.dao.NuageVspDao;
+
+@Component
+public class NuageVspSyncImpl implements NuageVspSync {
+
+ private static final Logger s_logger = Logger.getLogger(NuageVspSyncImpl.class);
+
+ @Inject
+ NuageVspDao _nuageVspDao;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ AgentManager _agentMgr;
+
+ public void syncWithNuageVsp(String nuageVspEntity) {
+ //Get the NuageVspDevice and get the host information.
+ //This information is used to query VSP and synch the corresponding
+ //entities
+ List<NuageVspDeviceVO> 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());
+ }
+ }
+ } catch (Exception e) {
+ s_logger.warn("Failed to clean up " + nuageVspEntity + " in Vsp " + e.getMessage());
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..76b9823
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/NuageVspPluginClientLoader.java
@@ -0,0 +1,46 @@
+//
+// 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 net.nuage.vsp.acs;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+public class NuageVspPluginClientLoader {
+
+ private static NuageVspPluginClientLoader nuageVspPluginClientClassloader;
+ private ClassLoader loader = null;
+
+ private NuageVspPluginClientLoader(String nuagePluginClientJarLocation) {
+ try {
+ loader = URLClassLoader.newInstance(new URL[] {new URL("jar:file:" + nuagePluginClientJarLocation + "!/")},
+ getClass().getClassLoader());
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static ClassLoader getClassLoader(String nuagePluginClientJarLocation) {
+ if (nuageVspPluginClientClassloader == null) {
+ nuageVspPluginClientClassloader = new NuageVspPluginClientLoader(nuagePluginClientJarLocation);
+ }
+ return nuageVspPluginClientClassloader.loader;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d584c6f
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspApiClient.java
@@ -0,0 +1,30 @@
+//
+// 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 net.nuage.vsp.acs.client;
+
+public interface NuageVspApiClient {
+
+ public void login() throws Exception;
+
+ public void setNuageVspHost(String restRelativePath, String[] cmsUserInfo, int noofRetry, int retryInterval);
+
+ public String executeRestApi(String method, String resource, String resourceId, String childResource, Object entityDetails, String resourceFilter, String proxyUserUuid,
+ String proxyUserDomainuuid) throws Exception;
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..27c613b
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspElementClient.java
@@ -0,0 +1,36 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package net.nuage.vsp.acs.client;
+
+import java.util.List;
+import java.util.Map;
+
+public interface NuageVspElementClient {
+
+ public void applyStaticNats(String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> staticNatDetails) throws Exception;
+
+ public void applyAclRules(String networkUuid, String networkDomainUuid, String vpcOrSubnetUuid, boolean isL3Network, List<Map<String, Object>> aclRules, boolean isVpc, long networkId)
+ throws Exception;
+
+ public void shutDownVpc(String domainUuid, String vpcUuid) throws Exception;
+
+ public <C extends NuageVspApiClient> void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..3c7f33d
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspGuruClient.java
@@ -0,0 +1,44 @@
+//
+// 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 net.nuage.vsp.acs.client;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+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<String> ipAddressRange) throws Exception;
+
+ public List<Map<String, String>> 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;
+
+ public void release(String networkUuid, String vmUuid, String vmInstanceName) throws Exception;
+
+ public void deallocate(String networkUuid, String nicFrmDdUuid, String nicMacAddress, String nicIp4Address, boolean isL3Network, String vpcUuid, String networksDomainUuid,
+ String vmInstanceName, String vmUuid) throws Exception;
+
+ public void trash(String domainUuid, String networkUuid, boolean isL3Network, String vpcUuid) throws Exception;
+
+ public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..b9400f1
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/src/net/nuage/vsp/acs/client/NuageVspSyncClient.java
@@ -0,0 +1,27 @@
+//
+// 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 net.nuage.vsp.acs.client;
+
+public interface NuageVspSyncClient {
+
+ public void syncWithNuageVsp(String nuageVspEntity) throws Exception;
+
+ public void setNuageVspApiClient(NuageVspApiClient nuageVspApiClient);
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..08d685f
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/element/NuageVspElementTest.java
@@ -0,0 +1,280 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.element;
+
+import 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.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;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.network.Network;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+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.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NuageVspDao;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.StaticNat;
+import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.resource.ResourceManager;
+import com.cloud.user.Account;
+import com.cloud.vm.ReservationContext;
+
+public class NuageVspElementTest {
+
+ private static final long NETWORK_ID = 42L;
+ NuageVspElement element = new NuageVspElement();
+ NetworkOrchestrationService networkManager = mock(NetworkOrchestrationService.class);
+ NetworkModel networkModel = mock(NetworkModel.class);
+ NetworkServiceMapDao ntwkSrvcDao = mock(NetworkServiceMapDao.class);
+ AgentManager agentManager = mock(AgentManager.class);
+ HostDao hostDao = mock(HostDao.class);
+ NuageVspDao nuageVspDao = mock(NuageVspDao.class);
+ DomainDao domainDao = mock(DomainDao.class);
+ NetworkOfferingDao ntwkOfferingDao = mock(NetworkOfferingDao.class);
+ NetworkOfferingServiceMapDao ntwkOfferingSrvcDao = mock(NetworkOfferingServiceMapDao.class);
+
+ Answer<Object> genericAnswer = new Answer<Object>() {
+ public Object answer(InvocationOnMock invocation) {
+ return null;
+ }
+ };
+
+ @Before
+ public void setUp() throws ConfigurationException {
+ element._resourceMgr = mock(ResourceManager.class);
+ element._ntwkSrvcDao = ntwkSrvcDao;
+ element._networkModel = networkModel;
+ element._agentMgr = agentManager;
+ element._hostDao = hostDao;
+ element._nuageVspDao = nuageVspDao;
+ element._ntwkOfferingSrvcDao = ntwkOfferingSrvcDao;
+ element._domainDao = domainDao;
+ element._ntwkOfferingDao = ntwkOfferingDao;
+
+ // Standard responses
+ when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true);
+
+ element.configure("NuageVspTestElement", Collections.<String, Object> emptyMap());
+ }
+
+ @Test
+ public void testCcanHandle() {
+ final Network net = mock(Network.class);
+ when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
+ when(net.getId()).thenReturn(NETWORK_ID);
+
+ when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(true);
+ // Golden path
+ assertTrue(element.canHandle(net, Service.Connectivity));
+
+ when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vlan);
+ // Only broadcastdomaintype Vsp is supported
+ assertFalse(element.canHandle(net, Service.Connectivity));
+
+ when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
+ when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(false);
+ // No NuageVsp provider in the network
+ assertFalse(element.canHandle(net, Service.Connectivity));
+
+ when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(false);
+ when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(true);
+ // NusageVsp provider does not provide Connectivity for this network
+ assertFalse(element.canHandle(net, Service.Connectivity));
+
+ when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true);
+ // Only service Connectivity is supported
+ assertFalse(element.canHandle(net, Service.Dhcp));
+
+ }
+
+ @Test
+ public void testImplement() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException, URISyntaxException {
+ final Network network = mock(Network.class);
+ when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
+ when(network.getId()).thenReturn(NETWORK_ID);
+ when(network.getBroadcastUri()).thenReturn(new URI(""));
+ when(networkModel.isProviderForNetwork(Provider.NuageVsp, NETWORK_ID)).thenReturn(true);
+ when(ntwkSrvcDao.canProviderSupportServiceInNetwork(NETWORK_ID, Service.Connectivity, Provider.NuageVsp)).thenReturn(true);
+
+ final NetworkOffering offering = mock(NetworkOffering.class);
+ when(offering.getId()).thenReturn(NETWORK_ID);
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+
+ DeployDestination deployDest = mock(DeployDestination.class);
+
+ final Domain dom = mock(Domain.class);
+ when(dom.getName()).thenReturn("domain");
+ 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);
+
+ assertTrue(element.implement(network, offering, deployDest, context));
+ }
+
+ @Test
+ public void testVerifyServiceCombination() {
+ Set<Service> services = new HashSet<Service>();
+ services.add(Service.Dhcp);
+ services.add(Service.StaticNat);
+ services.add(Service.SourceNat);
+ services.add(Service.Connectivity);
+ services.add(Service.Firewall);
+ assertTrue(element.verifyServicesCombination(services));
+
+ services = new HashSet<Service>();
+ services.add(Service.Dhcp);
+ services.add(Service.StaticNat);
+ services.add(Service.Connectivity);
+ services.add(Service.Firewall);
+ assertFalse(element.verifyServicesCombination(services));
+ }
+
+ @Test
+ public void testApplyStaticNats() throws CloudException {
+ final Network network = mock(Network.class);
+ when(network.getUuid()).thenReturn("aaaaaa");
+ when(network.getVpcId()).thenReturn(null);
+ when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
+ when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(network.getDomainId()).thenReturn(NETWORK_ID);
+
+ final DomainVO domVo = mock(DomainVO.class);
+ when(domainDao.findById(41l)).thenReturn(domVo);
+
+ final NetworkOfferingVO ntwkoffer = mock(NetworkOfferingVO.class);
+ when(ntwkoffer.getId()).thenReturn(NETWORK_ID);
+ when(ntwkOfferingDao.findById(NETWORK_ID)).thenReturn(ntwkoffer);
+ when(element.isL3Network(NETWORK_ID)).thenReturn(true);
+
+ 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(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
+ final ApplyStaticNatVspAnswer answer = mock(ApplyStaticNatVspAnswer.class);
+ when(answer.getResult()).thenReturn(true);
+ when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+ assertTrue(element.applyStaticNats(network, new ArrayList<StaticNat>()));
+ }
+
+ @Test
+ public void testApplyFWRules() throws Exception {
+ final Network network = mock(Network.class);
+ when(network.getUuid()).thenReturn("aaaaaa");
+ when(network.getVpcId()).thenReturn(null);
+ when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
+ when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(network.getDomainId()).thenReturn(NETWORK_ID);
+
+ final NetworkOfferingVO ntwkoffer = mock(NetworkOfferingVO.class);
+ when(ntwkoffer.getId()).thenReturn(NETWORK_ID);
+ when(ntwkoffer.getEgressDefaultPolicy()).thenReturn(true);
+ when(ntwkOfferingDao.findById(NETWORK_ID)).thenReturn(ntwkoffer);
+
+ 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(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
+
+ final ApplyAclRuleVspAnswer answer = mock(ApplyAclRuleVspAnswer.class);
+ when(answer.getResult()).thenReturn(true);
+ when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+ assertTrue(element.applyFWRules(network, new ArrayList<FirewallRule>()));
+ }
+
+ @Test
+ public void testApplyNetworkACL() throws Exception {
+ final Network network = mock(Network.class);
+ when(network.getUuid()).thenReturn("aaaaaa");
+ when(network.getVpcId()).thenReturn(null);
+ when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
+ when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(network.getDomainId()).thenReturn(NETWORK_ID);
+
+ final NetworkOfferingVO ntwkoffer = mock(NetworkOfferingVO.class);
+ when(ntwkoffer.getId()).thenReturn(NETWORK_ID);
+ when(ntwkoffer.getEgressDefaultPolicy()).thenReturn(true);
+ when(ntwkOfferingDao.findById(NETWORK_ID)).thenReturn(ntwkoffer);
+
+ 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(domainDao.findById(NETWORK_ID)).thenReturn(mock(DomainVO.class));
+ final ApplyAclRuleVspAnswer answer = mock(ApplyAclRuleVspAnswer.class);
+ when(answer.getResult()).thenReturn(true);
+ when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+ assertTrue(element.applyNetworkACLs(network, new ArrayList<NetworkACLItem>()));
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/03de9cc3/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f879f09
--- /dev/null
+++ b/plugins/network-elements/nuage-vsp/test/com/cloud/network/guru/NuageVspGuestNetworkGuruTest.java
@@ -0,0 +1,386 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.network.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.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;
+import com.cloud.dc.dao.DataCenterDao;
+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.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.network.Network;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
+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.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.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+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.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;
+
+public class NuageVspGuestNetworkGuruTest {
+ private static final long NETWORK_ID = 42L;
+ PhysicalNetworkDao physnetdao = mock(PhysicalNetworkDao.class);
+ DataCenterDao dcdao = mock(DataCenterDao.class);
+ NetworkOfferingServiceMapDao nosd = mock(NetworkOfferingServiceMapDao.class);
+ AgentManager agentManager = mock(AgentManager.class);
+ NetworkOrchestrationService netmgr = mock(NetworkOrchestrationService.class);
+ NetworkModel networkModel = mock(NetworkModel.class);
+ AccountDao accountDao = mock(AccountDao.class);
+ DomainDao domainDao = mock(DomainDao.class);
+ NicDao nicDao = mock(NicDao.class);
+ NetworkOfferingDao ntwkOfferDao = mock(NetworkOfferingDao.class);
+ NuageVspDao nuageVspDao = mock(NuageVspDao.class);
+ HostDao hostDao = mock(HostDao.class);
+ NetworkDao networkDao = mock(NetworkDao.class);
+
+ NetworkDao netdao = mock(NetworkDao.class);
+ NuageVspGuestNetworkGuru guru;
+
+ @Before
+ public void setUp() {
+ guru = new NuageVspGuestNetworkGuru();
+ ((GuestNetworkGuru)guru)._physicalNetworkDao = physnetdao;
+ guru._physicalNetworkDao = physnetdao;
+ guru._nuageVspDao = nuageVspDao;
+ guru._dcDao = dcdao;
+ guru._ntwkOfferingSrvcDao = nosd;
+ guru._networkModel = networkModel;
+ guru._hostDao = hostDao;
+ guru._agentMgr = agentManager;
+ guru._networkDao = netdao;
+ guru._networkDao = networkDao;
+ guru._accountDao = accountDao;
+ guru._domainDao = domainDao;
+ guru._nicDao = nicDao;
+ guru._ntwkOfferingDao = ntwkOfferDao;
+
+ 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);
+ }
+
+ @Test
+ public void testCanHandle() {
+ final NetworkOffering offering = mock(NetworkOffering.class);
+ when(offering.getId()).thenReturn(NETWORK_ID);
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+
+ final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class);
+ when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VSP"}));
+ when(physnet.getId()).thenReturn(NETWORK_ID);
+
+ when(nosd.areServicesSupportedByNetworkOffering(NETWORK_ID, Service.Connectivity)).thenReturn(true);
+
+ assertTrue(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
+
+ // Not supported TrafficType != Guest
+ when(offering.getTrafficType()).thenReturn(TrafficType.Management);
+ assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
+
+ // Not supported: GuestType Shared
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getGuestType()).thenReturn(GuestType.Shared);
+ assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
+
+ // Not supported: Basic networking
+ when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+ assertFalse(guru.canHandle(offering, NetworkType.Basic, physnet) == true);
+
+ // Not supported: IsolationMethod != STT
+ when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VLAN"}));
+ assertFalse(guru.canHandle(offering, NetworkType.Advanced, physnet) == true);
+
+ }
+
+ @Test
+ public void testDesign() {
+ final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class);
+ when(physnetdao.findById((Long)any())).thenReturn(physnet);
+ when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VSP"}));
+ when(physnet.getId()).thenReturn(NETWORK_ID);
+
+ final NuageVspDeviceVO device = mock(NuageVspDeviceVO.class);
+ when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[] {device}));
+ when(device.getId()).thenReturn(1L);
+
+ final NetworkOffering offering = mock(NetworkOffering.class);
+ when(offering.getId()).thenReturn(NETWORK_ID);
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+
+ when(nosd.areServicesSupportedByNetworkOffering(NETWORK_ID, Service.Connectivity)).thenReturn(true);
+
+ final DeploymentPlan plan = mock(DeploymentPlan.class);
+ final Network network = mock(Network.class);
+ final Account account = mock(Account.class);
+
+ final Network designednetwork = guru.design(offering, plan, network, account);
+ assertTrue(designednetwork != null);
+ assertTrue(designednetwork.getBroadcastDomainType() == BroadcastDomainType.Vsp);
+ }
+
+ @Test
+ public void testDesignNoElementOnPhysicalNetwork() {
+ final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class);
+ when(physnetdao.findById((Long)any())).thenReturn(physnet);
+ when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"STT"}));
+ when(physnet.getId()).thenReturn(NETWORK_ID);
+
+ mock(NuageVspDeviceVO.class);
+ when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.<NuageVspDeviceVO> emptyList());
+
+ final NetworkOffering offering = mock(NetworkOffering.class);
+ when(offering.getId()).thenReturn(NETWORK_ID);
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+
+ final DeploymentPlan plan = mock(DeploymentPlan.class);
+ final Network network = mock(Network.class);
+ final Account account = mock(Account.class);
+
+ final Network designednetwork = guru.design(offering, plan, network, account);
+ assertTrue(designednetwork == null);
+ }
+
+ @Test
+ public void testDesignNoIsolationMethodVSP() {
+ final PhysicalNetworkVO physnet = mock(PhysicalNetworkVO.class);
+ when(physnetdao.findById((Long)any())).thenReturn(physnet);
+ when(physnet.getIsolationMethods()).thenReturn(Arrays.asList(new String[] {"VLAN"}));
+ when(physnet.getId()).thenReturn(NETWORK_ID);
+
+ mock(NuageVspDeviceVO.class);
+ when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Collections.<NuageVspDeviceVO> emptyList());
+
+ final NetworkOffering offering = mock(NetworkOffering.class);
+ when(offering.getId()).thenReturn(NETWORK_ID);
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getGuestType()).thenReturn(GuestType.Isolated);
+
+ final DeploymentPlan plan = mock(DeploymentPlan.class);
+ final Network network = mock(Network.class);
+ final Account account = mock(Account.class);
+
+ final Network designednetwork = guru.design(offering, plan, network, account);
+ assertTrue(designednetwork == null);
+ }
+
+ @Test
+ public void testReserve() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException, URISyntaxException {
+ final Network network = mock(Network.class);
+ when(network.getUuid()).thenReturn("aaaaaa");
+ when(network.getDataCenterId()).thenReturn(NETWORK_ID);
+ when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
+ when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(network.getDomainId()).thenReturn(NETWORK_ID);
+ when(network.getAccountId()).thenReturn(NETWORK_ID);
+ when(network.getVpcId()).thenReturn(null);
+ when(network.getBroadcastUri()).thenReturn(new URI("vsp://aaaaaa-aavvv/10.1.1.1"));
+
+ final DataCenterVO dataCenter = mock(DataCenterVO.class);
+ when(dcdao.findById(NETWORK_ID)).thenReturn(dataCenter);
+ final AccountVO networksAccount = mock(AccountVO.class);
+ when(networksAccount.getUuid()).thenReturn("aaaa-abbbb");
+ when(networksAccount.getType()).thenReturn(Account.ACCOUNT_TYPE_NORMAL);
+ when(accountDao.findById(NETWORK_ID)).thenReturn(networksAccount);
+ final DomainVO networksDomain = mock(DomainVO.class);
+ when(networksDomain.getUuid()).thenReturn("aaaaa-bbbbb");
+ when(domainDao.findById(NETWORK_ID)).thenReturn(networksDomain);
+
+ final NicVO nicvo = mock(NicVO.class);
+ when(nicvo.getId()).thenReturn(NETWORK_ID);
+ when(nicvo.getMacAddress()).thenReturn("aa-aa-aa-aa-aa-aa");
+ when(nicvo.getUuid()).thenReturn("aaaa-fffff");
+ when(nicDao.findById(NETWORK_ID)).thenReturn(nicvo);
+
+ final VirtualMachineProfile vm = mock(VirtualMachineProfile.class);
+ when(vm.getType()).thenReturn(VirtualMachine.Type.User);
+ when(vm.getInstanceName()).thenReturn("");
+ when(vm.getUuid()).thenReturn("aaaa-bbbbb");
+
+ NicProfile nicProfile = mock(NicProfile.class);
+ when(nicProfile.getUuid()).thenReturn("aaa-bbbb");
+ when(nicProfile.getId()).thenReturn(NETWORK_ID);
+ when(nicProfile.getMacAddress()).thenReturn("aa-aa-aa-aa-aa-aa");
+
+ final NetworkOfferingVO ntwkoffering = mock(NetworkOfferingVO.class);
+ when(ntwkoffering.getId()).thenReturn(NETWORK_ID);
+ when(ntwkOfferDao.findById(NETWORK_ID)).thenReturn(ntwkoffering);
+
+ final HostVO host = mock(HostVO.class);
+ when(host.getId()).thenReturn(NETWORK_ID);
+ final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class);
+ when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID);
+ when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[] {nuageVspDevice}));
+ when(hostDao.findById(NETWORK_ID)).thenReturn(host);
+
+ when(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<Map<String, String>>());
+ 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);
+ when(answer.getResult()).thenReturn(true);
+ when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+
+ guru.release(nicProfile, vm, "aaaaa-fffff");
+ }
+
+ @Test
+ public void testImplementNetwork() throws URISyntaxException, InsufficientVirtualNetworkCapacityException {
+ final Network network = mock(Network.class);
+ when(network.getId()).thenReturn(NETWORK_ID);
+ when(network.getUuid()).thenReturn("aaaaaa");
+ when(network.getDataCenterId()).thenReturn(NETWORK_ID);
+ when(network.getNetworkOfferingId()).thenReturn(NETWORK_ID);
+ when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
+ when(network.getDomainId()).thenReturn(NETWORK_ID);
+ when(network.getAccountId()).thenReturn(NETWORK_ID);
+ when(network.getVpcId()).thenReturn(null);
+ when(network.getState()).thenReturn(com.cloud.network.Network.State.Implementing);
+ when(network.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(network.getMode()).thenReturn(Mode.Static);
+ when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Vsp);
+ when(network.getBroadcastUri()).thenReturn(new URI("vsp://aaaaaa-aavvv/10.1.1.1"));
+ when(network.getGateway()).thenReturn("10.1.1.1");
+ when(network.getCidr()).thenReturn("10.1.1.0/24");
+ when(network.getName()).thenReturn("iso");
+
+ final NetworkOffering offering = mock(NetworkOffering.class);
+ when(offering.getId()).thenReturn(NETWORK_ID);
+ when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
+ when(offering.getTags()).thenReturn("aaaa");
+ when(offering.getEgressDefaultPolicy()).thenReturn(true);
+
+ when(networkModel.findPhysicalNetworkId(NETWORK_ID, "aaa", TrafficType.Guest)).thenReturn(NETWORK_ID);
+
+ final ReservationContext reserveContext = mock(ReservationContext.class);
+ final Domain domain = mock(Domain.class);
+ when(reserveContext.getDomain()).thenReturn(domain);
+ when(domain.getName()).thenReturn("aaaaa");
+ final Account account = mock(Account.class);
+ when(account.getAccountId()).thenReturn(NETWORK_ID);
+ when(reserveContext.getAccount()).thenReturn(account);
+ final DomainVO domainVo = mock(DomainVO.class);
+ when(domainDao.findById(NETWORK_ID)).thenReturn(domainVo);
+ final AccountVO accountVo = mock(AccountVO.class);
+ when(accountDao.findById(NETWORK_ID)).thenReturn(accountVo);
+
+ final HostVO host = mock(HostVO.class);
+ when(host.getId()).thenReturn(NETWORK_ID);
+ final NuageVspDeviceVO nuageVspDevice = mock(NuageVspDeviceVO.class);
+ when(nuageVspDevice.getHostId()).thenReturn(NETWORK_ID);
+ when(nuageVspDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(Arrays.asList(new NuageVspDeviceVO[] {nuageVspDevice}));
+ when(hostDao.findById(NETWORK_ID)).thenReturn(host);
+
+ final ImplementNetworkVspAnswer answer = mock(ImplementNetworkVspAnswer.class);
+ when(answer.getResult()).thenReturn(true);
+ when(agentManager.easySend(eq(NETWORK_ID), (Command)any())).thenReturn(answer);
+
+ final DataCenter dc = mock(DataCenter.class);
+ when(dc.getId()).thenReturn(NETWORK_ID);
+ final DeployDestination deployDest = mock(DeployDestination.class);
+ when(deployDest.getDataCenter()).thenReturn(dc);
+ guru.implement(network, offering, deployDest, reserveContext);
+ }
+
+}