Merge branch 'merge/feature-vpc-ipv6' into feature/vpc-ipv6

This closes #3
This commit is contained in:
wilderrodrigues 2015-06-10 09:07:30 +02:00
commit 3b91964465
14 changed files with 304 additions and 37 deletions

View File

@ -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";

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -96,4 +96,8 @@ public interface DataCenterDao extends GenericDao<DataCenterVO, Long> {
List<DataCenterVO> findByKeyword(String keyword);
List<DataCenterVO> listAllZones();
DataCenterVO findByIp6SuperCidr(String ip6SuperCidr);
DataCenterVO findByAsn(String asNumber);
}

View File

@ -61,6 +61,8 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
private static final Logger s_logger = Logger.getLogger(DataCenterDaoImpl.class);
protected SearchBuilder<DataCenterVO> NameSearch;
protected SearchBuilder<DataCenterVO> Ip6SuperCidrSearch;
protected SearchBuilder<DataCenterVO> AsnSearch;
protected SearchBuilder<DataCenterVO> ListZonesByDomainIdSearch;
protected SearchBuilder<DataCenterVO> PublicZonesSearch;
protected SearchBuilder<DataCenterVO> ChildZonesSearch;
@ -91,6 +93,20 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
return findOneBy(sc);
}
@Override
public DataCenterVO findByIp6SuperCidr(String ip6SuperCidr) {
SearchCriteria<DataCenterVO> sc = Ip6SuperCidrSearch.create();
sc.setParameters("ip6SuperNetworkCidr", ip6SuperCidr);
return findOneBy(sc);
}
@Override
public DataCenterVO findByAsn(String asNumber) {
SearchCriteria<DataCenterVO> sc = AsnSearch.create();
sc.setParameters("asNumber", asNumber);
return findOneBy(sc);
}
@Override
public DataCenterVO findByToken(String zoneToken) {
SearchCriteria<DataCenterVO> sc = TokenSearch.create();
@ -323,6 +339,15 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> 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();

View File

@ -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);
}
}

View File

@ -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<String> 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) {

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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.\

View File

@ -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<IPv6Network>
*/
public static Iterator<IPv6Network> 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();

View File

@ -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<IPv6Network> 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"));
}
}