|
@@ -0,0 +1,116 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+''' os_subports_deletion '''
|
|
|
+import keystoneauth1
|
|
|
+
|
|
|
+from ansible.module_utils.basic import AnsibleModule
|
|
|
+
|
|
|
+try:
|
|
|
+ import shade
|
|
|
+ HAS_SHADE = True
|
|
|
+except ImportError:
|
|
|
+ HAS_SHADE = False
|
|
|
+
|
|
|
+DOCUMENTATION = '''
|
|
|
+---
|
|
|
+module: os_subports_deletion
|
|
|
+short_description: Delete subports belonging to a trunk
|
|
|
+description:
|
|
|
+ - Detach and deletes all the Neutron Subports belonging to a trunk
|
|
|
+author:
|
|
|
+ - "Luis Tomas Bolivar <ltomasbo@redhat.com>"
|
|
|
+'''
|
|
|
+
|
|
|
+RETURN = '''
|
|
|
+'''
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ ''' Main module function '''
|
|
|
+ module = AnsibleModule(
|
|
|
+ argument_spec=dict(
|
|
|
+ trunk_name=dict(default=False, type='str'),
|
|
|
+ ),
|
|
|
+ supports_check_mode=True,
|
|
|
+ )
|
|
|
+
|
|
|
+ if not HAS_SHADE:
|
|
|
+ module.fail_json(msg='shade is required for this module')
|
|
|
+
|
|
|
+ try:
|
|
|
+ cloud = shade.openstack_cloud()
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ module.fail_json(msg='Failed to connect to the cloud')
|
|
|
+
|
|
|
+ try:
|
|
|
+ adapter = keystoneauth1.adapter.Adapter(
|
|
|
+ session=cloud.keystone_session,
|
|
|
+ service_type=cloud.cloud_config.get_service_type('network'),
|
|
|
+ interface=cloud.cloud_config.get_interface('network'),
|
|
|
+ endpoint_override=cloud.cloud_config.get_endpoint('network'),
|
|
|
+ version=cloud.cloud_config.get_api_version('network'))
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ module.fail_json(msg='Failed to get an adapter to talk to the Neutron '
|
|
|
+ 'API')
|
|
|
+
|
|
|
+ try:
|
|
|
+ trunk_response = adapter.get('/trunks')
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ module.fail_json(msg='Failed to retrieve Neutron trunk information')
|
|
|
+
|
|
|
+ subports = []
|
|
|
+ for trunk in trunk_response.json()['trunks']:
|
|
|
+ if trunk['name'] == module.params['trunk_name']:
|
|
|
+ trunk_id = trunk['id']
|
|
|
+ for subport in trunk['sub_ports']:
|
|
|
+ subports.append(subport['port_id'])
|
|
|
+
|
|
|
+ data = _get_data(subports)
|
|
|
+ try:
|
|
|
+ adapter.put('/trunks/' + trunk_id + '/remove_subports',
|
|
|
+ **data)
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ module.fail_json(msg='Failed to detach subports')
|
|
|
+
|
|
|
+ try:
|
|
|
+ for port in subports:
|
|
|
+ adapter.delete('/ports/' + port)
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ module.fail_json(msg='Failed to delete Neutron subports')
|
|
|
+
|
|
|
+ module.exit_json(
|
|
|
+ changed=True)
|
|
|
+
|
|
|
+
|
|
|
+def _get_data(subports):
|
|
|
+ ports_list = [{"port_id": port_id.encode('ascii')} for port_id in subports]
|
|
|
+ sub_ports = str({"sub_ports": ports_list}).replace('\'', '\"')
|
|
|
+ return {'data': sub_ports}
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|