1b38b7c500
With "extends_documentation_fragment: ['openstack.cloud.openstack']" it is not necessary to list required Python libraries in section 'requirements' of DOCUMENTATION docstring in modules. Ansible will merge requirements from doc fragments and DOCUMENTATION docstring which previously resulted in duplicates such as in server module [0]: * openstacksdk * openstacksdk >= 0.36, < 0.99.0 * python >= 3.6 When removing the 'requirements' section from server module, then Ansible will list openstacksdk once only: * openstacksdk >= 0.36, < 0.99.0 * python >= 3.6 To see what documentation Ansible will produce for server module run: ansible-doc --type module openstack.cloud.server [0] https://docs.ansible.com/ansible/latest/collections/openstack/\ cloud/server_module.html Change-Id: I727ed95ee480bb644b5a533f6a9526973677064c
187 lines
5.6 KiB
Python
187 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()
|