188 lines
5.6 KiB
Python
188 lines
5.6 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright: Ansible Project
|
|
# (c) 2021, Ashraf Hasson <ahasson@redhat.com>
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
DOCUMENTATION = r'''
|
|
---
|
|
module: neutron_rbac_policies_info
|
|
short_description: Fetch Neutron RBAC policies.
|
|
author: OpenStack Ansible SIG
|
|
description:
|
|
- Fetch RBAC policies against a network, security group or a QoS Policy for
|
|
one or more projects.
|
|
options:
|
|
action:
|
|
description:
|
|
- Action for the RBAC policy.
|
|
- Can be either of the following options C(access_as_shared) or
|
|
C(access_as_external).
|
|
- Logically AND'ed with other filters.
|
|
choices: ['access_as_shared', 'access_as_external']
|
|
type: str
|
|
object_id:
|
|
description:
|
|
- The object ID (the subject of the policy) to which the RBAC rules
|
|
applies.
|
|
- This is an ID of a network, security group or a qos policy.
|
|
- Mutually exclusive with the C(object_type).
|
|
type: str
|
|
object_type:
|
|
description:
|
|
- Type of the object that this RBAC policy affects.
|
|
- Can be one of the following object types C(network), C(security_group)
|
|
or C(qos_policy).
|
|
- Mutually exclusive with the C(object_id).
|
|
choices: ['network', 'security_group', 'qos_policy']
|
|
type: str
|
|
policy_id:
|
|
description:
|
|
- The RBAC policy ID.
|
|
- If C(policy_id) is not provided, all available policies will be
|
|
fetched.
|
|
- If C(policy_id) provided, all other filters are ignored.
|
|
type: str
|
|
project:
|
|
description:
|
|
- ID or name of the project to which C(object_id) belongs to.
|
|
- Filters the RBAC rules based on the project name.
|
|
- Logically AND'ed with other filters.
|
|
type: str
|
|
aliases: ['project_id']
|
|
target_project_id:
|
|
description:
|
|
- The ID of the project this RBAC will be enforced.
|
|
- Filters the RBAC rules based on the target project id.
|
|
- Logically AND'ed with other filters.
|
|
type: str
|
|
|
|
extends_documentation_fragment:
|
|
- openstack.cloud.openstack
|
|
'''
|
|
|
|
EXAMPLES = r'''
|
|
- name: Get all rbac policies for a project
|
|
openstack.cloud.neutron_rbac_policies_info:
|
|
project: one_project
|
|
'''
|
|
|
|
RETURN = r'''
|
|
rbac_policies:
|
|
description: List of Neutron RBAC policies.
|
|
type: list
|
|
elements: dict
|
|
returned: always
|
|
contains:
|
|
action:
|
|
description:
|
|
- The access model specified by the RBAC rules
|
|
type: str
|
|
sample: "access_as_shared"
|
|
id:
|
|
description:
|
|
- The ID of the RBAC rule/policy
|
|
type: str
|
|
sample: "4154ce0c-71a7-4d87-a905-09762098ddb9"
|
|
name:
|
|
description:
|
|
- The name of the RBAC rule; usually null
|
|
type: str
|
|
sample: null
|
|
object_id:
|
|
description:
|
|
- The UUID of the object to which the RBAC rules apply
|
|
type: str
|
|
sample: "7422172b-2961-475c-ac68-bd0f2a9960ad"
|
|
object_type:
|
|
description:
|
|
- The object type to which the RBACs apply
|
|
type: str
|
|
sample: "network"
|
|
project_id:
|
|
description:
|
|
- The UUID of the project to which access is granted
|
|
type: str
|
|
sample: "84b8774d595b41e89f3dfaa1fd76932c"
|
|
target_project_id:
|
|
description:
|
|
- The UUID of the target project
|
|
type: str
|
|
sample: "c201a689c016435c8037977166f77368"
|
|
tenant_id:
|
|
description:
|
|
- The UUID of the project to which access is granted. Deprecated.
|
|
type: str
|
|
sample: "84b8774d595b41e89f3dfaa1fd76932c"
|
|
policies:
|
|
description: Same as C(rbac_policies), kept for backward compatibility.
|
|
returned: always
|
|
type: list
|
|
elements: dict
|
|
'''
|
|
|
|
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
|
|
|
|
|
|
class NeutronRBACPoliciesInfo(OpenStackModule):
|
|
argument_spec = dict(
|
|
action=dict(choices=['access_as_external', 'access_as_shared']),
|
|
object_id=dict(),
|
|
object_type=dict(choices=['security_group', 'qos_policy', 'network']),
|
|
policy_id=dict(),
|
|
project=dict(aliases=['project_id']),
|
|
target_project_id=dict(),
|
|
)
|
|
|
|
module_kwargs = dict(
|
|
mutually_exclusive=[
|
|
('object_id', 'object_type'),
|
|
],
|
|
supports_check_mode=True,
|
|
)
|
|
|
|
def run(self):
|
|
project_name_or_id = self.params['project']
|
|
project = None
|
|
if project_name_or_id is not None:
|
|
project = self.conn.identity.find_project(project_name_or_id)
|
|
if not project:
|
|
self.exit_json(changed=False, rbac_policies=[], policies=[])
|
|
|
|
policy_id = self.params['policy_id']
|
|
if policy_id:
|
|
policy = self.conn.network.find_rbac_policy(policy_id)
|
|
policies = [policy] if policy else []
|
|
else:
|
|
kwargs = dict((k, self.params[k])
|
|
for k in ['action', 'object_type']
|
|
if self.params[k] is not None)
|
|
|
|
if project:
|
|
kwargs['project_id'] = project.id
|
|
|
|
policies = list(self.conn.network.rbac_policies(**kwargs))
|
|
|
|
for k in ['object_id', 'target_project_id']:
|
|
if self.params[k] is not None:
|
|
policies = [p for p in policies if p[k] == self.params[k]]
|
|
|
|
if project:
|
|
policies = [p for p in policies
|
|
if p['location']['project']['id'] == project.id]
|
|
|
|
policies = [p.to_dict(computed=False) for p in policies]
|
|
self.exit_json(changed=False,
|
|
rbac_policies=policies,
|
|
policies=policies)
|
|
|
|
|
|
def main():
|
|
module = NeutronRBACPoliciesInfo()
|
|
module()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|