From ce421fe3702b2cd411aa9d471e2675cb5ff098ae Mon Sep 17 00:00:00 2001 From: Jakob Meng Date: Mon, 21 Sep 2020 14:31:35 +0200 Subject: [PATCH] Only apply necessary changes to subnets Previously, all subnet properties were updated if any value did not match. But this behaviour caused errors like e.g. "Current gateway ip 192.168.0.1 already in use by port [ID]. Unable to update." even if that gateway was not about to be changed. Task: 40927 Story: 2008172 Change-Id: I049b0dade4c7ea3e1ef24777ae558f650caa136c --- ci/roles/subnet/tasks/subnet-allocation.yml | 1 + plugins/modules/subnet.py | 40 ++++++++++----------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/ci/roles/subnet/tasks/subnet-allocation.yml b/ci/roles/subnet/tasks/subnet-allocation.yml index 56a60da5..74185620 100644 --- a/ci/roles/subnet/tasks/subnet-allocation.yml +++ b/ci/roles/subnet/tasks/subnet-allocation.yml @@ -37,6 +37,7 @@ name: "{{ subnet_name }}" state: present cidr: 192.168.0.0/24 + gateway_ip: 192.168.0.1 allocation_pool_start: 192.168.0.2 allocation_pool_end: 192.168.0.8 diff --git a/plugins/modules/subnet.py b/plugins/modules/subnet.py index 84861877..98b735ba 100644 --- a/plugins/modules/subnet.py +++ b/plugins/modules/subnet.py @@ -221,35 +221,37 @@ class SubnetModule(OpenStackModule): no_gateway_ip = self.params['no_gateway_ip'] dns = self.params['dns_nameservers'] host_routes = self.params['host_routes'] - curr_pool = dict(start=pool_start, end=pool_end) + if pool_start and pool_end: + pool = dict(start=pool_start, end=pool_end) + else: + pool = None + changes = dict() if subnet['enable_dhcp'] != enable_dhcp: - return True + changes['enable_dhcp'] = enable_dhcp if subnet_name and subnet['name'] != subnet_name: - return True - if not subnet['allocation_pools'] and pool_start and pool_end: - return True - if subnet['allocation_pools'] != [curr_pool]: - return True + changes['subnet_name'] = subnet_name + if pool and (not subnet['allocation_pools'] or subnet['allocation_pools'] != [pool]): + changes['allocation_pools'] = [pool] if gateway_ip and subnet['gateway_ip'] != gateway_ip: - return True + changes['gateway_ip'] = gateway_ip if dns and sorted(subnet['dns_nameservers']) != sorted(dns): - return True + changes['dns_nameservers'] = dns if host_routes: curr_hr = sorted(subnet['host_routes'], key=lambda t: t.keys()) new_hr = sorted(host_routes, key=lambda t: t.keys()) if curr_hr != new_hr: - return True + changes['host_routes'] = host_routes if no_gateway_ip and subnet['gateway_ip']: - return True - return False + changes['disable_gateway_ip'] = no_gateway_ip + return changes def _system_state_change(self, subnet, filters=None): state = self.params['state'] if state == 'present': if not subnet: return True - return self._needs_update(subnet, filters) + return bool(self._needs_update(subnet, filters)) if state == 'absent' and subnet: return True return False @@ -334,15 +336,9 @@ class SubnetModule(OpenStackModule): subnet = self.conn.create_subnet(network_name, **kwargs) changed = True else: - if self._needs_update(subnet, filters): - subnet = self.conn.update_subnet(subnet['id'], - subnet_name=subnet_name, - enable_dhcp=enable_dhcp, - gateway_ip=gateway_ip, - disable_gateway_ip=no_gateway_ip, - dns_nameservers=dns, - allocation_pools=pool, - host_routes=host_routes) + changes = self._needs_update(subnet, filters) + if changes: + subnet = self.conn.update_subnet(subnet['id'], **changes) changed = True else: changed = False