diff --git a/cloud/openstack/os_router.py b/cloud/openstack/os_router.py index ed606f8ea38..4992d4d9640 100644 --- a/cloud/openstack/os_router.py +++ b/cloud/openstack/os_router.py @@ -19,6 +19,8 @@ try: except ImportError: HAS_SHADE = False +from distutils.version import StrictVersion + DOCUMENTATION = ''' --- @@ -58,6 +60,13 @@ options: type: string required: false default: None + project: + description: + - Unique name or ID of the project. + type: string + required: false + default: None + version_added: "2.2" external_fixed_ips: description: - The IP address parameters for the external gateway network. Each @@ -81,6 +90,13 @@ EXAMPLES = ''' state: present name: simple_router +# Create a simple router, not attached to a gateway or subnets for a given project. +- os_router: + cloud: mycloud + state: present + name: simple_router + project: myproj + # Creates a router attached to ext_network1 on an IPv4 subnet and one # internal subnet interface. - os_router: @@ -209,6 +225,7 @@ def _needs_update(cloud, module, router, network, internal_subnet_ids): return False + def _system_state_change(cloud, module, router, network, internal_ids): """Check if the system state would be changed.""" state = module.params['state'] @@ -220,6 +237,7 @@ def _system_state_change(cloud, module, router, network, internal_ids): return _needs_update(cloud, module, router, network, internal_ids) return False + def _build_kwargs(cloud, module, router, network): kwargs = { 'admin_state_up': module.params['admin_state_up'], @@ -246,6 +264,7 @@ def _build_kwargs(cloud, module, router, network): return kwargs + def _validate_subnets(module, cloud): external_subnet_ids = [] internal_subnet_ids = [] @@ -263,7 +282,8 @@ def _validate_subnets(module, cloud): module.fail_json(msg='subnet %s not found' % iface) internal_subnet_ids.append(subnet['id']) - return (external_subnet_ids, internal_subnet_ids) + return external_subnet_ids, internal_subnet_ids + def main(): argument_spec = openstack_full_argument_spec( @@ -274,6 +294,7 @@ def main(): network=dict(default=None), interfaces=dict(type='list', default=None), external_fixed_ips=dict(type='list', default=None), + project=dict(default=None) ) module_kwargs = openstack_module_kwargs() @@ -284,17 +305,32 @@ def main(): if not HAS_SHADE: module.fail_json(msg='shade is required for this module') + if (module.params['project'] and + StrictVersion(shade.__version__) <= StrictVersion('1.9.0')): + module.fail_json(msg="To utilize project, the installed version of" + "the shade library MUST be > 1.9.0") + state = module.params['state'] name = module.params['name'] network = module.params['network'] + project = module.params['project'] if module.params['external_fixed_ips'] and not network: module.fail_json(msg='network is required when supplying external_fixed_ips') try: cloud = shade.openstack_cloud(**module.params) - router = cloud.get_router(name) - + if project is not None: + proj = cloud.get_project(project) + if proj is None: + module.fail_json(msg='Project %s could not be found' % project) + project_id = proj['id'] + filters = {'tenant_id': project_id} + else: + project_id = None + filters = None + + router = cloud.get_router(name, filters=filters) net = None if network: net = cloud.get_network(network) @@ -315,6 +351,8 @@ def main(): if not router: kwargs = _build_kwargs(cloud, module, router, net) + if project_id: + kwargs['project_id'] = project_id router = cloud.create_router(**kwargs) for internal_subnet_id in internal_ids: cloud.add_router_interface(router, subnet_id=internal_subnet_id) @@ -346,9 +384,10 @@ def main(): # We need to detach all internal interfaces on a router before # we will be allowed to delete it. ports = cloud.list_router_interfaces(router, 'internal') + router_id = router['id'] for port in ports: cloud.remove_router_interface(router, port_id=port['id']) - cloud.delete_router(name) + cloud.delete_router(router_id) module.exit_json(changed=True) except shade.OpenStackCloudException as e: