From e672a8841967cf7c302aab738a7d19a2501fb703 Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Wed, 3 Jun 2015 18:00:24 -0700 Subject: [PATCH 1/8] Modified VPC, Zone schema and VO files to add IPv6 attributes --- api/src/com/cloud/dc/DataCenter.java | 5 +++ api/src/com/cloud/network/vpc/Vpc.java | 6 ++++ .../entity/api/db/EngineDataCenterVO.java | 30 +++++++++++++++-- .../provisioning/test/ProvisioningTest.java | 2 +- .../schema/src/com/cloud/dc/DataCenterVO.java | 32 +++++++++++++++++-- .../src/com/cloud/network/vpc/VpcVO.java | 11 ++++++- .../vmware/VmwareDatacenterApiUnitTest.java | 2 +- .../cloudstack/storage/test/VolumeTest.java | 2 +- .../ConfigurationManagerImpl.java | 2 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 2 +- .../ConfigurationManagerTest.java | 8 ++--- server/test/com/cloud/vpc/VpcApiUnitTest.java | 2 +- .../com/cloud/vpc/dao/MockVpcDaoImpl.java | 4 +-- setup/db/db/schema-451to460.sql | 4 +++ 14 files changed, 94 insertions(+), 18 deletions(-) diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 5b3d3c01f30..6d6911253be 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -81,4 +81,9 @@ public interface DataCenter extends InfrastructureEntity, Grouping, Identity, In String getZoneToken(); boolean isLocalStorageEnabled(); + + String getIp6SuperNetworkCidr(); + + String getAsNumber(); + } diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java index dd607fe6caa..bd1c5274448 100644 --- a/api/src/com/cloud/network/vpc/Vpc.java +++ b/api/src/com/cloud/network/vpc/Vpc.java @@ -87,4 +87,10 @@ public interface Vpc extends ControlledEntity, Identity, InternalIdentity { * @return true if VPC spans multiple zones in the region */ boolean isRegionLevelVpc(); + + /** + * + * @return IPv6 CIDR of the VPC + */ + String getIp6Cidr(); } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java index 82b6150a5a3..51da4304e68 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java @@ -82,6 +82,12 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { @Column(name = "guest_network_cidr") private String guestNetworkCidr = null; + @Column(name = "ip6_super_network_cidr") + private String ip6SuperNetworkCidr = null; + + @Column(name = "as_number") + private String asNumber = null; + @Column(name = "domain_id") private Long domainId = null; @@ -210,14 +216,14 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { public EngineDataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } public EngineDataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { + NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2, String ip6SuperNetworkCidr, String asNumber) { this.name = name; this.description = description; this.dns1 = dns1; @@ -225,6 +231,8 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { this.internalDns1 = dns3; this.internalDns2 = dns4; this.guestNetworkCidr = guestCidr; + this.ip6SuperNetworkCidr = ip6SuperNetworkCidr; + this.asNumber = asNumber; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -503,4 +511,22 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } + + @Override + public String getIp6SuperNetworkCidr() { + return ip6SuperNetworkCidr; + } + + public void setIp6SuperNetworkCidr(String ip6GuestNetworkCidr) { + this.ip6SuperNetworkCidr = ip6GuestNetworkCidr; + } + + @Override + public String getAsNumber() { + return asNumber; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } } diff --git a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java index c2a9dc7989c..5f0fb667ef5 100644 --- a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java +++ b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java @@ -75,7 +75,7 @@ public class ProvisioningTest extends TestCase { public void setUp() { EngineDataCenterVO dc = new EngineDataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, - true, true, null, null); + true, true, null, null, null, null); Mockito.when(dcDao.findByUuid(Matchers.anyString())).thenReturn(dc); Mockito.when(dcDao.persist((EngineDataCenterVO)Matchers.anyObject())).thenReturn(dc); diff --git a/engine/schema/src/com/cloud/dc/DataCenterVO.java b/engine/schema/src/com/cloud/dc/DataCenterVO.java index 02aa98839ff..168267ff3dd 100644 --- a/engine/schema/src/com/cloud/dc/DataCenterVO.java +++ b/engine/schema/src/com/cloud/dc/DataCenterVO.java @@ -75,6 +75,12 @@ public class DataCenterVO implements DataCenter { @Column(name = "guest_network_cidr") private String guestNetworkCidr = null; + @Column(name = "ip6_super_network_cidr") + private String ip6SuperNetworkCidr = null; + + @Column(name = "as_number") + private String asNumber = null; + @Column(name = "domain_id") private Long domainId = null; @@ -182,14 +188,14 @@ public class DataCenterVO implements DataCenter { public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { + NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2, String ip6SuperCidr, String asNumber) { this.name = name; this.description = description; this.dns1 = dns1; @@ -199,6 +205,8 @@ public class DataCenterVO implements DataCenter { this.internalDns1 = dns3; this.internalDns2 = dns4; this.guestNetworkCidr = guestCidr; + this.ip6SuperNetworkCidr = ip6SuperCidr; + this.asNumber = asNumber; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -456,4 +464,22 @@ public class DataCenterVO implements DataCenter { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } -} + + @Override + public String getIp6SuperNetworkCidr() { + return ip6SuperNetworkCidr; + } + + public void setIp6SuperNetworkCidr(String ip6GuestNetworkCidr) { + this.ip6SuperNetworkCidr = ip6GuestNetworkCidr; + } + + @Override + public String getAsNumber() { + return asNumber; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java index b78f22f9f55..d0e0acde6c8 100644 --- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java +++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java @@ -51,6 +51,9 @@ public class VpcVO implements Vpc { @Column(name = "cidr") private String cidr = null; + @Column(name = "ip6_cidr") + private String ip6Cidr = null; + @Column(name = "domain_id") Long domainId = null; @@ -94,13 +97,14 @@ public class VpcVO implements Vpc { public VpcVO(final long zoneId, final String name, final String displayText, final long accountId, final long domainId, final long vpcOffId, final String cidr, final String networkDomain, final boolean useDistributedRouter, - final boolean regionLevelVpc, final boolean isRedundant) { + final boolean regionLevelVpc, final boolean isRedundant, String ip6Cidr) { this.zoneId = zoneId; this.name = name; this.displayText = displayText; this.accountId = accountId; this.domainId = domainId; this.cidr = cidr; + this.ip6Cidr = ip6Cidr; uuid = UUID.randomUUID().toString(); state = State.Enabled; this.networkDomain = networkDomain; @@ -237,4 +241,9 @@ public class VpcVO implements Vpc { public boolean usesDistributedRouter() { return usesDistributedRouter; } + + @Override + public String getIp6Cidr() { + return ip6Cidr; + } } diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index 3b3dd479499..0fa29c3f5f7 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -167,7 +167,7 @@ public class VmwareDatacenterApiUnitTest { DataCenterVO zone = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); zoneId = 1L; HostPodVO pod = new HostPodVO(UUID.randomUUID().toString(), zoneId, "192.168.56.1", "192.168.56.0/24", 8, "test"); diff --git a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java index 71bc603a1b6..de25a80c101 100644 --- a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java +++ b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java @@ -76,7 +76,7 @@ public class VolumeTest { // create data center DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); dc = dcDao.persist(dc); dcId = dc.getId(); // create pod diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 445ffde1e53..6594dd93e3a 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1826,7 +1826,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // Create the new zone in the database final DataCenterVO zoneFinal = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, - isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2); + isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2, null, null); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { final Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zoneFinal.setAllocationState(allocationState); diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 2a078954bde..174051b58d2 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -816,7 +816,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis final boolean useDistributedRouter = vpcOff.supportsDistributedRouter(); final VpcVO vpc = new VpcVO(zoneId, vpcName, displayText, owner.getId(), owner.getDomainId(), vpcOffId, - cidr, networkDomain, useDistributedRouter, isRegionLevelVpcOff, vpcOff.getRedundantRouter()); + cidr, networkDomain, useDistributedRouter, isRegionLevelVpcOff, vpcOff.getRedundantRouter(), null); return createVpc(displayVpc, vpc); } diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java index c43e3fa4898..5926a3491b9 100644 --- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java +++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java @@ -241,7 +241,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -285,7 +285,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -312,7 +312,7 @@ public class ConfigurationManagerTest { // public ip range belongs to zone of type basic DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -338,7 +338,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); // one of the ip addresses of the range is allocated to different account diff --git a/server/test/com/cloud/vpc/VpcApiUnitTest.java b/server/test/com/cloud/vpc/VpcApiUnitTest.java index f4056358d4e..27ae389ce98 100644 --- a/server/test/com/cloud/vpc/VpcApiUnitTest.java +++ b/server/test/com/cloud/vpc/VpcApiUnitTest.java @@ -85,7 +85,7 @@ public class VpcApiUnitTest extends TestCase { public void validateNtwkOffForVpc() { //validate network offering //1) correct network offering - VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); boolean result = false; try { _vpcService.validateNtwkOffForNtwkInVpc(2L, 1, "0.0.0.0", "111-", vo, "10.1.1.1", new AccountVO(), null); diff --git a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java index a436a92a382..7715f948371 100644 --- a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java +++ b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java @@ -98,9 +98,9 @@ public class MockVpcDaoImpl extends GenericDaoBase implements VpcDa public VpcVO findById(Long id) { VpcVO vo = null; if (id.longValue() == 1) { - vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); } else if (id.longValue() == 2) { - vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); vo.setState(State.Inactive); } diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index 0abd4f80408..b618f7745e8 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -398,3 +398,7 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( CONSTRAINT `fk_external_bigswitch_bcf_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_external_bigswitch_bcf_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(255); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(255); +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(255); \ No newline at end of file From 49418223d5a5b0ceec5ad29afaac9e09e77ec5cd Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Thu, 4 Jun 2015 10:08:14 -0700 Subject: [PATCH 2/8] Size of ipv6 CIDR and asNumber fields are reduced to reflect their actual size --- setup/db/db/schema-451to460.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index b618f7745e8..d41455376d0 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -399,6 +399,6 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( CONSTRAINT `fk_external_bigswitch_bcf_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(255); -ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(255); -ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(255); \ No newline at end of file +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(50); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(15); +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(50); \ No newline at end of file From a5748fb0556acf8f55cdb29029c015ce3d50a87c Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Wed, 3 Jun 2015 18:00:24 -0700 Subject: [PATCH 3/8] Modified VPC, Zone schema and VO files to add IPv6 attributes --- api/src/com/cloud/dc/DataCenter.java | 5 +++ api/src/com/cloud/network/vpc/Vpc.java | 6 ++++ .../entity/api/db/EngineDataCenterVO.java | 30 +++++++++++++++-- .../provisioning/test/ProvisioningTest.java | 2 +- .../schema/src/com/cloud/dc/DataCenterVO.java | 32 +++++++++++++++++-- .../src/com/cloud/network/vpc/VpcVO.java | 11 ++++++- .../vmware/VmwareDatacenterApiUnitTest.java | 2 +- .../cloudstack/storage/test/VolumeTest.java | 2 +- .../ConfigurationManagerImpl.java | 2 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 2 +- .../ConfigurationManagerTest.java | 8 ++--- server/test/com/cloud/vpc/VpcApiUnitTest.java | 2 +- .../com/cloud/vpc/dao/MockVpcDaoImpl.java | 4 +-- setup/db/db/schema-451to460.sql | 4 +++ 14 files changed, 94 insertions(+), 18 deletions(-) diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 5b3d3c01f30..6d6911253be 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -81,4 +81,9 @@ public interface DataCenter extends InfrastructureEntity, Grouping, Identity, In String getZoneToken(); boolean isLocalStorageEnabled(); + + String getIp6SuperNetworkCidr(); + + String getAsNumber(); + } diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java index dd607fe6caa..bd1c5274448 100644 --- a/api/src/com/cloud/network/vpc/Vpc.java +++ b/api/src/com/cloud/network/vpc/Vpc.java @@ -87,4 +87,10 @@ public interface Vpc extends ControlledEntity, Identity, InternalIdentity { * @return true if VPC spans multiple zones in the region */ boolean isRegionLevelVpc(); + + /** + * + * @return IPv6 CIDR of the VPC + */ + String getIp6Cidr(); } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java index 82b6150a5a3..51da4304e68 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java @@ -82,6 +82,12 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { @Column(name = "guest_network_cidr") private String guestNetworkCidr = null; + @Column(name = "ip6_super_network_cidr") + private String ip6SuperNetworkCidr = null; + + @Column(name = "as_number") + private String asNumber = null; + @Column(name = "domain_id") private Long domainId = null; @@ -210,14 +216,14 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { public EngineDataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } public EngineDataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { + NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2, String ip6SuperNetworkCidr, String asNumber) { this.name = name; this.description = description; this.dns1 = dns1; @@ -225,6 +231,8 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { this.internalDns1 = dns3; this.internalDns2 = dns4; this.guestNetworkCidr = guestCidr; + this.ip6SuperNetworkCidr = ip6SuperNetworkCidr; + this.asNumber = asNumber; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -503,4 +511,22 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } + + @Override + public String getIp6SuperNetworkCidr() { + return ip6SuperNetworkCidr; + } + + public void setIp6SuperNetworkCidr(String ip6GuestNetworkCidr) { + this.ip6SuperNetworkCidr = ip6GuestNetworkCidr; + } + + @Override + public String getAsNumber() { + return asNumber; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } } diff --git a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java index c2a9dc7989c..5f0fb667ef5 100644 --- a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java +++ b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java @@ -75,7 +75,7 @@ public class ProvisioningTest extends TestCase { public void setUp() { EngineDataCenterVO dc = new EngineDataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, - true, true, null, null); + true, true, null, null, null, null); Mockito.when(dcDao.findByUuid(Matchers.anyString())).thenReturn(dc); Mockito.when(dcDao.persist((EngineDataCenterVO)Matchers.anyObject())).thenReturn(dc); diff --git a/engine/schema/src/com/cloud/dc/DataCenterVO.java b/engine/schema/src/com/cloud/dc/DataCenterVO.java index 02aa98839ff..168267ff3dd 100644 --- a/engine/schema/src/com/cloud/dc/DataCenterVO.java +++ b/engine/schema/src/com/cloud/dc/DataCenterVO.java @@ -75,6 +75,12 @@ public class DataCenterVO implements DataCenter { @Column(name = "guest_network_cidr") private String guestNetworkCidr = null; + @Column(name = "ip6_super_network_cidr") + private String ip6SuperNetworkCidr = null; + + @Column(name = "as_number") + private String asNumber = null; + @Column(name = "domain_id") private Long domainId = null; @@ -182,14 +188,14 @@ public class DataCenterVO implements DataCenter { public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { + NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2, String ip6SuperCidr, String asNumber) { this.name = name; this.description = description; this.dns1 = dns1; @@ -199,6 +205,8 @@ public class DataCenterVO implements DataCenter { this.internalDns1 = dns3; this.internalDns2 = dns4; this.guestNetworkCidr = guestCidr; + this.ip6SuperNetworkCidr = ip6SuperCidr; + this.asNumber = asNumber; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -456,4 +464,22 @@ public class DataCenterVO implements DataCenter { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } -} + + @Override + public String getIp6SuperNetworkCidr() { + return ip6SuperNetworkCidr; + } + + public void setIp6SuperNetworkCidr(String ip6GuestNetworkCidr) { + this.ip6SuperNetworkCidr = ip6GuestNetworkCidr; + } + + @Override + public String getAsNumber() { + return asNumber; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java index b78f22f9f55..d0e0acde6c8 100644 --- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java +++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java @@ -51,6 +51,9 @@ public class VpcVO implements Vpc { @Column(name = "cidr") private String cidr = null; + @Column(name = "ip6_cidr") + private String ip6Cidr = null; + @Column(name = "domain_id") Long domainId = null; @@ -94,13 +97,14 @@ public class VpcVO implements Vpc { public VpcVO(final long zoneId, final String name, final String displayText, final long accountId, final long domainId, final long vpcOffId, final String cidr, final String networkDomain, final boolean useDistributedRouter, - final boolean regionLevelVpc, final boolean isRedundant) { + final boolean regionLevelVpc, final boolean isRedundant, String ip6Cidr) { this.zoneId = zoneId; this.name = name; this.displayText = displayText; this.accountId = accountId; this.domainId = domainId; this.cidr = cidr; + this.ip6Cidr = ip6Cidr; uuid = UUID.randomUUID().toString(); state = State.Enabled; this.networkDomain = networkDomain; @@ -237,4 +241,9 @@ public class VpcVO implements Vpc { public boolean usesDistributedRouter() { return usesDistributedRouter; } + + @Override + public String getIp6Cidr() { + return ip6Cidr; + } } diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index 3b3dd479499..0fa29c3f5f7 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -167,7 +167,7 @@ public class VmwareDatacenterApiUnitTest { DataCenterVO zone = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); zoneId = 1L; HostPodVO pod = new HostPodVO(UUID.randomUUID().toString(), zoneId, "192.168.56.1", "192.168.56.0/24", 8, "test"); diff --git a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java index 71bc603a1b6..de25a80c101 100644 --- a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java +++ b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java @@ -76,7 +76,7 @@ public class VolumeTest { // create data center DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); dc = dcDao.persist(dc); dcId = dc.getId(); // create pod diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 445ffde1e53..6594dd93e3a 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1826,7 +1826,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // Create the new zone in the database final DataCenterVO zoneFinal = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, - isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2); + isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2, null, null); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { final Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zoneFinal.setAllocationState(allocationState); diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 2a078954bde..174051b58d2 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -816,7 +816,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis final boolean useDistributedRouter = vpcOff.supportsDistributedRouter(); final VpcVO vpc = new VpcVO(zoneId, vpcName, displayText, owner.getId(), owner.getDomainId(), vpcOffId, - cidr, networkDomain, useDistributedRouter, isRegionLevelVpcOff, vpcOff.getRedundantRouter()); + cidr, networkDomain, useDistributedRouter, isRegionLevelVpcOff, vpcOff.getRedundantRouter(), null); return createVpc(displayVpc, vpc); } diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java index c43e3fa4898..5926a3491b9 100644 --- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java +++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java @@ -241,7 +241,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -285,7 +285,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -312,7 +312,7 @@ public class ConfigurationManagerTest { // public ip range belongs to zone of type basic DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -338,7 +338,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); // one of the ip addresses of the range is allocated to different account diff --git a/server/test/com/cloud/vpc/VpcApiUnitTest.java b/server/test/com/cloud/vpc/VpcApiUnitTest.java index f4056358d4e..27ae389ce98 100644 --- a/server/test/com/cloud/vpc/VpcApiUnitTest.java +++ b/server/test/com/cloud/vpc/VpcApiUnitTest.java @@ -85,7 +85,7 @@ public class VpcApiUnitTest extends TestCase { public void validateNtwkOffForVpc() { //validate network offering //1) correct network offering - VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); boolean result = false; try { _vpcService.validateNtwkOffForNtwkInVpc(2L, 1, "0.0.0.0", "111-", vo, "10.1.1.1", new AccountVO(), null); diff --git a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java index a436a92a382..7715f948371 100644 --- a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java +++ b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java @@ -98,9 +98,9 @@ public class MockVpcDaoImpl extends GenericDaoBase implements VpcDa public VpcVO findById(Long id) { VpcVO vo = null; if (id.longValue() == 1) { - vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); } else if (id.longValue() == 2) { - vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); vo.setState(State.Inactive); } diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index 0abd4f80408..b618f7745e8 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -398,3 +398,7 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( CONSTRAINT `fk_external_bigswitch_bcf_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_external_bigswitch_bcf_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(255); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(255); +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(255); \ No newline at end of file From 4d799d5e134b3b1818366e4c6fe19fb9617b5c02 Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Thu, 4 Jun 2015 10:08:14 -0700 Subject: [PATCH 4/8] Size of ipv6 CIDR and asNumber fields are reduced to reflect their actual size --- setup/db/db/schema-451to460.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index b618f7745e8..d41455376d0 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -399,6 +399,6 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( CONSTRAINT `fk_external_bigswitch_bcf_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(255); -ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(255); -ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(255); \ No newline at end of file +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(50); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(15); +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(50); \ No newline at end of file From 2766c81a998f48903e79e51ad2c81880e380a89a Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Wed, 3 Jun 2015 18:00:24 -0700 Subject: [PATCH 5/8] Modified VPC, Zone schema and VO files to add IPv6 attributes --- api/src/com/cloud/dc/DataCenter.java | 5 +++ api/src/com/cloud/network/vpc/Vpc.java | 6 ++++ .../entity/api/db/EngineDataCenterVO.java | 30 +++++++++++++++-- .../provisioning/test/ProvisioningTest.java | 2 +- .../schema/src/com/cloud/dc/DataCenterVO.java | 32 +++++++++++++++++-- .../src/com/cloud/network/vpc/VpcVO.java | 11 ++++++- .../vmware/VmwareDatacenterApiUnitTest.java | 2 +- .../cloudstack/storage/test/VolumeTest.java | 2 +- .../ConfigurationManagerImpl.java | 2 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 2 +- .../ConfigurationManagerTest.java | 8 ++--- server/test/com/cloud/vpc/VpcApiUnitTest.java | 2 +- .../com/cloud/vpc/dao/MockVpcDaoImpl.java | 4 +-- setup/db/db/schema-451to460.sql | 4 +++ 14 files changed, 94 insertions(+), 18 deletions(-) diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 5b3d3c01f30..6d6911253be 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -81,4 +81,9 @@ public interface DataCenter extends InfrastructureEntity, Grouping, Identity, In String getZoneToken(); boolean isLocalStorageEnabled(); + + String getIp6SuperNetworkCidr(); + + String getAsNumber(); + } diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java index dd607fe6caa..bd1c5274448 100644 --- a/api/src/com/cloud/network/vpc/Vpc.java +++ b/api/src/com/cloud/network/vpc/Vpc.java @@ -87,4 +87,10 @@ public interface Vpc extends ControlledEntity, Identity, InternalIdentity { * @return true if VPC spans multiple zones in the region */ boolean isRegionLevelVpc(); + + /** + * + * @return IPv6 CIDR of the VPC + */ + String getIp6Cidr(); } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java index 82b6150a5a3..51da4304e68 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java @@ -82,6 +82,12 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { @Column(name = "guest_network_cidr") private String guestNetworkCidr = null; + @Column(name = "ip6_super_network_cidr") + private String ip6SuperNetworkCidr = null; + + @Column(name = "as_number") + private String asNumber = null; + @Column(name = "domain_id") private Long domainId = null; @@ -210,14 +216,14 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { public EngineDataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } public EngineDataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { + NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2, String ip6SuperNetworkCidr, String asNumber) { this.name = name; this.description = description; this.dns1 = dns1; @@ -225,6 +231,8 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { this.internalDns1 = dns3; this.internalDns2 = dns4; this.guestNetworkCidr = guestCidr; + this.ip6SuperNetworkCidr = ip6SuperNetworkCidr; + this.asNumber = asNumber; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -503,4 +511,22 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } + + @Override + public String getIp6SuperNetworkCidr() { + return ip6SuperNetworkCidr; + } + + public void setIp6SuperNetworkCidr(String ip6GuestNetworkCidr) { + this.ip6SuperNetworkCidr = ip6GuestNetworkCidr; + } + + @Override + public String getAsNumber() { + return asNumber; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } } diff --git a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java index c2a9dc7989c..5f0fb667ef5 100644 --- a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java +++ b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java @@ -75,7 +75,7 @@ public class ProvisioningTest extends TestCase { public void setUp() { EngineDataCenterVO dc = new EngineDataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, - true, true, null, null); + true, true, null, null, null, null); Mockito.when(dcDao.findByUuid(Matchers.anyString())).thenReturn(dc); Mockito.when(dcDao.persist((EngineDataCenterVO)Matchers.anyObject())).thenReturn(dc); diff --git a/engine/schema/src/com/cloud/dc/DataCenterVO.java b/engine/schema/src/com/cloud/dc/DataCenterVO.java index 02aa98839ff..168267ff3dd 100644 --- a/engine/schema/src/com/cloud/dc/DataCenterVO.java +++ b/engine/schema/src/com/cloud/dc/DataCenterVO.java @@ -75,6 +75,12 @@ public class DataCenterVO implements DataCenter { @Column(name = "guest_network_cidr") private String guestNetworkCidr = null; + @Column(name = "ip6_super_network_cidr") + private String ip6SuperNetworkCidr = null; + + @Column(name = "as_number") + private String asNumber = null; + @Column(name = "domain_id") private Long domainId = null; @@ -182,14 +188,14 @@ public class DataCenterVO implements DataCenter { public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null); + this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false, null, null, null, null); this.id = id; this.allocationState = Grouping.AllocationState.Enabled; this.uuid = UUID.randomUUID().toString(); } public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, - NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2) { + NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled, String ip6Dns1, String ip6Dns2, String ip6SuperCidr, String asNumber) { this.name = name; this.description = description; this.dns1 = dns1; @@ -199,6 +205,8 @@ public class DataCenterVO implements DataCenter { this.internalDns1 = dns3; this.internalDns2 = dns4; this.guestNetworkCidr = guestCidr; + this.ip6SuperNetworkCidr = ip6SuperCidr; + this.asNumber = asNumber; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -456,4 +464,22 @@ public class DataCenterVO implements DataCenter { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } -} + + @Override + public String getIp6SuperNetworkCidr() { + return ip6SuperNetworkCidr; + } + + public void setIp6SuperNetworkCidr(String ip6GuestNetworkCidr) { + this.ip6SuperNetworkCidr = ip6GuestNetworkCidr; + } + + @Override + public String getAsNumber() { + return asNumber; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java index b78f22f9f55..d0e0acde6c8 100644 --- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java +++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java @@ -51,6 +51,9 @@ public class VpcVO implements Vpc { @Column(name = "cidr") private String cidr = null; + @Column(name = "ip6_cidr") + private String ip6Cidr = null; + @Column(name = "domain_id") Long domainId = null; @@ -94,13 +97,14 @@ public class VpcVO implements Vpc { public VpcVO(final long zoneId, final String name, final String displayText, final long accountId, final long domainId, final long vpcOffId, final String cidr, final String networkDomain, final boolean useDistributedRouter, - final boolean regionLevelVpc, final boolean isRedundant) { + final boolean regionLevelVpc, final boolean isRedundant, String ip6Cidr) { this.zoneId = zoneId; this.name = name; this.displayText = displayText; this.accountId = accountId; this.domainId = domainId; this.cidr = cidr; + this.ip6Cidr = ip6Cidr; uuid = UUID.randomUUID().toString(); state = State.Enabled; this.networkDomain = networkDomain; @@ -237,4 +241,9 @@ public class VpcVO implements Vpc { public boolean usesDistributedRouter() { return usesDistributedRouter; } + + @Override + public String getIp6Cidr() { + return ip6Cidr; + } } diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index 3b3dd479499..0fa29c3f5f7 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -167,7 +167,7 @@ public class VmwareDatacenterApiUnitTest { DataCenterVO zone = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); zoneId = 1L; HostPodVO pod = new HostPodVO(UUID.randomUUID().toString(), zoneId, "192.168.56.1", "192.168.56.0/24", 8, "test"); diff --git a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java index 71bc603a1b6..de25a80c101 100644 --- a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java +++ b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java @@ -76,7 +76,7 @@ public class VolumeTest { // create data center DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); dc = dcDao.persist(dc); dcId = dc.getId(); // create pod diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 445ffde1e53..6594dd93e3a 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1826,7 +1826,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // Create the new zone in the database final DataCenterVO zoneFinal = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, - isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2); + isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2, null, null); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { final Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zoneFinal.setAllocationState(allocationState); diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 2a078954bde..174051b58d2 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -816,7 +816,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis final boolean useDistributedRouter = vpcOff.supportsDistributedRouter(); final VpcVO vpc = new VpcVO(zoneId, vpcName, displayText, owner.getId(), owner.getDomainId(), vpcOffId, - cidr, networkDomain, useDistributedRouter, isRegionLevelVpcOff, vpcOff.getRedundantRouter()); + cidr, networkDomain, useDistributedRouter, isRegionLevelVpcOff, vpcOff.getRedundantRouter(), null); return createVpc(displayVpc, vpc); } diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java index c43e3fa4898..5926a3491b9 100644 --- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java +++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java @@ -241,7 +241,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -285,7 +285,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -312,7 +312,7 @@ public class ConfigurationManagerTest { // public ip range belongs to zone of type basic DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); List ipAddressList = new ArrayList(); @@ -338,7 +338,7 @@ public class ConfigurationManagerTest { DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Advanced, null, null, true, - true, null, null); + true, null, null, null, null); when(configurationMgr._zoneDao.findById(anyLong())).thenReturn(dc); // one of the ip addresses of the range is allocated to different account diff --git a/server/test/com/cloud/vpc/VpcApiUnitTest.java b/server/test/com/cloud/vpc/VpcApiUnitTest.java index f4056358d4e..27ae389ce98 100644 --- a/server/test/com/cloud/vpc/VpcApiUnitTest.java +++ b/server/test/com/cloud/vpc/VpcApiUnitTest.java @@ -85,7 +85,7 @@ public class VpcApiUnitTest extends TestCase { public void validateNtwkOffForVpc() { //validate network offering //1) correct network offering - VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); boolean result = false; try { _vpcService.validateNtwkOffForNtwkInVpc(2L, 1, "0.0.0.0", "111-", vo, "10.1.1.1", new AccountVO(), null); diff --git a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java index a436a92a382..7715f948371 100644 --- a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java +++ b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java @@ -98,9 +98,9 @@ public class MockVpcDaoImpl extends GenericDaoBase implements VpcDa public VpcVO findById(Long id) { VpcVO vo = null; if (id.longValue() == 1) { - vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); } else if (id.longValue() == 2) { - vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false); + vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false, false, false, null); vo.setState(State.Inactive); } diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index 0abd4f80408..b618f7745e8 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -398,3 +398,7 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( CONSTRAINT `fk_external_bigswitch_bcf_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_external_bigswitch_bcf_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(255); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(255); +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(255); \ No newline at end of file From ed94d95d096686f47798e0b08c1eb21c454d000a Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Thu, 4 Jun 2015 10:08:14 -0700 Subject: [PATCH 6/8] Size of ipv6 CIDR and asNumber fields are reduced to reflect their actual size --- setup/db/db/schema-451to460.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index b618f7745e8..d41455376d0 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -399,6 +399,6 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( CONSTRAINT `fk_external_bigswitch_bcf_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(255); -ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(255); -ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(255); \ No newline at end of file +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(50); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(15); +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(50); \ No newline at end of file From 78bc96eb2cdad3b3da008846e4621224c9a5ace3 Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Wed, 3 Jun 2015 18:00:24 -0700 Subject: [PATCH 7/8] Modified VPC, Zone schema and VO files to add IPv6 attributes --- setup/db/db/schema-451to460.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/db/db/schema-451to460.sql b/setup/db/db/schema-451to460.sql index d41455376d0..c1a3ca6667b 100644 --- a/setup/db/db/schema-451to460.sql +++ b/setup/db/db/schema-451to460.sql @@ -401,4 +401,4 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_super_network_cidr` varchar(50); ALTER TABLE `cloud`.`data_center` ADD COLUMN `as_number` varchar(15); -ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(50); \ No newline at end of file +ALTER TABLE `cloud`.`vpc` ADD COLUMN `ip6_cidr` varchar(50); From eb6c990b1a1a6c86129d1a7d7b61cf84969e80a8 Mon Sep 17 00:00:00 2001 From: Suresh Ramamurthy Date: Tue, 9 Jun 2015 03:55:06 -0400 Subject: [PATCH 8/8] Enhanced Zone API to support Ipv6 attributes like IPv6 Super CIDR and ASN --- .../apache/cloudstack/api/ApiConstants.java | 2 + .../api/command/admin/zone/CreateZoneCmd.java | 14 +++ .../api/command/admin/zone/UpdateZoneCmd.java | 17 ++- .../cloudstack/api/response/ZoneResponse.java | 17 ++- .../configuration/ConfigurationManager.java | 16 +-- .../src/com/cloud/dc/dao/DataCenterDao.java | 4 + .../com/cloud/dc/dao/DataCenterDaoImpl.java | 25 +++++ .../management/ManagementServerMock.java | 2 +- .../ConfigurationManagerImpl.java | 106 ++++++++++++++---- .../ConfigurationManagerTest.java | 79 +++++++++++++ .../vpc/MockConfigurationManagerImpl.java | 6 +- tools/marvin/marvin/deployDataCenter.py | 4 + utils/src/com/cloud/utils/net/NetUtils.java | 30 +++++ .../com/cloud/utils/net/NetUtilsTest.java | 19 ++++ 14 files changed, 304 insertions(+), 37 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index 2b6425846e4..80b22a073d9 100644 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -115,6 +115,8 @@ public class ApiConstants { public static final String GSLB_STICKY_SESSION_METHOD = "gslbstickysessionmethodname"; public static final String GSLB_LBRULE_WEIGHT_MAP = "gslblbruleweightsmap"; public static final String GUEST_CIDR_ADDRESS = "guestcidraddress"; + public static final String IP6_SUPER_CIDR_ADDRESS = "ip6supercidraddress"; + public static final String AUTONOMOUS_NUMBER = "asnumber"; public static final String GUEST_VLAN_RANGE = "guestvlanrange"; public static final String HA_ENABLE = "haenable"; public static final String HOST_ID = "hostid"; diff --git a/api/src/org/apache/cloudstack/api/command/admin/zone/CreateZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/zone/CreateZoneCmd.java index 414c058e66d..c69285c1dda 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/zone/CreateZoneCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/zone/CreateZoneCmd.java @@ -58,6 +58,12 @@ public class CreateZoneCmd extends BaseCmd { @Parameter(name = ApiConstants.GUEST_CIDR_ADDRESS, type = CommandType.STRING, description = "the guest CIDR address for the Zone") private String guestCidrAddress; + @Parameter(name = ApiConstants.IP6_SUPER_CIDR_ADDRESS, type = CommandType.STRING, description = "the IPv6 super CIDR address for the Zone. IPv6 CIDR of all the VPCs in this zone should be within this CIDR") + private String ip6SuperCidrAddress; + + @Parameter(name = ApiConstants.AUTONOMOUS_NUMBER, type = CommandType.STRING, description = "private autonomous system number for the Zone") + private String asNumber; + @Parameter(name = ApiConstants.INTERNAL_DNS1, type = CommandType.STRING, required = true, description = "the first internal DNS for the Zone") private String internalDns1; @@ -112,6 +118,14 @@ public class CreateZoneCmd extends BaseCmd { return guestCidrAddress; } + public String getIp6SuperCidrAddress() { + return ip6SuperCidrAddress; + } + + public String getAsNumber() { + return asNumber; + } + public String getInternalDns1() { return internalDns1; } diff --git a/api/src/org/apache/cloudstack/api/command/admin/zone/UpdateZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/zone/UpdateZoneCmd.java index 9ad8972ecfd..f9267e55102 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/zone/UpdateZoneCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/zone/UpdateZoneCmd.java @@ -19,8 +19,6 @@ package org.apache.cloudstack.api.command.admin.zone; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; - import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; @@ -30,6 +28,7 @@ import org.apache.cloudstack.api.ResponseObject.ResponseView; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.dc.DataCenter; import com.cloud.user.Account; @@ -60,6 +59,12 @@ public class UpdateZoneCmd extends BaseCmd { @Parameter(name = ApiConstants.GUEST_CIDR_ADDRESS, type = CommandType.STRING, description = "the guest CIDR address for the Zone") private String guestCidrAddress; + @Parameter(name = ApiConstants.IP6_SUPER_CIDR_ADDRESS, type = CommandType.STRING, description = "the IPv6 super CIDR address for the Zone. IPv6 CIDR of all the VPCs in this zone should be within this CIDR") + private String ip6SuperCidrAddress; + + @Parameter(name = ApiConstants.AUTONOMOUS_NUMBER, type = CommandType.STRING, description = "private autonomous system number for the Zone") + private String asNumber; + @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of the Zone") private Long id; @@ -111,6 +116,14 @@ public class UpdateZoneCmd extends BaseCmd { return guestCidrAddress; } + public String getIp6SuperCidrAddress() { + return ip6SuperCidrAddress; + } + + public String getAsNumber() { + return asNumber; + } + public Long getId() { return id; } diff --git a/api/src/org/apache/cloudstack/api/response/ZoneResponse.java b/api/src/org/apache/cloudstack/api/response/ZoneResponse.java index 7aee448f6e2..1288bee45db 100644 --- a/api/src/org/apache/cloudstack/api/response/ZoneResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ZoneResponse.java @@ -29,7 +29,6 @@ import com.cloud.dc.DataCenter; import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; -@SuppressWarnings("unused") @EntityReference(value = DataCenter.class) public class ZoneResponse extends BaseResponse { @SerializedName(ApiConstants.ID) @@ -72,6 +71,14 @@ public class ZoneResponse extends BaseResponse { @Param(description = "the guest CIDR address for the Zone") private String guestCidrAddress; + @SerializedName(ApiConstants.IP6_SUPER_CIDR_ADDRESS) + @Param(description = "the IPv6 super CIDR address for the Zone. IPv6 CIDR of all the VPCs in this zone should be within this CIDR") + private String ip6SuperCidrAddress; + + @SerializedName(ApiConstants.AUTONOMOUS_NUMBER) + @Param(description = "private autonomous system number for the Zone") + private String asNumber; + //TODO - generate description @SerializedName("status") private String status; @@ -164,6 +171,14 @@ public class ZoneResponse extends BaseResponse { this.guestCidrAddress = guestCidrAddress; } + public void setIp6SuperCidrAddress(String ip6SuperCidrAddress) { + this.ip6SuperCidrAddress = ip6SuperCidrAddress; + } + + public void setAsNumber(String asNumber) { + this.asNumber = asNumber; + } + public void setStatus(String status) { this.status = status; } diff --git a/engine/components-api/src/com/cloud/configuration/ConfigurationManager.java b/engine/components-api/src/com/cloud/configuration/ConfigurationManager.java index 13ca3f9bf0f..c291e8db6de 100644 --- a/engine/components-api/src/com/cloud/configuration/ConfigurationManager.java +++ b/engine/components-api/src/com/cloud/configuration/ConfigurationManager.java @@ -149,19 +149,19 @@ public interface ConfigurationManager { * @param guestCidr * @param zoneType * @param allocationState - * @param networkDomain - * TODO + * @param networkDomainTODO * @param isSecurityGroupEnabled - * TODO - * @param ip6Dns1 TODO - * @param ip6Dns2 TODO + * @param ip6Dns1 + * @param ip6Dns2 + * @param ip6SuperCidr + * @param asNumber * @return * @throws * @throws */ - DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, - Long domainId, NetworkType zoneType, String allocationState, String networkDomain, boolean isSecurityGroupEnabled, boolean isLocalStorageEnabled, String ip6Dns1, - String ip6Dns2); + DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, + NetworkType zoneType, String allocationState, String networkDomain, boolean isSecurityGroupEnabled, boolean isLocalStorageEnabled, String ip6Dns1, String ip6Dns2, + String ip6SuperCidr, String asNumber); /** * Deletes a VLAN from the database, along with all of its IP addresses. Will not delete VLANs that have allocated diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java index 4fc055e6ac8..ffaa7c1371b 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java @@ -96,4 +96,8 @@ public interface DataCenterDao extends GenericDao { List findByKeyword(String keyword); List listAllZones(); + + DataCenterVO findByIp6SuperCidr(String ip6SuperCidr); + + DataCenterVO findByAsn(String asNumber); } diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java index 373446e780a..eb6ceb1c67e 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -61,6 +61,8 @@ public class DataCenterDaoImpl extends GenericDaoBase implem private static final Logger s_logger = Logger.getLogger(DataCenterDaoImpl.class); protected SearchBuilder NameSearch; + protected SearchBuilder Ip6SuperCidrSearch; + protected SearchBuilder AsnSearch; protected SearchBuilder ListZonesByDomainIdSearch; protected SearchBuilder PublicZonesSearch; protected SearchBuilder ChildZonesSearch; @@ -91,6 +93,20 @@ public class DataCenterDaoImpl extends GenericDaoBase implem return findOneBy(sc); } + @Override + public DataCenterVO findByIp6SuperCidr(String ip6SuperCidr) { + SearchCriteria sc = Ip6SuperCidrSearch.create(); + sc.setParameters("ip6SuperNetworkCidr", ip6SuperCidr); + return findOneBy(sc); + } + + @Override + public DataCenterVO findByAsn(String asNumber) { + SearchCriteria sc = AsnSearch.create(); + sc.setParameters("asNumber", asNumber); + return findOneBy(sc); + } + @Override public DataCenterVO findByToken(String zoneToken) { SearchCriteria sc = TokenSearch.create(); @@ -323,6 +339,15 @@ public class DataCenterDaoImpl extends GenericDaoBase implem NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ); NameSearch.done(); + Ip6SuperCidrSearch = createSearchBuilder(); + Ip6SuperCidrSearch.and("ip6SuperNetworkCidr", Ip6SuperCidrSearch.entity().getIp6SuperNetworkCidr(), SearchCriteria.Op.EQ); + Ip6SuperCidrSearch.done(); + + + AsnSearch = createSearchBuilder(); + AsnSearch.and("asNumber", AsnSearch.entity().getAsNumber(), SearchCriteria.Op.EQ); + AsnSearch.done(); + ListZonesByDomainIdSearch = createSearchBuilder(); ListZonesByDomainIdSearch.and("domainId", ListZonesByDomainIdSearch.entity().getDomainId(), SearchCriteria.Op.EQ); ListZonesByDomainIdSearch.done(); diff --git a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java index db06c88cff4..c048b9de3a6 100644 --- a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java +++ b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java @@ -386,7 +386,7 @@ public class ManagementServerMock { ConfigurationManager mgr = (ConfigurationManager)_configService; _zone = mgr.createZone(User.UID_SYSTEM, "default", "8.8.8.8", null, "8.8.4.4", null, null /* cidr */, "ROOT", Domain.ROOT_DOMAIN, NetworkType.Advanced, null, - null /* networkDomain */, false, false, null, null); + null /* networkDomain */, false, false, null, null, null, null); } } diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 6594dd93e3a..8ee5af346fb 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -38,11 +38,11 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupService; import org.apache.cloudstack.affinity.dao.AffinityGroupDao; +import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd; import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd; @@ -1422,9 +1422,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } - private void checkZoneParameters(final String zoneName, final String dns1, final String dns2, final String internalDns1, final String internalDns2, final boolean checkForDuplicates, final Long domainId, - final String allocationStateStr, final String ip6Dns1, final String ip6Dns2) { - if (checkForDuplicates) { + private void checkZoneParameters(final boolean checkForDuplicateName, final String zoneName, final String dns1, final String dns2, final String internalDns1, final String internalDns2, final Long domainId, + final String allocationStateStr, final String ip6Dns1, final String ip6Dns2, boolean checkForDuplicateIp6SuperCidr, String ip6SuperCidr, boolean checkForDuplicateAsn, String asNumber) { + + if (checkForDuplicateName) { // Check if a zone with the specified name already exists if (validZone(zoneName)) { throw new InvalidParameterValueException("A zone with that name already exists. Please specify a unique zone name."); @@ -1458,13 +1459,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati throw new InvalidParameterValueException("Please enter a valid IP address for internal DNS2"); } - if (ip6Dns1 != null && ip6Dns1.length() > 0 && !NetUtils.isValidIpv6(ip6Dns1)) { - throw new InvalidParameterValueException("Please enter a valid IPv6 address for IP6 DNS1"); - } - - if (ip6Dns2 != null && ip6Dns2.length() > 0 && !NetUtils.isValidIpv6(ip6Dns2)) { - throw new InvalidParameterValueException("Please enter a valid IPv6 address for IP6 DNS2"); - } + //Check all the IPv6 parameters + validateIp6Parameters(ip6Dns1, ip6Dns2, ip6SuperCidr, asNumber, checkForDuplicateName, checkForDuplicateIp6SuperCidr, checkForDuplicateAsn); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { try { @@ -1589,6 +1585,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati String internalDns1 = cmd.getInternalDns1(); String internalDns2 = cmd.getInternalDns2(); String guestCidr = cmd.getGuestCidrAddress(); + String ip6SuperCidr = cmd.getIp6SuperCidrAddress(); + String asNumber = cmd.getAsNumber(); final List dnsSearchOrder = cmd.getDnsSearchOrder(); final Boolean isPublic = cmd.isPublic(); final String allocationStateStr = cmd.getAllocationState(); @@ -1683,6 +1681,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati guestCidr = zone.getGuestNetworkCidr(); } + final String oldIp6SuperCidr = zone.getIp6SuperNetworkCidr(); + if (ip6SuperCidr == null) { + ip6SuperCidr = oldIp6SuperCidr; + } + + final String oldAsNumber = zone.getAsNumber(); + if (asNumber == null) { + asNumber = oldAsNumber; + } + // validate network domain if (networkDomain != null && !networkDomain.isEmpty()) { if (!NetUtils.verifyDomainName(networkDomain)) { @@ -1692,8 +1700,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } - final boolean checkForDuplicates = !zoneName.equals(oldZoneName); - checkZoneParameters(zoneName, dns1, dns2, internalDns1, internalDns2, checkForDuplicates, null, allocationStateStr, ip6Dns1, ip6Dns2);// not allowing updating + final boolean checkForDuplicateName = !zoneName.equals(oldZoneName); + final boolean checkForDuplicateIp6SuperCidr = !org.apache.commons.lang.StringUtils.equals(ip6SuperCidr, oldIp6SuperCidr); + final boolean checkForDuplicateAsn = !org.apache.commons.lang.StringUtils.equals(asNumber, oldAsNumber); + checkZoneParameters(checkForDuplicateName, zoneName, dns1, dns2, internalDns1, internalDns2, null, allocationStateStr, ip6Dns1, ip6Dns2, checkForDuplicateIp6SuperCidr, + ip6SuperCidr, checkForDuplicateAsn, asNumber); + // not allowing updating // domain associated with // a zone, once created @@ -1705,6 +1717,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati zone.setInternalDns1(internalDns1); zone.setInternalDns2(internalDns2); zone.setGuestNetworkCidr(guestCidr); + zone.setIp6SuperNetworkCidr(ip6SuperCidr); + zone.setAsNumber(asNumber); if (localStorageEnabled != null) { zone.setLocalStorageEnabled(localStorageEnabled.booleanValue()); } @@ -1799,9 +1813,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati @Override @DB - public DataCenterVO createZone(final long userId, final String zoneName, final String dns1, final String dns2, final String internalDns1, final String internalDns2, final String guestCidr, final String domain, - final Long domainId, final NetworkType zoneType, final String allocationStateStr, final String networkDomain, final boolean isSecurityGroupEnabled, final boolean isLocalStorageEnabled, - final String ip6Dns1, final String ip6Dns2) { + public DataCenterVO createZone(final long userId, final String zoneName, final String dns1, final String dns2, final String internalDns1, final String internalDns2, final String guestCidr, final String domain, final Long domainId, + final NetworkType zoneType, final String allocationStateStr, final String networkDomain, final boolean isSecurityGroupEnabled, final boolean isLocalStorageEnabled, final String ip6Dns1, + final String ip6Dns2, final String ip6SuperCidr, String asNumber) { // checking the following params outside checkzoneparams method as we do // not use these params for updatezone @@ -1819,14 +1833,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } - checkZoneParameters(zoneName, dns1, dns2, internalDns1, internalDns2, true, domainId, allocationStateStr, ip6Dns1, ip6Dns2); + checkZoneParameters(true, zoneName, dns1, dns2, internalDns1, internalDns2, domainId, allocationStateStr, ip6Dns1, ip6Dns2, true, ip6SuperCidr, true, asNumber); final byte[] bytes = (zoneName + System.currentTimeMillis()).getBytes(); final String zoneToken = UUID.nameUUIDFromBytes(bytes).toString(); // Create the new zone in the database final DataCenterVO zoneFinal = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, - isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2, null, null); + isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2, ip6SuperCidr, asNumber); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { final Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zoneFinal.setAllocationState(allocationState); @@ -1856,6 +1870,36 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati }); } + void validateIp6Parameters(String ip6Dns1, String ip6Dns2, String ip6SuperCidr, String asNumber, boolean checkDuplicateName, boolean checkDuplicateIp6SuperCidr, boolean checkDuplicateAsn) { + if (StringUtils.isNotBlank(ip6Dns1) && !NetUtils.isValidIpv6(ip6Dns1)) { + throw new InvalidParameterValueException("Please enter a valid IPv6 address for IP6 DNS1"); + } + + if (StringUtils.isNotBlank(ip6Dns2) && !NetUtils.isValidIpv6(ip6Dns2)) { + throw new InvalidParameterValueException("Please enter a valid IPv6 address for IP6 DNS2"); + } + + if (StringUtils.isNotBlank(ip6SuperCidr)) { + if (!NetUtils.isValidIp6Cidr(ip6SuperCidr)) { + throw new InvalidParameterValueException("Please enter a valid IPv6 cidr"); + } + + if (!NetUtils.isValidPrivateAsn(asNumber)) { + throw new InvalidParameterValueException(String.format("Please specify a valid private autonomous system number", ApiConstants.AUTONOMOUS_NUMBER)); + } + + // If IPv6 guest CIDR is configured, make sure that the CIDR/Private ASN is not duplicate. + if (checkDuplicateIp6SuperCidr && !isIp6SuperCidrAvailable(ip6SuperCidr)) { + throw new InvalidParameterValueException(String.format("A zone with %s already exists. Please specify a unique IPv6 Guest CIDR.", ip6SuperCidr)); + } + if (checkDuplicateAsn && !isAsnAvailable(asNumber)) { + throw new InvalidParameterValueException(String.format("A zone with %s already exists. Please specify a unique private ASN.", asNumber)); + } + } else if (StringUtils.isNotBlank(asNumber)) { + throw new InvalidParameterValueException(String.format("%s parameter can not be set if IPv6 super CIDR is not configured", ApiConstants.AUTONOMOUS_NUMBER)); + } + } + private AffinityGroup createDedicatedAffinityGroup(String affinityGroupName, final Long domainId, final Long accountId) { if (affinityGroupName == null) { // default to a groupname with account/domain information @@ -1937,6 +1981,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final String internalDns1 = cmd.getInternalDns1(); final String internalDns2 = cmd.getInternalDns2(); final String guestCidr = cmd.getGuestCidrAddress(); + final String ip6SuperCidr = cmd.getIp6SuperCidrAddress(); + final String asNumber = cmd.getAsNumber(); final Long domainId = cmd.getDomainId(); final String type = cmd.getNetworkType(); Boolean isBasic = false; @@ -1958,8 +2004,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final NetworkType zoneType = isBasic ? NetworkType.Basic : NetworkType.Advanced; // error out when the parameter specified for Basic zone - if (zoneType == NetworkType.Basic && guestCidr != null) { - throw new InvalidParameterValueException("guestCidrAddress parameter is not supported for Basic zone"); + if (zoneType == NetworkType.Basic) { + if (StringUtils.isNotBlank(guestCidr)) { + throw new InvalidParameterValueException(String.format("%s parameter is not supported for Basic zone", ApiConstants.GUEST_CIDR_ADDRESS)); + } + if (StringUtils.isNotBlank(ip6SuperCidr)) { + throw new InvalidParameterValueException(String.format("%s parameter is not supported for Basic zone", ApiConstants.IP6_SUPER_CIDR_ADDRESS)); + } + if (StringUtils.isNotBlank(asNumber)) { + throw new InvalidParameterValueException(String.format("%s parameter is not supported for Basic zone", ApiConstants.AUTONOMOUS_NUMBER)); + } } DomainVO domainVO = null; @@ -1972,8 +2026,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati isSecurityGroupEnabled = true; } - return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, guestCidr, domainVO != null ? domainVO.getName() : null, domainId, zoneType, allocationState, - networkDomain, isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2); + return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, guestCidr, domainVO != null ? domainVO.getName() : null, domainId, zoneType, allocationState, networkDomain, + isSecurityGroupEnabled, isLocalStorageEnabled, ip6Dns1, ip6Dns2, ip6SuperCidr, asNumber); } @Override @@ -3742,6 +3796,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati return _zoneDao.findById(zoneId) != null; } + private boolean isIp6SuperCidrAvailable(String ip6SuperCidr) { + return (_zoneDao.findByIp6SuperCidr(ip6SuperCidr) == null); + } + + private boolean isAsnAvailable(String asNumber) { + return (_zoneDao.findByAsn(asNumber) == null); + } + private String getZoneName(final long zoneId) { final DataCenterVO zone = _zoneDao.findById(new Long(zoneId)); if (zone != null) { diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java index 5926a3491b9..1125050ad46 100644 --- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java +++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java @@ -33,6 +33,7 @@ import java.util.Map; import java.util.UUID; import com.cloud.user.User; + import org.apache.log4j.Logger; import org.junit.After; import org.junit.Assert; @@ -533,4 +534,82 @@ public class ConfigurationManagerTest { Mockito.when(_accountMgr.getAccount(1l)).thenReturn(account); Assert.assertNotNull(configurationMgr.getVlanAccount(42l)); } + + @Test + public void validateIp6Parameters() { + + //Validate Zone create + //** with no IPv6 + validateIp6ParameterTest(false, null, null, null, null, true, true, true, "Zone create with no IPv6 parameters should be accepted"); + + //** with invalid IPv6 DNS1 and invalid IPv6 DNS2 + validateIp6ParameterTest(true, "8.8.8.8", "8.8.4.4", null, null, true, true, true, "Zone create with invalid IPv6 DNS1/DNS1 parameters should not be accepted"); + + //** with valid IPv6 DNS1 and DNS2 + validateIp6ParameterTest(false, "2620:0:ccc::2", "2620:0:ccd::2", null, null, true, true, true, "Zone create with valid IPv6 DNS1/DNS1 parameters should be accepted"); + + //** with valid IPv6 DNS and invalid IPv6 Super Cidr + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "8.8.8.8", null, true, true, true, "Zone create with valid IPv6 DNS1/DNS1 and invalid IPv6 Super CIDR parameters should not be accepted"); + + //** with valid IPv6 DNS, valid IPv6 Super Cidr and invalid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "6500", true, true, true, "Zone create with valid IPv6 DNS1/DNS1, IPv6 Super CIDR and invalid asNumber parameters should not be accepted"); + + //** with valid IPv6 DNS, valid IPv6 Super Cidr and no asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", null, true, true, true, "Zone create with valid IPv6 DNS1/DNS1, IPv6 Super CIDR and no asNumber parameters should not be accepted"); + + //** with valid IPv6 DNS, invalid IPv6 Super Cidr and valid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0:0/50", "65000", true, true, true, "Zone create with valid IPv6 DNS1/DNS1, invalid IPv6 Super CIDR and valid asNumber parameters should not be accepted"); + + //** with valid IPv6 DNS, no IPv6 Super Cidr and valid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "", "65000", true, true, true, "Zone create with valid IPv6 DNS1/DNS1, no IPv6 Super CIDR and valid asNumber parameters should not be accepted"); + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(null); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(null); + //** with valid IPv6 DNS, Unique valid IPv6 Super Cidr and Unique valid asNumber + validateIp6ParameterTest(false, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", true, true, true, "Zone create with valid IPv6 DNS1/DNS1, unique IPv6 Super CIDR and asNumber parameters should be accepted"); + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(new DataCenterVO(0l, null, null, null, null, null, null, null, null, null, null, null, null)); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(null); + //** with valid IPv6 DNS, duplicate valid IPv6 Super Cidr and Unique valid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", true, true, true, "Zone create with valid IPv6 DNS1/DNS1, with duplicate IPv6 Super CIDR and unique asNumber parameters should not be accepted"); + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(null); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(new DataCenterVO(0l, null, null, null, null, null, null, null, null, null, null, null, null)); + //** with valid IPv6 DNS, Unique valid IPv6 Super Cidr and duplicate valid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", true, true, true, "Zone create with valid IPv6 DNS1/DNS1, with unique IPv6 Super CIDR and duplicate asNumber parameters should not be accepted"); + + //Validate Zone Edit which check no duplicate + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(null); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(null); + //** with valid IPv6 DNS, Unique valid IPv6 Super Cidr and Unique valid asNumber + validateIp6ParameterTest(false, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", false, false, false, "Zone create with valid IPv6 DNS1/DNS1, unique IPv6 Super CIDR and asNumber parameters should be accepted with no duplicate checks"); + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(new DataCenterVO(0l, null, null, null, null, null, null, null, null, null, null, null, null)); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(new DataCenterVO(0l, null, null, null, null, null, null, null, null, null, null, null, null)); + //** with valid IPv6 DNS, duplicate valid IPv6 Super Cidr and duplicate valid asNumber, with no duplicate checks. + validateIp6ParameterTest(false, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", false, false, false, "Zone create with valid IPv6 DNS1/DNS1, duplicate IPv6 Super CIDR and asNumber parameters should be accepted with no duplicate checks"); + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(new DataCenterVO(0l, null, null, null, null, null, null, null, null, null, null, null, null)); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(null); + //** with valid IPv6 DNS, duplicate valid IPv6 Super Cidr and Unique valid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", false, true, false, "Zone create with valid IPv6 DNS1/DNS1, duplicate IPv6 Super CIDR and unique asNumber parameters should not be accepted with no duplicate checks"); + + when(configurationMgr._zoneDao.findByIp6SuperCidr(anyString())).thenReturn(null); + when(configurationMgr._zoneDao.findByAsn(anyString())).thenReturn(new DataCenterVO(0l, null, null, null, null, null, null, null, null, null, null, null, null)); + //** with valid IPv6 DNS, Unique valid IPv6 Super Cidr and duplicate valid asNumber + validateIp6ParameterTest(true, "2620:0:ccc::2", "2620:0:ccd::2", "2001:67c:2834:0:0:0:0:0/50", "65000", false, false, true, "Zone create with valid IPv6 DNS1/DNS1, unique IPv6 Super CIDR and duplicate asNumber parameters should not be accepted"); + + } + + private void validateIp6ParameterTest(boolean shouldConditionFail, String ip6Dns1, String ip6Dns2, String ip6SuperCidr, String asNumber, boolean checkDuplicateName, + boolean checkDuplicateIp6SuperCidr, boolean checkDuplicateAsn, String message) { + boolean validationCheck = shouldConditionFail; + try { + configurationMgr.validateIp6Parameters(ip6Dns1, ip6Dns2, ip6SuperCidr, asNumber, checkDuplicateName, checkDuplicateIp6SuperCidr, checkDuplicateAsn); + } catch (InvalidParameterValueException e) { + validationCheck = !shouldConditionFail; + } + Assert.assertFalse(message, validationCheck); + } } diff --git a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java index fc535bdaa32..7bac9b6eabf 100644 --- a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java +++ b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java @@ -505,9 +505,9 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu * @see com.cloud.configuration.ConfigurationManager#createZone(long, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Long, com.cloud.dc.DataCenter.NetworkType, java.lang.String, java.lang.String, boolean, boolean) */ @Override - public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, - Long domainId, NetworkType zoneType, String allocationState, String networkDomain, boolean isSecurityGroupEnabled, boolean isLocalStorageEnabled, String ip6Dns1, - String ip6Dns2) { + public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, + NetworkType zoneType, String allocationState, String networkDomain, boolean isSecurityGroupEnabled, boolean isLocalStorageEnabled, String ip6Dns1, String ip6Dns2, + String ip6SuperCidr, String asNumber) { // TODO Auto-generated method stub return null; } diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index 4fcd6967f62..b8725a94ca6 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -704,6 +704,10 @@ class DeployDataCenters(object): zonecmd.domain = zone.domain if zone.securitygroupenabled != "true": zonecmd.guestcidraddress = zone.guestcidraddress + if zone.asNumber != "": + zonecmd.asNumber = zone.asNumber + if zone.ip6supercidraddress != "": + zonecmd.ip6supercidraddress = zone.ip6supercidraddress zoneId = self.createZone(zonecmd) if zoneId == FAILED: self.__tcRunLogger.\ diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 2cd4753a418..e263dce3785 100644 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -31,6 +31,7 @@ import java.net.URI; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Formatter; +import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; @@ -40,6 +41,7 @@ import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.SystemUtils; import org.apache.commons.net.util.SubnetUtils; import org.apache.commons.validator.routines.InetAddressValidator; @@ -51,6 +53,7 @@ import com.cloud.utils.script.Script; import com.googlecode.ipv6.IPv6Address; import com.googlecode.ipv6.IPv6AddressRange; import com.googlecode.ipv6.IPv6Network; +import com.googlecode.ipv6.IPv6NetworkMask; public class NetUtils { protected final static Logger s_logger = Logger.getLogger(NetUtils.class); @@ -1399,6 +1402,16 @@ public class NetUtils { return resultIp; } + /** + * Split a given IPv6 CIDR into multiple subnets based on the given prefix length + * @param ip6SuperNetworkCidr + * @param prefixLength + * @return Iterator + */ + public static Iterator splitIp6Network(String ip6NetworkCidr, int prefixLength) { + return IPv6Network.fromString(ip6NetworkCidr).split(IPv6NetworkMask.fromPrefixLength(prefixLength)); + } + public static String standardizeIp6Address(final String ip6Addr) { try { return IPv6Address.fromString(ip6Addr).toString(); @@ -1415,6 +1428,23 @@ public class NetUtils { } } + /** + * Validate if asNumber is in valid private ASN range as defined in rfc6996 + * @param asNumber + * @return true if valid + */ + public static boolean isValidPrivateAsn(String asNumber) { + if (StringUtils.isNotBlank(asNumber)) { + try { + Long asNumberLong = Long.parseLong(asNumber); + return ((asNumberLong >= 64512 && asNumberLong <= 65534) || (asNumberLong >= 4200000000l && asNumberLong <= 4294967294l)); + } catch (NumberFormatException nfe) { + return false; + } + } + return false; + } + static final String VLAN_PREFIX = "vlan://"; static final int VLAN_PREFIX_LENGTH = VLAN_PREFIX.length(); diff --git a/utils/test/com/cloud/utils/net/NetUtilsTest.java b/utils/test/com/cloud/utils/net/NetUtilsTest.java index 1ab4459d6ac..44fd91a2726 100644 --- a/utils/test/com/cloud/utils/net/NetUtilsTest.java +++ b/utils/test/com/cloud/utils/net/NetUtilsTest.java @@ -32,6 +32,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.math.BigInteger; +import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; @@ -39,6 +40,7 @@ import org.apache.log4j.Logger; import org.junit.Test; import com.googlecode.ipv6.IPv6Address; +import com.googlecode.ipv6.IPv6Network; public class NetUtilsTest { @@ -418,4 +420,21 @@ public class NetUtilsTest { assertTrue("It should pass! 31 bit prefix.", is31PrefixCidr); } + + @Test + public void testIp6NetworkSplit() { + Iterator ipv6networks = NetUtils.splitIp6Network("2001:67c:2834:0:0:0:0:0/50", 60); + assertTrue("IPv6 address should be split with out error", ipv6networks.hasNext()); + } + + @Test + public void testValidAsn() { + assertTrue("65000 is a valid private ASN", NetUtils.isValidPrivateAsn("65000")); + assertTrue("4200000000l is a valid private ASN", NetUtils.isValidPrivateAsn("4200000000")); + + assertFalse("6500 is an invalid ASN", NetUtils.isValidPrivateAsn("6500")); + assertFalse("null is an invalid ASN", NetUtils.isValidPrivateAsn(null)); + assertFalse("empty string is an invalid ASN", NetUtils.isValidPrivateAsn("")); + assertFalse("abc string is an invalid ASN", NetUtils.isValidPrivateAsn("abc")); + } } \ No newline at end of file