modular-service-cli/modular_service_cli/group/policy.py (86 lines of code) (raw):
import json
import click
from modular_service_cli.group import (
ContextObj,
ViewCommand,
build_limit_option,
build_next_token_option,
cli_response,
)
from modular_service_cli.service.api_client import ApiResponse
attributes_order = ('name', 'permissions')
@click.group(name='policy')
def policy():
"""Manages Policy Entity"""
@policy.command(cls=ViewCommand, name='describe')
@click.option('--name', '-n', type=str,
help='Policy name to describe.')
@build_limit_option()
@build_next_token_option()
@cli_response(attributes_order=attributes_order)
def describe(ctx: ContextObj, name, limit, next_token, customer_id):
"""
Describes policies.
"""
if name:
return ctx.api_client.get_policy(name, customer_id=customer_id)
return ctx.api_client.query_policies(
limit=limit,
next_token=next_token,
customer_id=customer_id
)
@policy.command(cls=ViewCommand, name='add')
@click.option('--name', '-n', type=str, required=True,
help='Policy name to create')
@click.option('--permission', '-p', multiple=True,
required=False,
help='List of permissions to attach to the policy')
@click.option('--permissions_admin', '-padm', is_flag=True, required=False,
help='Adds all admin permissions')
@click.option('--path_to_permissions', '-path', required=False,
help='Path to .json file that contains list of permissions to '
'attach to the policy')
@cli_response(attributes_order=attributes_order)
def add(ctx: ContextObj, name, permission, permissions_admin,
path_to_permissions, customer_id):
"""
Creates policy.
"""
permissions = list(permission)
if path_to_permissions:
try:
with open(path_to_permissions, 'r') as fp:
data = json.load(fp)
except FileNotFoundError:
return ApiResponse.build(f'File {path_to_permissions} not found')
except json.JSONDecodeError:
return ApiResponse.build(f'File {path_to_permissions} contains invalid JSON')
except Exception:
return ApiResponse.build(f'Could not load file {path_to_permissions}')
if not isinstance(data, list) and not all([isinstance(i, str) for i in data]):
return ApiResponse.build('File should contain list of strings')
permissions.extend(data)
return ctx.api_client.create_policy(
name=name,
permissions=permissions,
permissions_admin=permissions_admin,
customer_id=customer_id
)
@policy.command(cls=ViewCommand, name='update')
@click.option('--name', '-n', type=str, required=True)
@click.option('--attach_permission', '-a', multiple=True,
required=False,
help='Names of permissions to attach to the policy')
@click.option('--detach_permission', '-d', multiple=True,
required=False,
help='Names of permissions to detach from the policy')
@cli_response(attributes_order=attributes_order)
def update(ctx: ContextObj, name, attach_permission,
detach_permission, customer_id):
"""
Updates list of permissions attached to the policy.
"""
if not attach_permission and not detach_permission:
return ApiResponse.build('Provide either --attach_permission or --detach_permission')
return ctx.api_client.patch_policy(
name=name,
permissions_to_attach=attach_permission,
permissions_to_detach=detach_permission,
customer_id=customer_id
)
@policy.command(cls=ViewCommand, name='delete')
@click.option('--name', '-n', type=str, required=True,
help='Policy name to delete')
@cli_response()
def delete(ctx: ContextObj, name, customer_id):
"""
Deletes policy.
"""
return ctx.api_client.delete_policy(name, customer_id=customer_id)