Migrating subnet module from AnsibleModule to OpenStackModule

1. Created class SubnetModule with run method
2. Changed argument_spec from openstack_full_argument_spec to dict
3. Moved "netid != subnet['network_id']:" check inside "if network:" loop
4. Moved the methods using "module" inside SubnetModule class

Change-Id: I8f19359e70f8565ebfb096d30ab75e727f748be6
This commit is contained in:
anbanerj 2020-12-18 13:49:34 +01:00
parent d004e0af05
commit ea1f1df805

View File

@ -153,52 +153,74 @@ EXAMPLES = '''
ipv6_address_mode: dhcpv6-stateless ipv6_address_mode: dhcpv6-stateless
''' '''
from ansible.module_utils.basic import AnsibleModule from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import (openstack_full_argument_spec,
openstack_module_kwargs,
openstack_cloud_from_module)
def _can_update(subnet, module, cloud, filters=None): class SubnetModule(OpenStackModule):
ipv6_mode_choices = ['dhcpv6-stateful', 'dhcpv6-stateless', 'slaac']
argument_spec = dict(
name=dict(type='str', required=True),
network_name=dict(type='str'),
cidr=dict(type='str'),
ip_version=dict(type='str', default='4', choices=['4', '6']),
enable_dhcp=dict(type='bool', default=True),
gateway_ip=dict(type='str'),
no_gateway_ip=dict(type='bool', default=False),
dns_nameservers=dict(type='list', default=None, elements='str'),
allocation_pool_start=dict(type='str'),
allocation_pool_end=dict(type='str'),
host_routes=dict(type='list', default=None, elements='dict'),
ipv6_ra_mode=dict(type='str', choices=ipv6_mode_choices),
ipv6_address_mode=dict(type='str', choices=ipv6_mode_choices),
use_default_subnetpool=dict(type='bool', default=False),
extra_specs=dict(type='dict', default=dict()),
state=dict(type='str', default='present', choices=['absent', 'present']),
project=dict(type='str'),
)
module_kwargs = dict(
supports_check_mode=True,
required_together=[['allocation_pool_end', 'allocation_pool_start']]
)
def _can_update(self, subnet, filters=None):
"""Check for differences in non-updatable values""" """Check for differences in non-updatable values"""
network_name = module.params['network_name'] network_name = self.params['network_name']
ip_version = int(module.params['ip_version']) ip_version = int(self.params['ip_version'])
ipv6_ra_mode = module.params['ipv6_ra_mode'] ipv6_ra_mode = self.params['ipv6_ra_mode']
ipv6_a_mode = module.params['ipv6_address_mode'] ipv6_a_mode = self.params['ipv6_address_mode']
if network_name: if network_name:
network = cloud.get_network(network_name, filters) network = self.conn.get_network(network_name, filters)
if network: if network:
netid = network['id'] netid = network['id']
else:
module.fail_json(msg='No network found for %s' % network_name)
if netid != subnet['network_id']: if netid != subnet['network_id']:
module.fail_json(msg='Cannot update network_name in existing \ self.fail_json(msg='Cannot update network_name in existing subnet')
subnet') else:
self.fail_json(msg='No network found for %s' % network_name)
if ip_version and subnet['ip_version'] != ip_version: if ip_version and subnet['ip_version'] != ip_version:
module.fail_json(msg='Cannot update ip_version in existing subnet') self.fail_json(msg='Cannot update ip_version in existing subnet')
if ipv6_ra_mode and subnet.get('ipv6_ra_mode', None) != ipv6_ra_mode: if ipv6_ra_mode and subnet.get('ipv6_ra_mode', None) != ipv6_ra_mode:
module.fail_json(msg='Cannot update ipv6_ra_mode in existing subnet') self.fail_json(msg='Cannot update ipv6_ra_mode in existing subnet')
if ipv6_a_mode and subnet.get('ipv6_address_mode', None) != ipv6_a_mode: if ipv6_a_mode and subnet.get('ipv6_address_mode', None) != ipv6_a_mode:
module.fail_json(msg='Cannot update ipv6_address_mode in existing \ self.fail_json(msg='Cannot update ipv6_address_mode in existing subnet')
subnet')
def _needs_update(self, subnet, filters=None):
def _needs_update(subnet, module, cloud, filters=None):
"""Check for differences in the updatable values.""" """Check for differences in the updatable values."""
# First check if we are trying to update something we're not allowed to # First check if we are trying to update something we're not allowed to
_can_update(subnet, module, cloud, filters) self._can_update(subnet, filters)
# now check for the things we are allowed to update # now check for the things we are allowed to update
enable_dhcp = module.params['enable_dhcp'] enable_dhcp = self.params['enable_dhcp']
subnet_name = module.params['name'] subnet_name = self.params['name']
pool_start = module.params['allocation_pool_start'] pool_start = self.params['allocation_pool_start']
pool_end = module.params['allocation_pool_end'] pool_end = self.params['allocation_pool_end']
gateway_ip = module.params['gateway_ip'] gateway_ip = self.params['gateway_ip']
no_gateway_ip = module.params['no_gateway_ip'] no_gateway_ip = self.params['no_gateway_ip']
dns = module.params['dns_nameservers'] dns = self.params['dns_nameservers']
host_routes = module.params['host_routes'] host_routes = self.params['host_routes']
curr_pool = dict(start=pool_start, end=pool_end) curr_pool = dict(start=pool_start, end=pool_end)
if subnet['enable_dhcp'] != enable_dhcp: if subnet['enable_dhcp'] != enable_dhcp:
@ -222,76 +244,46 @@ def _needs_update(subnet, module, cloud, filters=None):
return True return True
return False return False
def _system_state_change(self, subnet, filters=None):
def _system_state_change(module, subnet, cloud, filters=None): state = self.params['state']
state = module.params['state']
if state == 'present': if state == 'present':
if not subnet: if not subnet:
return True return True
return _needs_update(subnet, module, cloud, filters) return self._needs_update(subnet, filters)
if state == 'absent' and subnet: if state == 'absent' and subnet:
return True return True
return False return False
def run(self):
def main(): state = self.params['state']
ipv6_mode_choices = ['dhcpv6-stateful', 'dhcpv6-stateless', 'slaac'] network_name = self.params['network_name']
argument_spec = openstack_full_argument_spec( cidr = self.params['cidr']
name=dict(type='str', required=True), ip_version = self.params['ip_version']
network_name=dict(type='str'), enable_dhcp = self.params['enable_dhcp']
cidr=dict(type='str'), subnet_name = self.params['name']
ip_version=dict(type='str', default='4', choices=['4', '6']), gateway_ip = self.params['gateway_ip']
enable_dhcp=dict(type='bool', default=True), no_gateway_ip = self.params['no_gateway_ip']
gateway_ip=dict(type='str'), dns = self.params['dns_nameservers']
no_gateway_ip=dict(type='bool', default=False), pool_start = self.params['allocation_pool_start']
dns_nameservers=dict(type='list', default=None, elements='str'), pool_end = self.params['allocation_pool_end']
allocation_pool_start=dict(type='str'), host_routes = self.params['host_routes']
allocation_pool_end=dict(type='str'), ipv6_ra_mode = self.params['ipv6_ra_mode']
host_routes=dict(type='list', default=None, elements='dict'), ipv6_a_mode = self.params['ipv6_address_mode']
ipv6_ra_mode=dict(type='str', choices=ipv6_mode_choices), use_default_subnetpool = self.params['use_default_subnetpool']
ipv6_address_mode=dict(type='str', choices=ipv6_mode_choices), project = self.params.pop('project')
use_default_subnetpool=dict(type='bool', default=False), extra_specs = self.params['extra_specs']
extra_specs=dict(type='dict', default=dict()),
state=dict(type='str', default='present', choices=['absent', 'present']),
project=dict(type='str'),
)
module_kwargs = openstack_module_kwargs()
module = AnsibleModule(argument_spec,
supports_check_mode=True,
required_together=[
['allocation_pool_end', 'allocation_pool_start'],
],
**module_kwargs)
state = module.params['state']
network_name = module.params['network_name']
cidr = module.params['cidr']
ip_version = module.params['ip_version']
enable_dhcp = module.params['enable_dhcp']
subnet_name = module.params['name']
gateway_ip = module.params['gateway_ip']
no_gateway_ip = module.params['no_gateway_ip']
dns = module.params['dns_nameservers']
pool_start = module.params['allocation_pool_start']
pool_end = module.params['allocation_pool_end']
host_routes = module.params['host_routes']
ipv6_ra_mode = module.params['ipv6_ra_mode']
ipv6_a_mode = module.params['ipv6_address_mode']
use_default_subnetpool = module.params['use_default_subnetpool']
project = module.params.pop('project')
extra_specs = module.params['extra_specs']
# Check for required parameters when state == 'present' # Check for required parameters when state == 'present'
if state == 'present': if state == 'present':
if not module.params['network_name']: if not self.params['network_name']:
module.fail_json(msg='network_name required with present state') self.fail(msg='network_name required with present state')
if ( if (
not module.params['cidr'] not self.params['cidr']
and not use_default_subnetpool and not use_default_subnetpool
and not extra_specs.get('subnetpool_id', False) and not extra_specs.get('subnetpool_id', False)
): ):
module.fail_json(msg='cidr or use_default_subnetpool or ' self.fail(msg='cidr or use_default_subnetpool or '
'subnetpool_id required with present state') 'subnetpool_id required with present state')
if pool_start and pool_end: if pool_start and pool_end:
@ -300,25 +292,22 @@ def main():
pool = None pool = None
if no_gateway_ip and gateway_ip: if no_gateway_ip and gateway_ip:
module.fail_json(msg='no_gateway_ip is not allowed with gateway_ip') self.fail_json(msg='no_gateway_ip is not allowed with gateway_ip')
sdk, cloud = openstack_cloud_from_module(module)
try:
if project is not None: if project is not None:
proj = cloud.get_project(project) proj = self.conn.get_project(project)
if proj is None: if proj is None:
module.fail_json(msg='Project %s could not be found' % project) self.fail_json(msg='Project %s could not be found' % project)
project_id = proj['id'] project_id = proj['id']
filters = {'tenant_id': project_id} filters = {'tenant_id': project_id}
else: else:
project_id = None project_id = None
filters = None filters = None
subnet = cloud.get_subnet(subnet_name, filters=filters) subnet = self.conn.get_subnet(subnet_name, filters=filters)
if module.check_mode: if self.ansible.check_mode:
module.exit_json(changed=_system_state_change(module, subnet, self.exit_json(changed=self._system_state_change(subnet, filters))
cloud, filters))
if state == 'present': if state == 'present':
if not subnet: if not subnet:
@ -342,11 +331,11 @@ def main():
if use_default_subnetpool: if use_default_subnetpool:
kwargs['use_default_subnetpool'] = use_default_subnetpool kwargs['use_default_subnetpool'] = use_default_subnetpool
kwargs = dict(kwargs, **extra_specs) kwargs = dict(kwargs, **extra_specs)
subnet = cloud.create_subnet(network_name, **kwargs) subnet = self.conn.create_subnet(network_name, **kwargs)
changed = True changed = True
else: else:
if _needs_update(subnet, module, cloud, filters): if self._needs_update(subnet, filters):
subnet = cloud.update_subnet(subnet['id'], subnet = self.conn.update_subnet(subnet['id'],
subnet_name=subnet_name, subnet_name=subnet_name,
enable_dhcp=enable_dhcp, enable_dhcp=enable_dhcp,
gateway_ip=gateway_ip, gateway_ip=gateway_ip,
@ -357,7 +346,7 @@ def main():
changed = True changed = True
else: else:
changed = False changed = False
module.exit_json(changed=changed, self.exit_json(changed=changed,
subnet=subnet, subnet=subnet,
id=subnet['id']) id=subnet['id'])
@ -366,11 +355,13 @@ def main():
changed = False changed = False
else: else:
changed = True changed = True
cloud.delete_subnet(subnet_name) self.conn.delete_subnet(subnet_name)
module.exit_json(changed=changed) self.exit_json(changed=changed)
except sdk.exceptions.OpenStackCloudException as e:
module.fail_json(msg=str(e)) def main():
module = SubnetModule()
module()
if __name__ == '__main__': if __name__ == '__main__':