@@ -643,32 +643,39 @@ def _validate_subnet(self, context, s, cur_subnet=None):
643
643
"supported if enable_dhcp is True." )
644
644
raise exc .InvalidInput (error_message = error_message )
645
645
646
- if validators .is_attr_set (s .get ('gateway_ip' )):
647
- self ._validate_ip_version (ip_ver , s ['gateway_ip' ], 'gateway_ip' )
648
- if has_cidr :
649
- is_gateway_not_valid = (
650
- ipam .utils .check_gateway_invalid_in_subnet (
651
- s ['cidr' ], s ['gateway_ip' ]))
652
- if is_gateway_not_valid :
653
- error_message = _ ("Gateway is not valid on subnet" )
654
- raise exc .InvalidInput (error_message = error_message )
655
- # Ensure the gateway IP is not assigned to any port
656
- # skip this check in case of create (s parameter won't have id)
646
+ gateway_ip = s .get ('gateway_ip' , constants .ATTR_NOT_SPECIFIED )
647
+ if validators .is_attr_set (gateway_ip ) or gateway_ip is None :
648
+ # Validate the gateway IP, if defined in the request.
649
+ if s ['gateway_ip' ]:
650
+ self ._validate_ip_version (ip_ver , gateway_ip , 'gateway_ip' )
651
+ if has_cidr :
652
+ is_gateway_not_valid = (
653
+ ipam .utils .check_gateway_invalid_in_subnet (
654
+ s ['cidr' ], gateway_ip ))
655
+ if is_gateway_not_valid :
656
+ error_message = _ ("Gateway is not valid on subnet" )
657
+ raise exc .InvalidInput (error_message = error_message )
658
+
659
+ # Ensure the current subnet gateway IP is not assigned to any port.
660
+ # The subnet gateway IP cannot be modified or removed if in use
661
+ # (assigned to a router interface).
662
+ # Skip this check in case of create (s parameter won't have id).
657
663
# NOTE(salv-orlando): There is slight chance of a race, when
658
664
# a subnet-update and a router-interface-add operation are
659
665
# executed concurrently
660
- s_gateway_ip = netaddr .IPAddress (s ['gateway_ip' ])
666
+ s_gateway_ip = (netaddr .IPAddress (gateway_ip ) if gateway_ip else
667
+ None )
661
668
if (cur_subnet and
662
669
s_gateway_ip != cur_subnet ['gateway_ip' ] and
663
670
not ipv6_utils .is_ipv6_pd_enabled (s )):
664
- gateway_ip = str (cur_subnet ['gateway_ip' ])
671
+ current_gateway_ip = str (cur_subnet ['gateway_ip' ])
665
672
alloc = port_obj .IPAllocation .get_alloc_routerports (
666
- context , cur_subnet ['id' ], gateway_ip = gateway_ip ,
673
+ context , cur_subnet ['id' ], gateway_ip = current_gateway_ip ,
667
674
first = True )
668
675
669
676
if alloc and alloc .port_id :
670
677
raise exc .GatewayIpInUse (
671
- ip_address = gateway_ip ,
678
+ ip_address = current_gateway_ip ,
672
679
port_id = alloc .port_id )
673
680
674
681
if validators .is_attr_set (s .get ('dns_nameservers' )):
0 commit comments