http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8d4dc812/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java index 1ddc106..26e36b4 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java @@ -20,8 +20,10 @@ package com.cloud.util; import com.cloud.NuageTest; +import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.VlanVO; import com.cloud.dc.dao.VlanDao; +import com.cloud.dc.dao.VlanDetailsDao; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.network.Network; @@ -58,6 +60,8 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -77,6 +81,7 @@ public class NuageVspEntityBuilderTest extends NuageTest { private NetworkOfferingDao _networkOfferingDao = mock(NetworkOfferingDao.class); private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao = mock(NetworkOfferingServiceMapDao.class); private VlanDao _vlanDao = mock(VlanDao.class); + private VlanDetailsDao _vlanDetailsDao = mock(VlanDetailsDao.class); private IPAddressDao _ipAddressDao = mock(IPAddressDao.class); private NetworkDetailsDao _networkDetailsDao = mock(NetworkDetailsDao.class); private NuageVspEntityBuilder _nuageVspEntityBuilder = new NuageVspEntityBuilder(); @@ -87,6 +92,7 @@ public class NuageVspEntityBuilderTest extends NuageTest { private NetworkOfferingVO _mockedSharedNetworkOffering = mock(NetworkOfferingVO.class); private NetworkOfferingVO _mockedL2NetworkOffering = mock(NetworkOfferingVO.class); private VlanVO _mockedVlan = mock(VlanVO.class); + private VlanDetailsVO _mockedVlanDetail = mock(VlanDetailsVO.class); private VpcVO _mockedVpc = mock(VpcVO.class); private NetworkVO _mockedNetwork = mock(NetworkVO.class); private NetworkVO _mockedVpcNetwork = mock(NetworkVO.class); @@ -111,6 +117,7 @@ public class NuageVspEntityBuilderTest extends NuageTest { _nuageVspEntityBuilder._networkOfferingDao = _networkOfferingDao; _nuageVspEntityBuilder._networkOfferingServiceMapDao = _networkOfferingServiceMapDao; _nuageVspEntityBuilder._vlanDao = _vlanDao; + _nuageVspEntityBuilder._vlanDetailsDao = _vlanDetailsDao; _nuageVspEntityBuilder._configurationDao = _configurationDao; _nuageVspEntityBuilder._ipAddressDao = _ipAddressDao; _nuageVspEntityBuilder._networkModel = _networkModel; @@ -122,6 +129,7 @@ public class NuageVspEntityBuilderTest extends NuageTest { setUpMockedNetworkOffering(_mockedSharedNetworkOffering, Network.GuestType.Shared); setUpMockedNetworkOffering(_mockedL2NetworkOffering, Network.GuestType.Isolated); setUpMockedVlan(); + setUpMockedVlanDetail(); setUpMockedVpc(); setUpMockedNetwork(_mockedNetwork, NETWORK_OFFERING_ID, null); setUpMockedNetwork(_mockedVpcNetwork, NETWORK_OFFERING_ID, VPC_ID); @@ -319,6 +327,10 @@ public class NuageVspEntityBuilderTest extends NuageTest { when(_mockedVlan.getIpRange()).thenReturn("192.168.2.2-192.168.2.200"); } + private void setUpMockedVlanDetail() { + when(_mockedVlanDetail.getValue()).thenReturn("true"); + } + private void setUpMockedVpc() { when(_mockedVpc.getUuid()).thenReturn("vpcUuid"); when(_mockedVpc.getName()).thenReturn("vpcName"); @@ -406,6 +418,7 @@ public class NuageVspEntityBuilderTest extends NuageTest { when(_networkModel.areServicesSupportedByNetworkOffering(SHARED_NETWORK_OFFERING_ID, Network.Service.Firewall)).thenReturn(true); when(_networkModel.areServicesSupportedByNetworkOffering(L2_NETWORK_OFFERING_ID, Network.Service.Firewall)).thenReturn(true); when(_vlanDao.listVlansByNetworkId(NETWORK_ID)).thenReturn(Lists.newArrayList(_mockedVlan)); + when(_vlanDetailsDao.findDetail(anyLong(), anyString())).thenReturn(_mockedVlanDetail); when(_vpcDao.findById(VPC_ID)).thenReturn(_mockedVpc); when(_ipAddressDao.findById(SOURCE_IP_ADDRESS_ID)).thenReturn(_mockedStaticNatIp); }
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8d4dc812/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 1b4b88f..e661a9b 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -634,83 +634,92 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan) { - Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId()); + return createVlanIpRangeResponse(VlanIpRangeResponse.class, vlan); + } - VlanIpRangeResponse vlanResponse = new VlanIpRangeResponse(); - vlanResponse.setId(vlan.getUuid()); - if (vlan.getVlanType() != null) { - vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork)); - } - vlanResponse.setVlan(vlan.getVlanTag()); - DataCenter zone = ApiDBUtils.findZoneById(vlan.getDataCenterId()); - if (zone != null) { - vlanResponse.setZoneId(zone.getUuid()); - } + @Override + public VlanIpRangeResponse createVlanIpRangeResponse(Class<? extends VlanIpRangeResponse> subClass, Vlan vlan) { + try { + Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId()); - if (podId != null) { - HostPodVO pod = ApiDBUtils.findPodById(podId); - if (pod != null) { - vlanResponse.setPodId(pod.getUuid()); - vlanResponse.setPodName(pod.getName()); + VlanIpRangeResponse vlanResponse = subClass.newInstance(); + vlanResponse.setId(vlan.getUuid()); + if (vlan.getVlanType() != null) { + vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork)); + } + vlanResponse.setVlan(vlan.getVlanTag()); + DataCenter zone = ApiDBUtils.findZoneById(vlan.getDataCenterId()); + if (zone != null) { + vlanResponse.setZoneId(zone.getUuid()); } - } - vlanResponse.setGateway(vlan.getVlanGateway()); - vlanResponse.setNetmask(vlan.getVlanNetmask()); + if (podId != null) { + HostPodVO pod = ApiDBUtils.findPodById(podId); + if (pod != null) { + vlanResponse.setPodId(pod.getUuid()); + vlanResponse.setPodName(pod.getName()); + } + } - // get start ip and end ip of corresponding vlan - String ipRange = vlan.getIpRange(); - if (ipRange != null) { - String[] range = ipRange.split("-"); - vlanResponse.setStartIp(range[0]); - vlanResponse.setEndIp(range[1]); - } + vlanResponse.setGateway(vlan.getVlanGateway()); + vlanResponse.setNetmask(vlan.getVlanNetmask()); - vlanResponse.setIp6Gateway(vlan.getIp6Gateway()); - vlanResponse.setIp6Cidr(vlan.getIp6Cidr()); + // get start ip and end ip of corresponding vlan + String ipRange = vlan.getIpRange(); + if (ipRange != null) { + String[] range = ipRange.split("-"); + vlanResponse.setStartIp(range[0]); + vlanResponse.setEndIp(range[1]); + } - String ip6Range = vlan.getIp6Range(); - if (ip6Range != null) { - String[] range = ip6Range.split("-"); - vlanResponse.setStartIpv6(range[0]); - vlanResponse.setEndIpv6(range[1]); - } + vlanResponse.setIp6Gateway(vlan.getIp6Gateway()); + vlanResponse.setIp6Cidr(vlan.getIp6Cidr()); - if (vlan.getNetworkId() != null) { - Network nw = ApiDBUtils.findNetworkById(vlan.getNetworkId()); - if (nw != null) { - vlanResponse.setNetworkId(nw.getUuid()); + String ip6Range = vlan.getIp6Range(); + if (ip6Range != null) { + String[] range = ip6Range.split("-"); + vlanResponse.setStartIpv6(range[0]); + vlanResponse.setEndIpv6(range[1]); } - } - Account owner = ApiDBUtils.getVlanAccount(vlan.getId()); - if (owner != null) { - populateAccount(vlanResponse, owner.getId()); - populateDomain(vlanResponse, owner.getDomainId()); - } else { - Domain domain = ApiDBUtils.getVlanDomain(vlan.getId()); - if (domain != null) { - populateDomain(vlanResponse, domain.getId()); + + if (vlan.getNetworkId() != null) { + Network nw = ApiDBUtils.findNetworkById(vlan.getNetworkId()); + if (nw != null) { + vlanResponse.setNetworkId(nw.getUuid()); + } + } + Account owner = ApiDBUtils.getVlanAccount(vlan.getId()); + if (owner != null) { + populateAccount(vlanResponse, owner.getId()); + populateDomain(vlanResponse, owner.getDomainId()); } else { - Long networkId = vlan.getNetworkId(); - if (networkId != null) { - Network network = _ntwkModel.getNetwork(networkId); - if (network != null) { - Long accountId = network.getAccountId(); - populateAccount(vlanResponse, accountId); - populateDomain(vlanResponse, ApiDBUtils.findAccountById(accountId).getDomainId()); + Domain domain = ApiDBUtils.getVlanDomain(vlan.getId()); + if (domain != null) { + populateDomain(vlanResponse, domain.getId()); + } else { + Long networkId = vlan.getNetworkId(); + if (networkId != null) { + Network network = _ntwkModel.getNetwork(networkId); + if (network != null) { + Long accountId = network.getAccountId(); + populateAccount(vlanResponse, accountId); + populateDomain(vlanResponse, ApiDBUtils.findAccountById(accountId).getDomainId()); + } } } } - } - if (vlan.getPhysicalNetworkId() != null) { - PhysicalNetwork pnw = ApiDBUtils.findPhysicalNetworkById(vlan.getPhysicalNetworkId()); - if (pnw != null) { - vlanResponse.setPhysicalNetworkId(pnw.getUuid()); + if (vlan.getPhysicalNetworkId() != null) { + PhysicalNetwork pnw = ApiDBUtils.findPhysicalNetworkById(vlan.getPhysicalNetworkId()); + if (pnw != null) { + vlanResponse.setPhysicalNetworkId(pnw.getUuid()); + } } + vlanResponse.setObjectName("vlan"); + return vlanResponse; + } catch (InstantiationException | IllegalAccessException e) { + throw new CloudRuntimeException("Failed to create Vlan IP Range response", e); } - vlanResponse.setObjectName("vlan"); - return vlanResponse; } @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8d4dc812/setup/db/db/schema-4910to41000.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-4910to41000.sql b/setup/db/db/schema-4910to41000.sql index 19226b0..127d7f8 100644 --- a/setup/db/db/schema-4910to41000.sql +++ b/setup/db/db/schema-4910to41000.sql @@ -35,4 +35,14 @@ INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervi INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created) VALUES (UUID(), 'KVM', 'default', 'Windows 10', 257, now()); INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created) VALUES (UUID(), 'KVM', 'default', 'Windows 10', 258, now()); -INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created) VALUES (UUID(), 'KVM', 'default', 'Windows Server 2012', 259, now()); \ No newline at end of file +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created) VALUES (UUID(), 'KVM', 'default', 'Windows Server 2012', 259, now()); + +CREATE TABLE `cloud`.`vlan_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `vlan_id` bigint unsigned NOT NULL COMMENT 'vlan id', + `name` varchar(255) NOT NULL, + `value` varchar(1024) NOT NULL, + `display` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Should detail be displayed to the end user', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vlan_details__vlan_id` FOREIGN KEY `fk_vlan_details__vlan_id`(`vlan_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8d4dc812/test/integration/plugins/nuagevsp/nuageTestCase.py ---------------------------------------------------------------------- diff --git a/test/integration/plugins/nuagevsp/nuageTestCase.py b/test/integration/plugins/nuagevsp/nuageTestCase.py index 5c1daab..530dced 100644 --- a/test/integration/plugins/nuagevsp/nuageTestCase.py +++ b/test/integration/plugins/nuagevsp/nuageTestCase.py @@ -40,7 +40,7 @@ from marvin.lib.base import (EgressFireWallRule, from marvin.lib.common import (get_domain, get_template, get_zone) -from marvin.cloudstackAPI import restartVPC +from marvin.cloudstackAPI import restartVPC, listNuageUnderlayVlanIpRanges # Import System Modules import importlib import functools @@ -139,7 +139,7 @@ class nuageTestCase(cloudstackTestCase): cls.api_client, physicalnetworkid=cls.vsp_physical_network.id)[0] - # Take username and password from the datacenter config file, + # Get username and password from the Marvin config file, # as they are not returned by the API. config_nuage_device = next(device for zone in cls.config.zones if zone.name == cls.zone.name @@ -156,6 +156,36 @@ class nuageTestCase(cloudstackTestCase): cls.tearDownClass() raise unittest.SkipTest("Warning: Could not get configured " "Nuage VSP device details - %s" % e) + + # Get data center Internet connectivity information from the Marvin + # config file, which is required to perform Internet connectivity and + # traffic tests from the guest VMs. + cls.isInternetConnectivityAvailable = False + cls.http_proxy = None + cls.https_proxy = None + dc_internet_conn_info = cls.config.dcInternetConnectivityInfo if \ + cls.config.dcInternetConnectivityInfo else None + if dc_internet_conn_info: + dc_internet_conn_available = dc_internet_conn_info.available if \ + dc_internet_conn_info.available else None + if dc_internet_conn_available: + cls.isInternetConnectivityAvailable = True if \ + dc_internet_conn_available == "true" else False + dc_internet_conn_http_proxy = dc_internet_conn_info.httpProxy if \ + dc_internet_conn_info.httpProxy else None + if dc_internet_conn_http_proxy: + cls.http_proxy = dc_internet_conn_http_proxy + dc_internet_conn_https_proxy = dc_internet_conn_info.httpsProxy \ + if dc_internet_conn_info.httpsProxy else None + if dc_internet_conn_https_proxy: + cls.https_proxy = dc_internet_conn_https_proxy + + # Check if the configured Nuage VSP SDN platform infrastructure + # supports underlay networking + cmd = listNuageUnderlayVlanIpRanges.listNuageUnderlayVlanIpRangesCmd() + cmd.underlay = True + cls.isNuageInfraUnderlay = isinstance( + cls.api_client.listNuageUnderlayVlanIpRanges(cmd), list) return @classmethod @@ -596,8 +626,11 @@ class nuageTestCase(cloudstackTestCase): # wget_from_server - Fetches file with the given file name from a web # server listening on the given public IP address and port - def wget_from_server(self, public_ip, port, file_name="index.html"): + def wget_from_server(self, public_ip, port=80, file_name="index.html", + disable_system_proxies=True): import urllib + if disable_system_proxies: + urllib.getproxies = lambda: {} self.debug("wget file - %s from a http web server listening on " "public IP address - %s and port - %s" % (file_name, public_ip.ipaddress.ipaddress, port)) @@ -606,6 +639,9 @@ class nuageTestCase(cloudstackTestCase): (public_ip.ipaddress.ipaddress, port, file_name), filename=file_name ) + self.debug("Successful to wget file - %s from a http web server " + "listening on public IP address - %s and port - %s" % + (file_name, public_ip.ipaddress.ipaddress, port)) return filename, headers # validate_NetworkServiceProvider - Validates the given Network Service @@ -971,6 +1007,20 @@ class nuageTestCase(cloudstackTestCase): self.assertEqual(vsd_fip.assigned, True, "Floating IP in VSD should be assigned" ) + ext_fip_subnet_filter = self.get_externalID_filter( + public_ipaddress.vlanid) + vsd_fip_subnet = self.vsd.get_shared_network_resource( + filter=ext_fip_subnet_filter) + if self.isNuageInfraUnderlay: + self.assertEqual(vsd_fip_subnet.underlay, True, + "Floating IP subnet in VSD should be underlay " + "enabled" + ) + else: + self.assertEqual(vsd_fip_subnet.underlay, False, + "Floating IP subnet in VSD should be underlay " + "disabled" + ) ext_network_filter = self.get_externalID_filter(vpc.id) if vpc \ else self.get_externalID_filter(network.id) vsd_domain = self.vsd.get_domain(filter=ext_network_filter)
