From 18ec438793bf7324ed2e849ccae2186fa0533cd3 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Wed, 8 Feb 2012 15:09:35 -0800 Subject: [PATCH] Revert zone guest cidr setting --- .../com/cloud/api/commands/CreateZoneCmd.java | 7 ++ .../com/cloud/api/commands/UpdateZoneCmd.java | 7 ++ .../com/cloud/api/response/ZoneResponse.java | 7 ++ api/src/com/cloud/dc/DataCenter.java | 2 + .../src/com/cloud/api/ApiResponseHelper.java | 1 + .../configuration/ConfigurationManager.java | 3 +- .../ConfigurationManagerImpl.java | 82 +++++++++++++++++-- server/src/com/cloud/dc/DataCenterVO.java | 21 ++++- .../com/cloud/network/NetworkManagerImpl.java | 11 ++- .../guru/ExternalGuestNetworkGuru.java | 23 +----- .../cloud/network/guru/GuestNetworkGuru.java | 50 ++++++----- server/src/com/cloud/test/DatabaseConfig.java | 7 +- server/src/com/cloud/test/PodZoneConfig.java | 28 ++++++- setup/db/create-schema.sql | 1 + setup/db/db/schema-2214to30.sql | 1 - setup/db/server-setup.xml | 1 + 16 files changed, 195 insertions(+), 57 deletions(-) diff --git a/api/src/com/cloud/api/commands/CreateZoneCmd.java b/api/src/com/cloud/api/commands/CreateZoneCmd.java index 493120ca471..755a25599fe 100755 --- a/api/src/com/cloud/api/commands/CreateZoneCmd.java +++ b/api/src/com/cloud/api/commands/CreateZoneCmd.java @@ -47,6 +47,9 @@ public class CreateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.DNS2, type=CommandType.STRING, description="the second DNS for the Zone") private String dns2; + @Parameter(name=ApiConstants.GUEST_CIDR_ADDRESS, type=CommandType.STRING, description="the guest CIDR address for the Zone") + private String guestCidrAddress; + @Parameter(name=ApiConstants.INTERNAL_DNS1, type=CommandType.STRING, required=true, description="the first internal DNS for the Zone") private String internalDns1; @@ -84,6 +87,10 @@ public class CreateZoneCmd extends BaseCmd { return dns2; } + public String getGuestCidrAddress() { + return guestCidrAddress; + } + public String getInternalDns1() { return internalDns1; } diff --git a/api/src/com/cloud/api/commands/UpdateZoneCmd.java b/api/src/com/cloud/api/commands/UpdateZoneCmd.java index 1f6cba8949a..9b2a29519a9 100755 --- a/api/src/com/cloud/api/commands/UpdateZoneCmd.java +++ b/api/src/com/cloud/api/commands/UpdateZoneCmd.java @@ -50,6 +50,9 @@ public class UpdateZoneCmd extends BaseCmd { @Parameter(name=ApiConstants.DNS2, type=CommandType.STRING, description="the second DNS for the Zone") private String dns2; + @Parameter(name=ApiConstants.GUEST_CIDR_ADDRESS, type=CommandType.STRING, description="the guest CIDR address for the Zone") + private String guestCidrAddress; + @IdentityMapper(entityTableName="data_center") @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the Zone") private Long id; @@ -93,6 +96,10 @@ public class UpdateZoneCmd extends BaseCmd { return dns2; } + public String getGuestCidrAddress() { + return guestCidrAddress; + } + public Long getId() { return id; } diff --git a/api/src/com/cloud/api/response/ZoneResponse.java b/api/src/com/cloud/api/response/ZoneResponse.java index 47032fb241b..d8f8a6fbb31 100755 --- a/api/src/com/cloud/api/response/ZoneResponse.java +++ b/api/src/com/cloud/api/response/ZoneResponse.java @@ -50,6 +50,9 @@ public class ZoneResponse extends BaseResponse { @SerializedName(ApiConstants.VLAN) @Param(description="the vlan range of the zone") private String vlan; + @SerializedName(ApiConstants.GUEST_CIDR_ADDRESS) @Param(description="the guest CIDR address for the Zone") + private String guestCidrAddress; + //TODO - generate description @SerializedName("status") private String status; @@ -116,6 +119,10 @@ public class ZoneResponse extends BaseResponse { this.vlan = vlan; } + public void setGuestCidrAddress(String guestCidrAddress) { + this.guestCidrAddress = guestCidrAddress; + } + public void setStatus(String status) { this.status = status; } diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 7ccaefb4ef3..4d0affb1259 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -41,6 +41,8 @@ public interface DataCenter extends Grouping { String getDns2(); + String getGuestNetworkCidr(); + String getName(); Long getDomainId(); diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index c04ac027517..f2840486cb4 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -861,6 +861,7 @@ public class ApiResponseHelper implements ResponseGenerator { zoneResponse.setInternalDns1(dataCenter.getInternalDns1()); zoneResponse.setInternalDns2(dataCenter.getInternalDns2()); // FIXME zoneResponse.setVlan(dataCenter.get.getVnet()); + zoneResponse.setGuestCidrAddress(dataCenter.getGuestNetworkCidr()); } if (showCapacities != null && showCapacities) { diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index c043fbf0da9..daa64c08295 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -123,6 +123,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @param dns2 * @param internalDns1 * @param internalDns2 + * @param guestCidr * @param zoneType * @param allocationState * @param networkDomain @@ -133,7 +134,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @throws * @throws */ - DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String domain, Long domainId, NetworkType zoneType, String allocationState, + 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); /** diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 25557067f0f..ad27d44c2ec 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1360,6 +1360,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String dns2 = cmd.getDns2(); String internalDns1 = cmd.getInternalDns1(); String internalDns2 = cmd.getInternalDns2(); + String guestCidr = cmd.getGuestCidrAddress(); List dnsSearchOrder = cmd.getDnsSearchOrder(); Boolean isPublic = cmd.isPublic(); String allocationStateStr = cmd.getAllocationState(); @@ -1410,6 +1411,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura zoneName = zone.getName(); } + if ((guestCidr != null) && !NetUtils.validateGuestCidr(guestCidr)) { + throw new InvalidParameterValueException("Please enter a valid guest cidr"); + } + // Make sure the zone exists if (!validZone(zoneId)) { throw new InvalidParameterValueException("A zone with ID: " + zoneId + " does not exist."); @@ -1433,6 +1438,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura internalDns1 = zone.getInternalDns1(); } + if (guestCidr == null) { + guestCidr = zone.getGuestNetworkCidr(); + } + // validate network domain if (networkDomain != null && !networkDomain.isEmpty()) { if (!NetUtils.verifyDomainName(networkDomain)) { @@ -1459,6 +1468,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura zone.setDns2(dns2); zone.setInternalDns1(internalDns1); zone.setInternalDns2(internalDns2); + zone.setGuestNetworkCidr(guestCidr); if (networkDomain != null) { if (networkDomain.isEmpty()) { @@ -1531,12 +1541,15 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura @Override @DB - public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String domain, Long domainId, + public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType, String allocationStateStr, String networkDomain, boolean isSecurityGroupEnabled) { // checking the following params outside checkzoneparams method as we do // not use these params for updatezone // hence the method below is generic to check for common params + if ((guestCidr != null) && !NetUtils.validateGuestCidr(guestCidr)) { + throw new InvalidParameterValueException("Please enter a valid guest cidr"); + } // Validate network domain if (networkDomain != null) { @@ -1555,7 +1568,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura try { txn.start(); // Create the new zone in the database - DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled); + DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr, domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled); if (allocationStateStr != null && !allocationStateStr.isEmpty()) { Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr); zone.setAllocationState(allocationState); @@ -1625,6 +1638,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String dns2 = cmd.getDns2(); String internalDns1 = cmd.getInternalDns1(); String internalDns2 = cmd.getInternalDns2(); + String guestCidr = cmd.getGuestCidrAddress(); Long domainId = cmd.getDomainId(); String type = cmd.getNetworkType(); Boolean isBasic = false; @@ -1644,6 +1658,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura NetworkType zoneType = isBasic ? NetworkType.Basic : NetworkType.Advanced; + // Guest cidr is required for Advanced zone creation; error out when the + // parameter specified for Basic zone + if (zoneType == NetworkType.Advanced && guestCidr == null && !isSecurityGroupEnabled) { + throw new InvalidParameterValueException("guestCidrAddress parameter is required for Advanced zone creation"); + } else if (zoneType == NetworkType.Basic && guestCidr != null) { + throw new InvalidParameterValueException("guestCidrAddress parameter is not supported for Basic zone"); + } + DomainVO domainVO = null; if (userId == null) { @@ -1658,7 +1680,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura isSecurityGroupEnabled = true; } - return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, domainVO != null ? domainVO.getName() : null, domainId, zoneType, allocationState, networkDomain, + return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, guestCidr, domainVO != null ? domainVO.getName() : null, domainId, zoneType, allocationState, networkDomain, isSecurityGroupEnabled); } @@ -2345,8 +2367,29 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String newVlanSubnet = NetUtils.getSubNet(vlanGateway, vlanNetmask); - // TODO: Check if the new VLAN's subnet conflicts with the guest network in + // Check if the new VLAN's subnet conflicts with the guest network in // the specified zone (guestCidr is null for basic zone) + String guestNetworkCidr = zone.getGuestNetworkCidr(); + if (guestNetworkCidr != null) { + String[] cidrPair = guestNetworkCidr.split("\\/"); + String guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrPair[0], Long.parseLong(cidrPair[1])); + long guestCidrSize = Long.parseLong(cidrPair[1]); + long vlanCidrSize = NetUtils.getCidrSize(vlanNetmask); + + long cidrSizeToUse = -1; + if (vlanCidrSize < guestCidrSize) { + cidrSizeToUse = vlanCidrSize; + } else { + cidrSizeToUse = guestCidrSize; + } + + String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse); + + if (newVlanSubnet.equals(guestSubnet)) { + throw new InvalidParameterValueException("The new IP range you have specified has the same subnet as the guest network in zone: " + zone.getName() + + ". Please specify a different gateway/netmask."); + } + } // Check if there are any errors with the IP range checkPublicIpRangeErrors(zoneId, vlanId, vlanGateway, vlanNetmask, startIP, endIP); @@ -2758,6 +2801,18 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura newCidrPair.add(1, (long) getCidrSize(cidr)); currentPodCidrSubnets.put(new Long(-1), newCidrPair); + DataCenterVO dcVo = _zoneDao.findById(dcId); + String guestNetworkCidr = dcVo.getGuestNetworkCidr(); + + // Guest cidr can be null for Basic zone + String guestIpNetwork = null; + Long guestCidrSize = null; + if (guestNetworkCidr != null) { + String[] cidrTuple = guestNetworkCidr.split("\\/"); + guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1])); + guestCidrSize = Long.parseLong(cidrTuple[1]); + } + String zoneName = getZoneName(dcId); // Iterate through all pods in this zone @@ -2774,10 +2829,27 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura long cidrSize = ((Long) cidrPair.get(1)).longValue(); long cidrSizeToUse = -1; - cidrSizeToUse = cidrSize; + if (guestCidrSize == null || cidrSize < guestCidrSize) { + cidrSizeToUse = cidrSize; + } else { + cidrSizeToUse = guestCidrSize; + } String cidrSubnet = NetUtils.getCidrSubNet(cidrAddress, cidrSizeToUse); + if (guestNetworkCidr != null) { + String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse); + // Check that cidrSubnet does not equal guestSubnet + if (cidrSubnet.equals(guestSubnet)) { + if (podName.equals("newPod")) { + throw new InvalidParameterValueException("The subnet of the pod you are adding conflicts with the subnet of the Guest IP Network. Please specify a different CIDR."); + } else { + throw new InvalidParameterValueException("Warning: The subnet of pod " + podName + " in zone " + zoneName + + " conflicts with the subnet of the Guest IP Network. Please change either the pod's CIDR or the Guest IP Network's subnet, and re-run install-vmops-management."); + } + } + } + // Iterate through the rest of the pods for (Long otherPodId : currentPodCidrSubnets.keySet()) { if (podId.equals(otherPodId)) { diff --git a/server/src/com/cloud/dc/DataCenterVO.java b/server/src/com/cloud/dc/DataCenterVO.java index cd8cc46a369..d0fcdcc3ace 100644 --- a/server/src/com/cloud/dc/DataCenterVO.java +++ b/server/src/com/cloud/dc/DataCenterVO.java @@ -69,6 +69,9 @@ public class DataCenterVO implements DataCenter, Identity { @Column(name="router_mac_address", updatable = false, nullable=false) private String routerMacAddress = "02:00:00:00:00:01"; + @Column(name="guest_network_cidr") + private String guestNetworkCidr = null; + @Column(name="domain_id") private Long domainId = null; @@ -171,20 +174,21 @@ public class DataCenterVO implements DataCenter, Identity { this.firewallProvider = firewallProvider; } - public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { - this(name, description, dns1, dns2, dns3, dns4, domain, domainId, zoneType, zoneToken, domainSuffix, false); + 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); 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 domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled) { + 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) { this.name = name; this.description = description; this.dns1 = dns1; this.dns2 = dns2; this.internalDns1 = dns3; this.internalDns2 = dns4; + this.guestNetworkCidr = guestCidr; this.domain = domain; this.domainId = domainId; this.networkType = zoneType; @@ -230,6 +234,17 @@ public class DataCenterVO implements DataCenter, Identity { this.userDataProvider = userDataProvider; } + @Override + public String getGuestNetworkCidr() + { + return guestNetworkCidr; + } + + public void setGuestNetworkCidr(String guestNetworkCidr) + { + this.guestNetworkCidr = guestNetworkCidr; + } + @Override public Long getDomainId() { return domainId; diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 8d1c9d1e37d..3002ead0912 100644 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2491,11 +2491,14 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (networks == null || networks.isEmpty()) { throw new CloudRuntimeException("Fail to create a network"); } else { - if (networks.size() > 1) { - throw new InvalidParameterValueException("Cannot determine a guest network to deploy in, please specify one"); - } if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) { - network = networks.get(0); + Network defaultGuestNetwork = networks.get(0); + for (Network nw : networks) { + if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) { + defaultGuestNetwork = nw; + } + } + network = defaultGuestNetwork; } else { // For shared network network = networks.get(0); diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 22afdcec5f1..62803eeae68 100644 --- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -102,10 +102,6 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { return null; } - if (config.isSpecifiedCidr()) { - return super.implement(config, offering, dest, context); - } - DataCenter zone = dest.getDataCenter(); NetworkVO implemented = new NetworkVO(config.getTrafficType(), config.getMode(), config.getBroadcastDomainType(), config.getNetworkOfferingId(), State.Allocated, config.getDataCenterId(), config.getPhysicalNetworkId()); @@ -132,6 +128,8 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { int offset = getVlanOffset(config.getPhysicalNetworkId(), vlanTag); // Determine the new gateway and CIDR + String[] oldCidr = config.getCidr().split("/"); + String oldCidrAddress = oldCidr[0]; int cidrSize = getGloballyConfiguredCidrSize(); // If the offset has more bits than there is room for, return null @@ -140,8 +138,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { throw new CloudRuntimeException("The offset " + offset + " needs " + bitsInOffset + " bits, but only have " + (cidrSize - 8) + " bits to work with."); } - // Use 10.1.1.1 which is reserved for private address - long newCidrAddress = (NetUtils.ip2Long("10.1.1.1") & 0xff000000) | (offset << (32 - cidrSize)); + long newCidrAddress = (NetUtils.ip2Long(oldCidrAddress) & 0xff000000) | (offset << (32 - cidrSize)); implemented.setGateway(NetUtils.long2Ip(newCidrAddress + 1)); implemented.setCidr(NetUtils.long2Ip(newCidrAddress) + "/" + cidrSize); implemented.setState(State.Implemented); @@ -196,11 +193,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { @Override public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { - - if (config.isSpecifiedCidr()) { - return super.allocate(config, nic, vm); - } - + if (nic != null && nic.getRequestedIp() != null) { throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic); } @@ -228,10 +221,6 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { return; } - if (config.isSpecifiedCidr()) { - return; - } - nic.setIp4Address(null); nic.setGateway(null); nic.setNetmask(null); @@ -246,10 +235,6 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { if (_ovsNetworkMgr.isOvsNetworkEnabled()) { return; } - if (config.isSpecifiedCidr()) { - super.reserve(nic, config, vm, dest, context); - return; - } DataCenter dc = _dcDao.findById(config.getDataCenterId()); diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java index 809ee32e3ae..91f4e377277 100755 --- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java @@ -132,16 +132,28 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { } if (userSpecified.getCidr() != null) { - //TODO add cidr checking network.setCidr(userSpecified.getCidr()); network.setGateway(userSpecified.getGateway()); network.setSpecifiedCidr(true); + } else { + String guestNetworkCidr = dc.getGuestNetworkCidr(); + // guest network cidr can be null for Basic zone + if (guestNetworkCidr != null) { + String[] cidrTuple = guestNetworkCidr.split("\\/"); + network.setGateway(NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1]))); + network.setCidr(guestNetworkCidr); + } } if (offering.getSpecifyVlan()) { network.setBroadcastUri(userSpecified.getBroadcastUri()); network.setState(State.Setup); } + } else { + String guestNetworkCidr = dc.getGuestNetworkCidr(); + String[] cidrTuple = guestNetworkCidr.split("\\/"); + network.setGateway(NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1]))); + network.setCidr(guestNetworkCidr); } return network; @@ -302,27 +314,25 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { DataCenter dc = _dcDao.findById(network.getDataCenterId()); if (nic.getIp4Address() == null) { - if (network.isSpecifiedCidr()) { - nic.setBroadcastUri(network.getBroadcastUri()); - nic.setIsolationUri(network.getBroadcastUri()); - nic.setGateway(network.getGateway()); + nic.setBroadcastUri(network.getBroadcastUri()); + nic.setIsolationUri(network.getBroadcastUri()); + nic.setGateway(network.getGateway()); - String guestIp = null; - if (network.getSpecifyIpRanges()) { - _networkMgr.allocateDirectIp(nic, dc, vm, network, nic.getRequestedIp()); - } else { - guestIp = _networkMgr.acquireGuestIpAddress(network, nic.getRequestedIp()); - if (guestIp == null) { - throw new InsufficientVirtualNetworkCapcityException("Unable to acquire Guest IP address for network " + network, DataCenter.class, dc.getId()); - } - - nic.setIp4Address(guestIp); - nic.setNetmask(NetUtils.cidr2Netmask(network.getCidr())); - - nic.setDns1(dc.getDns1()); - nic.setDns2(dc.getDns2()); - nic.setFormat(AddressFormat.Ip4); + String guestIp = null; + if (network.getSpecifyIpRanges()) { + _networkMgr.allocateDirectIp(nic, dc, vm, network, nic.getRequestedIp()); + } else { + guestIp = _networkMgr.acquireGuestIpAddress(network, nic.getRequestedIp()); + if (guestIp == null) { + throw new InsufficientVirtualNetworkCapcityException("Unable to acquire Guest IP address for network " + network, DataCenter.class, dc.getId()); } + + nic.setIp4Address(guestIp); + nic.setNetmask(NetUtils.cidr2Netmask(network.getCidr())); + + nic.setDns1(dc.getDns1()); + nic.setDns2(dc.getDns2()); + nic.setFormat(AddressFormat.Ip4); } } diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 2e71c6fc287..85aa0ffd68c 100755 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java @@ -640,6 +640,7 @@ public class DatabaseConfig { String internalDns1 = _currentObjectParams.get("internalDns1"); String internalDns2 = _currentObjectParams.get("internalDns2"); //String vnetRange = _currentObjectParams.get("vnet"); + String guestNetworkCidr = _currentObjectParams.get("guestNetworkCidr"); String networkType = _currentObjectParams.get("networktype"); // Check that all IPs are valid @@ -656,9 +657,11 @@ public class DatabaseConfig { if (!IPRangeConfig.validOrBlankIP(internalDns2)) { printError(ipError + "internalDns2"); } + if (!IPRangeConfig.validCIDR(guestNetworkCidr)) { + printError("Please enter a valid value for guestNetworkCidr"); + } - pzc.saveZone(false, id, name, dns1, dns2, internalDns1, internalDns2, networkType); - + pzc.saveZone(false, id, name, dns1, dns2, internalDns1, internalDns2, guestNetworkCidr, networkType); } private void savePhysicalNetwork() { diff --git a/server/src/com/cloud/test/PodZoneConfig.java b/server/src/com/cloud/test/PodZoneConfig.java index 77c74d3a4f7..c14c034c550 100644 --- a/server/src/com/cloud/test/PodZoneConfig.java +++ b/server/src/com/cloud/test/PodZoneConfig.java @@ -82,6 +82,14 @@ public class PodZoneConfig { //get the guest network cidr and guest netmask from the zone // DataCenterVO dcVo = _dcDao.findById(dcId); + String guestNetworkCidr = IPRangeConfig.getGuestNetworkCidr(dcId); + + if (guestNetworkCidr == null || guestNetworkCidr.isEmpty()) return "Please specify a valid guest cidr"; + String[] cidrTuple = guestNetworkCidr.split("\\/"); + + String guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrTuple[0], Long.parseLong(cidrTuple[1])); + long guestCidrSize = Long.parseLong(cidrTuple[1]); + // Iterate through all pods in this zone for (Long podId : currentPodCidrSubnets.keySet()) { String podName; @@ -93,9 +101,20 @@ public class PodZoneConfig { long cidrSize = ((Long) cidrPair.get(1)).longValue(); long cidrSizeToUse = -1; - cidrSizeToUse = cidrSize; + if (cidrSize < guestCidrSize) cidrSizeToUse = cidrSize; + else cidrSizeToUse = guestCidrSize; String cidrSubnet = NetUtils.getCidrSubNet(cidrAddress, cidrSizeToUse); + String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse); + + // Check that cidrSubnet does not equal guestSubnet + if (cidrSubnet.equals(guestSubnet)) { + if (podName.equals("newPod")) { + return "The subnet of the pod you are adding conflicts with the subnet of the Guest IP Network. Please specify a different CIDR."; + } else { + return "Warning: The subnet of pod " + podName + " in zone " + zoneName + " conflicts with the subnet of the Guest IP Network. Please change either the pod's CIDR or the Guest IP Network's subnet, and re-run install-vmops-management."; + } + } // Iterate through the rest of the pods for (Long otherPodId : currentPodCidrSubnets.keySet()) { @@ -242,7 +261,7 @@ public class PodZoneConfig { } @DB - public void saveZone(boolean printOutput, long id, String name, String dns1, String dns2, String dns3, String dns4, String networkType) { + public void saveZone(boolean printOutput, long id, String name, String dns1, String dns2, String dns3, String dns4, String guestNetworkCidr, String networkType) { if (printOutput) System.out.println("Saving zone, please wait..."); @@ -277,6 +296,11 @@ public class PodZoneConfig { values += ",'" + dns4 + "'"; } + if(guestNetworkCidr != null) { + columns += ", guest_network_cidr"; + values += ",'" + guestNetworkCidr + "'"; + } + if(networkType != null) { columns += ", networktype"; values += ",'" + networkType + "'"; diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index e91679b7375..ec79740bf25 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -527,6 +527,7 @@ CREATE TABLE `cloud`.`data_center` ( `netmask` varchar(15), `router_mac_address` varchar(17) NOT NULL DEFAULT '02:00:00:00:00:01' COMMENT 'mac address for the router within the domain', `mac_address` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Next available mac address for the ethernet card interacting with public internet', + `guest_network_cidr` varchar(18), `domain` varchar(100) COMMENT 'Network domain name of the Vms of the zone', `domain_id` bigint unsigned COMMENT 'domain id for the parent domain to this zone (null signifies public zone)', `networktype` varchar(255) NOT NULL DEFAULT 'Basic' COMMENT 'Network type of the zone', diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index 5836d902216..105d92f6c38 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -195,7 +195,6 @@ ALTER TABLE `cloud`.`project_invitations` ADD CONSTRAINT `uc_project_invitations ALTER TABLE `cloud`.`data_center` ADD COLUMN `uuid` varchar(40); ALTER TABLE `cloud`.`data_center` ADD CONSTRAINT `uc_data_center__uuid` UNIQUE (`uuid`); -ALTER TABLE `cloud`.`data_center` DROP COLUMN `guest_network_cidr`; ALTER TABLE `cloud`.`host` ADD COLUMN `uuid` varchar(40); ALTER TABLE `cloud`.`host` ADD CONSTRAINT `uc_host__uuid` UNIQUE (`uuid`); diff --git a/setup/db/server-setup.xml b/setup/db/server-setup.xml index 490c19ccc3a..4035902d327 100755 --- a/setup/db/server-setup.xml +++ b/setup/db/server-setup.xml @@ -20,6 +20,7 @@ 4.2.2.2 255.255.255.0 560-579 + 10.1.1.0/24 Advanced