Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id AC13B10227 for ; Mon, 22 Jul 2013 21:29:52 +0000 (UTC) Received: (qmail 29357 invoked by uid 500); 22 Jul 2013 21:29:52 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 29341 invoked by uid 500); 22 Jul 2013 21:29:52 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 29334 invoked by uid 99); 22 Jul 2013 21:29:52 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 22 Jul 2013 21:29:52 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 501A08B1084; Mon, 22 Jul 2013 21:29:52 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: anthonyxu@apache.org To: commits@cloudstack.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: git commit: updated refs/heads/master to 04cdd90 Date: Mon, 22 Jul 2013 21:29:52 +0000 (UTC) Updated Branches: refs/heads/master 8a6892d54 -> 04cdd90a8 in one zone, Admin should not be allowed to add a Shared Network with a subnet that is already associated with another Vlan. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/04cdd90a Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/04cdd90a Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/04cdd90a Branch: refs/heads/master Commit: 04cdd90a84f4be5ba02778fe0cd352a4b1c39a13 Parents: 8a6892d Author: Anthony Xu Authored: Mon Jul 22 14:16:20 2013 -0700 Committer: Anthony Xu Committed: Mon Jul 22 14:29:38 2013 -0700 ---------------------------------------------------------------------- .../configuration/ConfigurationManagerImpl.java | 115 +++++++------------ .../com/cloud/network/NetworkServiceImpl.java | 7 +- 2 files changed, 41 insertions(+), 81 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/04cdd90a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 92178c9..9bc8efd 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2978,30 +2978,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } if (ipv4) { - String newVlanSubnet = NetUtils.getSubNet(vlanGateway, vlanNetmask); + String newCidr = NetUtils.getCidrFromGatewayAndNetmask(vlanGateway, vlanNetmask); // 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)) { + if ( guestNetworkCidr != null ) { + if (NetUtils.isNetworksOverlap(newCidr, guestNetworkCidr)) { throw new InvalidParameterValueException( - "The new IP range you have specified has the same subnet as the guest network in zone: " + "The new IP range you have specified has overlapped with the guest network in zone: " + zone.getName() + ". Please specify a different gateway/netmask."); } } @@ -3009,29 +2995,36 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // Check if there are any errors with the IP range checkPublicIpRangeErrors(zoneId, vlanId, vlanGateway, vlanNetmask, startIP, endIP); - // Throw an exception if any of the following is true: - // 1. Another VLAN in the same zone has a different tag but the same - // subnet as the new VLAN. Make an exception for the - // case when both vlans are Direct. - // 2. Another VLAN in the same zone that has the same tag and subnet - // as - // the new VLAN has IPs that overlap with the IPs - // being added - // 3. Another VLAN in the same zone that has the same tag and subnet - // as - // the new VLAN has a different gateway than the - // new VLAN - // 4. If VLAN is untagged and Virtual, and there is existing - // UNTAGGED - // vlan with different subnet + // Throw an exception if this subnet overlaps with subnet on other VLAN, + // if this is ip range extension, gateway, network mask should be same and ip range should not overlap + List vlans = _vlanDao.listByZone(zone.getId()); for (VlanVO vlan : vlans) { String otherVlanGateway = vlan.getVlanGateway(); + String otherVlanNetmask = vlan.getVlanNetmask(); // Continue if it's not IPv4 - if (otherVlanGateway == null) { + if ( otherVlanGateway == null || otherVlanNetmask == null ) { + continue; + } + if ( vlan.getNetworkId() == null ) { continue; } - String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask()); + String otherCidr = NetUtils.getCidrFromGatewayAndNetmask(otherVlanGateway, otherVlanNetmask); + if( !NetUtils.isNetworksOverlap(newCidr, otherCidr)) { + continue; + } + // from here, subnet overlaps + if ( !vlanId.equals(vlan.getVlanTag()) ) { + throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + + " in zone " + zone.getName() + + " has overlapped with the subnet. Please specify a different gateway/netmask."); + } + if ( vlan.getNetworkId() != networkId) { + throw new InvalidParameterValueException("This subnet is overlapped with subnet in other network " + vlan.getNetworkId() + + " in zone " + zone.getName() + + " . Please specify a different gateway/netmask."); + + } String[] otherVlanIpRange = vlan.getIpRange().split("\\-"); String otherVlanStartIP = otherVlanIpRange[0]; String otherVlanEndIP = null; @@ -3039,34 +3032,15 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati otherVlanEndIP = otherVlanIpRange[1]; } - if (forVirtualNetwork && !vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet) - && !allowIpRangeOverlap(vlan, forVirtualNetwork, networkId)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() - + " in zone " + zone.getName() - + " has the same subnet. Please specify a different gateway/netmask."); - } - - boolean vlansUntaggedAndVirtual = (vlanId.equals(Vlan.UNTAGGED) && vlanId.equals(vlan.getVlanTag()) - && forVirtualNetwork && vlan.getVlanType() == VlanType.VirtualNetwork); - - if (vlansUntaggedAndVirtual && !newVlanSubnet.equals(otherVlanSubnet)) { - throw new InvalidParameterValueException( - "The Untagged ip range with different subnet already exists in zone " + zone.getId()); + //extend IP range + if (!vlanGateway.equals(otherVlanGateway) || !vlanNetmask.equals(vlan.getVlanNetmask())) { + throw new InvalidParameterValueException("The IP range has already been added with gateway " + + otherVlanGateway + " ,and netmask " + otherVlanNetmask + + ", Please specify the gateway/netmask if you want to extend ip range" ); } - - if (vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) { - if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) { - throw new InvalidParameterValueException( - "The IP range with tag: " - + vlan.getVlanTag() - + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); - } - - if (!vlanGateway.equals(otherVlanGateway)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() - + " has already been added with gateway " + otherVlanGateway - + ". Please specify a different tag."); - } + if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) { + throw new InvalidParameterValueException("The IP range already has IPs that overlap with the new range." + + " Please specify a different start IP/end IP."); } } } @@ -3085,15 +3059,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } if (vlanId.equals(vlan.getVlanTag())) { if (NetUtils.isIp6RangeOverlap(ipv6Range, vlan.getIp6Range())) { - throw new InvalidParameterValueException( - "The IPv6 range with tag: " - + vlan.getVlanTag() - + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); + throw new InvalidParameterValueException("The IPv6 range with tag: " + vlan.getVlanTag() + + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); } if (!vlanIp6Gateway.equals(vlan.getIp6Gateway())) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() - + " has already been added with gateway " + vlan.getIp6Gateway() + throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + vlan.getIp6Gateway() + ". Please specify a different tag."); } } @@ -4911,14 +4882,6 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } - private boolean allowIpRangeOverlap(VlanVO vlan, boolean forVirtualNetwork, long networkId) { - // FIXME - delete restriction for virtual network in the future - if (vlan.getVlanType() == VlanType.DirectAttached && !forVirtualNetwork) { - return true; - } else { - return false; - } - } @Override public ServiceOffering getServiceOffering(long serviceOfferingId) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/04cdd90a/server/src/com/cloud/network/NetworkServiceImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index f1f71ca..23bed01 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -1233,13 +1233,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } - // Vlan is created in 2 cases - works in Advance zone only: + // Vlan is created in 1 cases - works in Advance zone only: // 1) GuestType is Shared - // 2) GuestType is Isolated, but SourceNat service is disabled boolean createVlan = (startIP != null && endIP != null && zone.getNetworkType() == NetworkType.Advanced - && ((ntwkOff.getGuestType() == Network.GuestType.Shared) - || (ntwkOff.getGuestType() == GuestType.Isolated && - !areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)))); + && (ntwkOff.getGuestType() == Network.GuestType.Shared)); if (!createVlan) { // Only support advance shared network in IPv6, which means createVlan is a must