Skip to content

Commit

Permalink
Added support for listing, creating and deleting organization secrets
Browse files Browse the repository at this point in the history
  • Loading branch information
juanpardo committed Sep 20, 2023
1 parent a850675 commit 6834aaf
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ Changes for croud
Unreleased
==========

- Added support for listing, deleting and creating organization secrets.

1.7.0 - 2023/09/11
==================

Expand Down
59 changes: 59 additions & 0 deletions croud/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@
org_files_delete,
org_files_get,
org_files_list,
org_secrets_create,
org_secrets_delete,
org_secrets_list,
organizations_create,
organizations_delete,
organizations_edit,
Expand Down Expand Up @@ -1011,6 +1014,62 @@
},
},
},
"secrets": {
"help": "Manage organization's secrets.",
"commands" : {
"list": {
"help": "Lists all the secrets that belong to an organization.",
"extra_args": [
Argument(
"--org-id", type=str, required=True,
help="The organization ID to use.",
),
],
"resolver": org_secrets_list,
},
"create": {
"help": "Creates a new secret for the given organization.",
"extra_args": [
Argument(
"--org-id", type=str, required=True,
help="The organization ID to use.",
),
Argument(
"--name", type=str, required=True,
help="The name the Secret will be known as.",
),
Argument(
"--type", type=str, required=True, choices=["AWS"],
help="The type of Secret. Currently only AWS type is "
"supported.",
),
Argument(
"--access-key", type=str, required=True,
help="For an AWS type secret, the access key ID.",
),
Argument(
"--secret-key", type=str, required=True,
help="For an AWS type secret, the secret key.",
),
],
"resolver": org_secrets_create,
},
"delete": {
"help": "Lists all the secrets that belong to an organization.",
"extra_args": [
Argument(
"--org-id", type=str, required=True,
help="The organization ID to use.",
),
Argument(
"--secret-id", type=str, required=True,
help="The secret ID to use.",
),
],
"resolver": org_secrets_delete,
},
}
},
"files": {
"help": "Manage organization's files.",
"commands": {
Expand Down
47 changes: 47 additions & 0 deletions croud/organizations/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,53 @@ def op_upload_file_to_org(
return data, errors


def org_secrets_create(args: Namespace) -> None:
client = Client.from_args(args)
payload = {
"name": args.name,
"type": args.type,
"data": {
"access_key": args.access_key,
"secret_key": args.secret_key,
},
}
data, errors = client.post(
f"/api/v2/organizations/{args.org_id}/secrets/", body=payload
)
print_response(
data=data,
errors=errors,
keys=["id", "type", "name", "description"],
success_message="Secret created.",
output_fmt=get_output_format(args),
)


def org_secrets_list(args: Namespace) -> None:
client = Client.from_args(args)
data, errors = client.get(f"/api/v2/organizations/{args.org_id}/secrets/")
print_response(
data=data,
errors=errors,
keys=["id", "type", "name", "description"],
output_fmt=get_output_format(args),
)


def org_secrets_delete(args: Namespace) -> None:
client = Client.from_args(args)
data, errors = client.delete(
f"/api/v2/organizations/{args.org_id}/secrets/{args.secret_id}/"
)
print_response(
data=data,
errors=errors,
keys=["id", "type", "name", "description"],
success_message="Secret deleted.",
output_fmt=get_output_format(args),
)


def org_files_create(args: Namespace) -> None:
client = Client.from_args(args)

Expand Down
67 changes: 67 additions & 0 deletions tests/commands/test_organizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -450,3 +450,70 @@ def test_organizations_files_create(mock_request, mock_isfile):
f"/api/v2/organizations/{org_id}/files/",
body={"name": file_name},
)


@mock.patch.object(Client, "request", return_value=({}, None))
def test_organizations_secrets_list(mock_request):
org_id = gen_uuid()

call_command("croud", "organizations", "secrets", "list", "--org-id", org_id)
assert_rest(
mock_request, RequestMethod.GET, f"/api/v2/organizations/{org_id}/secrets/"
)


@mock.patch.object(Client, "request", return_value=({}, None))
def test_organizations_secrets_create(mock_request):
org_id = gen_uuid()
name = "my_secret"
secret_type = "AWS"
access_key = "my_access_key"
secret_key = "my_secret_key"

call_command(
"croud",
"organizations",
"secrets",
"create",
"--org-id",
org_id,
"--name",
name,
"--type",
secret_type,
"--access-key",
access_key,
"--secret-key",
secret_key,
)
assert_rest(
mock_request,
RequestMethod.POST,
f"/api/v2/organizations/{org_id}/secrets/",
body={
"name": name,
"type": secret_type,
"data": {"access_key": access_key, "secret_key": secret_key},
},
)


@mock.patch.object(Client, "request", return_value=({}, None))
def test_organizations_secrets_delete(mock_request):
org_id = gen_uuid()

call_command(
"croud",
"organizations",
"secrets",
"delete",
"--org-id",
org_id,
"--secret-id",
"my_secret_id",
)
assert_rest(
mock_request,
RequestMethod.DELETE,
f"/api/v2/organizations/{org_id}/secrets/my_secret_id/",
)

0 comments on commit 6834aaf

Please sign in to comment.