@@ -2278,7 +2278,7 @@ public Vlan createVlanAndPublicIpRange(CreateVlanIpRangeCmd cmd) throws Insuffic
22782278 @ DB
22792279 public Vlan createVlanAndPublicIpRange (long zoneId , long networkId , long physicalNetworkId , boolean forVirtualNetwork , Long podId ,
22802280 String startIP , String endIP , String vlanGateway , String vlanNetmask ,
2281- String vlanId , Account vlanOwner , String startIPv6 , String endIPv6 , String vlanGatewayv6 , String vlanCidrv6 ) {
2281+ String vlanId , Account vlanOwner , String startIPv6 , String endIPv6 , String vlanIp6Gateway , String vlanIp6Cidr ) {
22822282 Network network = _networkModel .getNetwork (networkId );
22832283
22842284 boolean ipv4 = false , ipv6 = false ;
@@ -2372,15 +2372,14 @@ public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physica
23722372 }
23732373
23742374 if (ipv6 ) {
2375- if (!NetUtils .isValidIpv6 (vlanGatewayv6 )) {
2375+ if (!NetUtils .isValidIpv6 (vlanIp6Gateway )) {
23762376 throw new InvalidParameterValueException ("Please specify a valid IPv6 gateway" );
23772377 }
2378- if (!NetUtils .isValidIp6Cidr (vlanCidrv6 )) {
2378+ if (!NetUtils .isValidIp6Cidr (vlanIp6Cidr )) {
23792379 throw new InvalidParameterValueException ("Please specify a valid IPv6 CIDR" );
23802380 }
23812381 }
23822382
2383- // TODO skip all vlan check for ipv6 now
23842383 if (ipv4 ) {
23852384 String newVlanSubnet = NetUtils .getSubNet (vlanGateway , vlanNetmask );
23862385
@@ -2426,7 +2425,7 @@ public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physica
24262425 List <VlanVO > vlans = _vlanDao .listByZone (zone .getId ());
24272426 for (VlanVO vlan : vlans ) {
24282427 String otherVlanGateway = vlan .getVlanGateway ();
2429- // Continue if it's IPv6
2428+ // Continue if it's not IPv4
24302429 if (otherVlanGateway == null ) {
24312430 continue ;
24322431 }
@@ -2462,6 +2461,32 @@ public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physica
24622461 }
24632462 }
24642463 }
2464+
2465+ String ipv6Range = null ;
2466+ if (ipv6 ) {
2467+ ipv6Range = startIPv6 ;
2468+ if (endIPv6 != null ) {
2469+ ipv6Range += "-" + endIPv6 ;
2470+ }
2471+
2472+ List <VlanVO > vlans = _vlanDao .listByZone (zone .getId ());
2473+ for (VlanVO vlan : vlans ) {
2474+ if (vlan .getIp6Gateway () == null ) {
2475+ continue ;
2476+ }
2477+ if (vlanId .equals (vlan .getVlanTag ())) {
2478+ if (NetUtils .isIp6RangeOverlap (ipv6Range , vlan .getIp6Range ())) {
2479+ throw new InvalidParameterValueException ("The IPv6 range with tag: " + vlan .getVlanTag ()
2480+ + " already has IPs that overlap with the new range. Please specify a different start IP/end IP." );
2481+ }
2482+
2483+ if (!vlanIp6Gateway .equals (vlan .getIp6Gateway ())) {
2484+ throw new InvalidParameterValueException ("The IP range with tag: " + vlan .getVlanTag () + " has already been added with gateway " + vlan .getIp6Gateway ()
2485+ + ". Please specify a different tag." );
2486+ }
2487+ }
2488+ }
2489+ }
24652490
24662491 // Check if a guest VLAN is using the same tag
24672492 if (_zoneDao .findVnet (zoneId , physicalNetworkId , vlanId ).size () > 0 ) {
@@ -2491,19 +2516,11 @@ public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physica
24912516 }
24922517 }
24932518
2494- String ipv6Range = null ;
2495- if (ipv6 ) {
2496- ipv6Range = startIPv6 ;
2497- if (endIPv6 != null ) {
2498- ipv6Range += "-" + endIPv6 ;
2499- }
2500- }
2501-
25022519 // Everything was fine, so persist the VLAN
25032520 Transaction txn = Transaction .currentTxn ();
25042521 txn .start ();
25052522
2506- VlanVO vlan = new VlanVO (vlanType , vlanId , vlanGateway , vlanNetmask , zone .getId (), ipRange , networkId , physicalNetworkId , vlanGatewayv6 , vlanCidrv6 , ipv6Range );
2523+ VlanVO vlan = new VlanVO (vlanType , vlanId , vlanGateway , vlanNetmask , zone .getId (), ipRange , networkId , physicalNetworkId , vlanIp6Gateway , vlanIp6Cidr , ipv6Range );
25072524 s_logger .debug ("Saving vlan range " + vlan );
25082525 vlan = _vlanDao .persist (vlan );
25092526
0 commit comments