From 3bafa3971675ba92ddeb8735bea92bab210468d1 Mon Sep 17 00:00:00 2001 From: Juan Pardo Date: Wed, 20 Sep 2023 16:44:57 +0200 Subject: [PATCH 1/4] Added support for listing, creating and deleting organization secrets --- CHANGES.rst | 2 + croud/__main__.py | 59 ++++++++++++++++++++++++ croud/organizations/commands.py | 47 +++++++++++++++++++ tests/commands/test_organizations.py | 67 ++++++++++++++++++++++++++++ 4 files changed, 175 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1e5b56bd..3ce1b7b1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,8 @@ Changes for croud Unreleased ========== +- Added support for listing, deleting and creating organization secrets. + 1.7.0 - 2023/09/11 ================== diff --git a/croud/__main__.py b/croud/__main__.py index 43bd9470..59898be7 100644 --- a/croud/__main__.py +++ b/croud/__main__.py @@ -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, @@ -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": { diff --git a/croud/organizations/commands.py b/croud/organizations/commands.py index 9ca404bd..202b5034 100644 --- a/croud/organizations/commands.py +++ b/croud/organizations/commands.py @@ -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) diff --git a/tests/commands/test_organizations.py b/tests/commands/test_organizations.py index 84c0ba96..540ec701 100644 --- a/tests/commands/test_organizations.py +++ b/tests/commands/test_organizations.py @@ -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/", + ) From d6ceb7c69207caf00112ce9eb94a6323c3b8e8e1 Mon Sep 17 00:00:00 2001 From: Juan Pardo Date: Tue, 26 Sep 2023 11:01:35 +0200 Subject: [PATCH 2/4] fixup! Added support for listing, creating and deleting organization secrets --- croud/__main__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/croud/__main__.py b/croud/__main__.py index 59898be7..5ad66512 100644 --- a/croud/__main__.py +++ b/croud/__main__.py @@ -1036,7 +1036,7 @@ ), Argument( "--name", type=str, required=True, - help="The name the Secret will be known as.", + help="The name the secret will be known as.", ), Argument( "--type", type=str, required=True, choices=["AWS"], @@ -1055,7 +1055,8 @@ "resolver": org_secrets_create, }, "delete": { - "help": "Lists all the secrets that belong to an organization.", + "help": "Deletes the secret that matches the given ID for the " + "organization specified.", "extra_args": [ Argument( "--org-id", type=str, required=True, From 18ca49a0dcb3d1ed6f861c890cb81e815f857832 Mon Sep 17 00:00:00 2001 From: Juan Pardo Date: Tue, 26 Sep 2023 11:22:30 +0200 Subject: [PATCH 3/4] fixup! fixup! Added support for listing, creating and deleting organization secrets --- docs/commands/organizations.rst | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/docs/commands/organizations.rst b/docs/commands/organizations.rst index 35508bbc..22d867a6 100644 --- a/docs/commands/organizations.rst +++ b/docs/commands/organizations.rst @@ -313,3 +313,80 @@ Example | 327ad0e6-607f-4f99-a4cc-c1e98bf28e4d | nyc_taxi | UPLOADED | 107.56 MiB | https://cratedb-file-uploads.s3.amazonaws.com/some/download | +--------------------------------------+----------+----------+-------------+-------------------------------------------------------------+ + + +``organizations secrets`` +========================= + +.. argparse:: + :module: croud.__main__ + :func: get_parser + :prog: croud + :path: organizations secrets + :nosubcommands: + + +``organizations secrets list`` +------------------------------ + +.. argparse:: + :module: croud.__main__ + :func: get_parser + :prog: croud + :path: organizations secrets list + +Example +....... + +.. code-block:: console + + sh$ croud organizations secrets list \ + --org-id f6c39580-5719-431d-a508-0cee4f9e8209 + +--------------------------------------+--------+----------+------------------+ + | id | type | name | description | + |--------------------------------------+--------+----------+------------------| + | e9068b31-14f5-4629-b585-70b3b8ae73bf | AWS | mysecret | **********esskey | + +--------------------------------------+--------+----------+------------------+ + + +``organizations secrets delete`` +-------------------------------- + +.. argparse:: + :module: croud.__main__ + :func: get_parser + :prog: croud + :path: organizations secrets delete + +Example +....... + +.. code-block:: console + + sh$ croud organizations secrets delete \ + --org-id f6c39580-5719-431d-a508-0cee4f9e8209 \ + --secret-id e9068b31-14f5-4629-b585-70b3b8ae73bf + ==> Success: Secret deleted. + + +``organizations secrets create`` +-------------------------------- + +.. argparse:: + :module: croud.__main__ + :func: get_parser + :prog: croud + :path: organizations secrets create + +Example +....... + +.. code-block:: console + + sh$ croud organizations secrests create \ + --org-id f6c39580-5719-431d-a508-0cee4f9e8209 \ + --name mysecret \ + --type AWS \ + --access-key myaccesskey \ + --secret-key mysecretkey + ==> Success: Secret created. From b128ac6d8aba2533ba37f708a407f407454e0b68 Mon Sep 17 00:00:00 2001 From: Juan Pardo Date: Tue, 26 Sep 2023 17:41:23 +0200 Subject: [PATCH 4/4] fixup! fixup! fixup! Added support for listing, creating and deleting organization secrets --- docs/commands/organizations.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/commands/organizations.rst b/docs/commands/organizations.rst index 22d867a6..980a95d9 100644 --- a/docs/commands/organizations.rst +++ b/docs/commands/organizations.rst @@ -387,6 +387,11 @@ Example --org-id f6c39580-5719-431d-a508-0cee4f9e8209 \ --name mysecret \ --type AWS \ - --access-key myaccesskey \ + --access-key AKIAUVOXAVYAPIBHQK7I \ --secret-key mysecretkey - ==> Success: Secret created. + +--------------------------------------+--------+----------+------------------+ + | id | type | name | description | + |--------------------------------------+--------+----------+------------------| + | 71e7c5da-51fa-44f2-b178-d95052cbe620 | AWS | mysecret | **********BHQK7I | + +--------------------------------------+--------+----------+------------------+ + ==> Success: Secret created.