cgcsdk 1.0.9__tar.gz → 1.0.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. {cgcsdk-1.0.9/cgcsdk.egg-info → cgcsdk-1.0.10}/PKG-INFO +1 -1
  2. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/.env +1 -1
  3. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/CHANGELOG.md +11 -1
  4. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/cgc.py +3 -1
  5. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/compute/compute_cmd.py +1 -1
  6. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/compute/compute_responses.py +1 -1
  7. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/db/db_cmd.py +1 -1
  8. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/jobs/job_utils.py +1 -1
  9. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/resource/resource_cmd.py +1 -1
  10. cgcsdk-1.0.10/cgc/commands/user/__init__.py +14 -0
  11. {cgcsdk-1.0.9/cgc/commands/keys → cgcsdk-1.0.10/cgc/commands/user}/keys_cmd.py +9 -6
  12. {cgcsdk-1.0.9/cgc/commands/keys → cgcsdk-1.0.10/cgc/commands/user}/keys_responses.py +8 -11
  13. {cgcsdk-1.0.9/cgc/commands/keys → cgcsdk-1.0.10/cgc/commands/user}/keys_utils.py +1 -1
  14. cgcsdk-1.0.10/cgc/commands/user/secret_cmd.py +154 -0
  15. cgcsdk-1.0.10/cgc/commands/user/secret_responses.py +44 -0
  16. cgcsdk-1.0.10/cgc/commands/user/secret_utils.py +60 -0
  17. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/sdk/resource.py +6 -6
  18. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/responses_tests.py +1 -1
  19. cgcsdk-1.0.10/cgc/utils/cryptography/__init__.py +0 -0
  20. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/requests_helper.py +2 -0
  21. {cgcsdk-1.0.9 → cgcsdk-1.0.10/cgcsdk.egg-info}/PKG-INFO +1 -1
  22. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgcsdk.egg-info/SOURCES.txt +10 -6
  23. cgcsdk-1.0.9/cgc/commands/keys/__init__.py +0 -5
  24. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/LICENSE +0 -0
  25. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/MANIFEST.in +0 -0
  26. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/README.md +0 -0
  27. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/__init__.py +0 -0
  28. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/__init__.py +0 -0
  29. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/auth/__init__.py +0 -0
  30. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/auth/auth_cmd.py +0 -0
  31. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/auth/auth_responses.py +0 -0
  32. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/auth/auth_utils.py +0 -0
  33. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/billing/__init__.py +0 -0
  34. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/billing/billing_cmd.py +0 -0
  35. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/billing/billing_responses.py +0 -0
  36. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/billing/billing_utils.py +0 -0
  37. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/cgc_cmd.py +0 -0
  38. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/cgc_cmd_responses.py +0 -0
  39. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/cgc_helpers.py +0 -0
  40. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/cgc_models.py +0 -0
  41. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/compute/__init__.py +0 -0
  42. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/compute/compute_models.py +0 -0
  43. /cgcsdk-1.0.9/cgc/commands/compute/compute_utills.py → /cgcsdk-1.0.10/cgc/commands/compute/compute_utils.py +0 -0
  44. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/db/__init__.py +0 -0
  45. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/db/db_models.py +0 -0
  46. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/debug/__init__.py +0 -0
  47. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/debug/debug_cmd.py +0 -0
  48. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/exceptions.py +0 -0
  49. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/jobs/__init__.py +0 -0
  50. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/jobs/jobs_cmd.py +0 -0
  51. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/jobs/jobs_responses.py +0 -0
  52. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/resource/__init__.py +0 -0
  53. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/resource/resource_responses.py +0 -0
  54. {cgcsdk-1.0.9/cgc/commands/keys → cgcsdk-1.0.10/cgc/commands/user}/keys_models.py +0 -0
  55. /cgcsdk-1.0.9/cgc/config.py → /cgcsdk-1.0.10/cgc/commands/user/secret_models.py +0 -0
  56. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/volume/__init__.py +0 -0
  57. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/volume/data_model.py +0 -0
  58. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/volume/volume_cmd.py +0 -0
  59. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/volume/volume_responses.py +0 -0
  60. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/commands/volume/volume_utils.py +0 -0
  61. /cgcsdk-1.0.9/cgc/telemetry/__init__.py → /cgcsdk-1.0.10/cgc/config.py +0 -0
  62. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/sdk/__init__.py +0 -0
  63. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/sdk/exceptions.py +0 -0
  64. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/sdk/job.py +0 -0
  65. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/sdk/postgresql.py +0 -0
  66. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/server.crt +0 -0
  67. {cgcsdk-1.0.9/cgc/utils/consts → cgcsdk-1.0.10/cgc/telemetry}/__init__.py +0 -0
  68. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/telemetry/basic.py +0 -0
  69. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/__init__.py +0 -0
  70. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_billing_invoice.txt +0 -0
  71. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_billing_status.txt +0 -0
  72. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_billing_stop_events_compute.txt +0 -0
  73. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_billing_stop_events_volume.txt +0 -0
  74. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_compute_list.txt +0 -0
  75. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_compute_list_no_labels.txt +0 -0
  76. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_tabulate_response.txt +0 -0
  77. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/tests/desired_responses/test_volume_list.txt +0 -0
  78. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/__init__.py +0 -0
  79. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/click_group.py +0 -0
  80. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/config_utils.py +0 -0
  81. {cgcsdk-1.0.9/cgc/utils/cryptography → cgcsdk-1.0.10/cgc/utils/consts}/__init__.py +0 -0
  82. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/consts/env_consts.py +0 -0
  83. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/consts/message_consts.py +0 -0
  84. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/cryptography/aes_crypto.py +0 -0
  85. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/cryptography/encryption_module.py +0 -0
  86. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/cryptography/rsa_crypto.py +0 -0
  87. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/custom_exceptions.py +0 -0
  88. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/message_utils.py +0 -0
  89. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/prepare_headers.py +0 -0
  90. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/response_utils.py +0 -0
  91. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/update.py +0 -0
  92. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgc/utils/version_control.py +0 -0
  93. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgcsdk.egg-info/dependency_links.txt +0 -0
  94. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgcsdk.egg-info/entry_points.txt +0 -0
  95. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgcsdk.egg-info/requires.txt +0 -0
  96. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/cgcsdk.egg-info/top_level.txt +0 -0
  97. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/pyproject.toml +0 -0
  98. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/setup.cfg +0 -0
  99. {cgcsdk-1.0.9 → cgcsdk-1.0.10}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cgcsdk
3
- Version: 1.0.9
3
+ Version: 1.0.10
4
4
  Summary: Comtegra GPU Cloud REST API client
5
5
  Author: Comtegra AI Team
6
6
  Author-email: ai@comtegra.pl
@@ -6,4 +6,4 @@ CONFIG_FILE_NAME = cfg.json
6
6
  TMP_DIR = .tmp
7
7
  RELEASE = 1
8
8
  MAJOR_VERSION = 0
9
- MINOR_VERSION = 9
9
+ MINOR_VERSION = 10
@@ -1,10 +1,20 @@
1
1
  # Change Log
2
2
 
3
+ ## 1.0.10
4
+
5
+ Release on April 24, 2024
6
+
7
+ * added new command group: cgc secrets
8
+ * add - add new secret
9
+ * list - list all secrets in the namespace
10
+ * delete - delete secret (requires to be owner of the secret)
11
+ * update - update secret (requires to be owner of the secret)
12
+
3
13
  ## 1.0.9
4
14
 
5
15
  Release on April 23, 2024
6
16
 
7
- * updated cgc to work with cgc-server 1.1.0
17
+ * updated cgc to work with cgc-server 1.0.10
8
18
  * updated registration process
9
19
  * updated available apps, so it reflects changes in cgc-server
10
20
  * hotfix: listening jobs, which are not Running
@@ -19,7 +19,8 @@ from cgc.commands.cgc_cmd import (
19
19
  resource_events,
20
20
  context_group,
21
21
  )
22
- from cgc.commands.keys.keys_cmd import keys_group
22
+ from cgc.commands.user.keys_cmd import keys_group
23
+ from cgc.commands.user.secret_cmd import secret_group
23
24
 
24
25
  from cgc.utils.version_control import check_version, _get_version
25
26
  from cgc.utils.click_group import CustomGroup
@@ -48,6 +49,7 @@ cli.add_command(sending_telemetry_permission)
48
49
  cli.add_command(cgc_logs)
49
50
  cli.add_command(job_group)
50
51
  cli.add_command(keys_group)
52
+ cli.add_command(secret_group)
51
53
 
52
54
  if __name__ == "__main__" or __name__ == "cgc.cgc":
53
55
  cli()
@@ -10,7 +10,7 @@ from cgc.commands.compute.compute_responses import (
10
10
  compute_list_response,
11
11
  get_compute_port_list,
12
12
  )
13
- from cgc.commands.compute.compute_utills import (
13
+ from cgc.commands.compute.compute_utils import (
14
14
  compute_create_payload,
15
15
  port_delete_payload,
16
16
  port_modification_payload,
@@ -1,6 +1,6 @@
1
1
  from cgc.telemetry.basic import change_gauge
2
2
  from cgc.telemetry.basic import setup_gauge
3
- from cgc.commands.compute.compute_utills import get_app_list, get_app_mounts
3
+ from cgc.commands.compute.compute_utils import get_app_list, get_app_mounts
4
4
  from cgc.utils.config_utils import get_namespace
5
5
  from cgc.utils.message_utils import key_error_decorator_for_helpers
6
6
  from cgc.commands.compute import NoAppsToList
@@ -4,7 +4,7 @@ import click
4
4
  from cgc.commands.compute.compute_responses import compute_list_response
5
5
  from cgc.commands.db.db_models import DatabasesList
6
6
  from cgc.commands.compute.compute_responses import compute_create_response
7
- from cgc.commands.compute.compute_utills import compute_create_payload
7
+ from cgc.commands.compute.compute_utils import compute_create_payload
8
8
  from cgc.commands.exceptions import DatabaseCreationException
9
9
  from cgc.commands.resource.resource_cmd import resource_delete
10
10
  from cgc.utils.prepare_headers import get_api_url_and_prepare_headers
@@ -1,5 +1,5 @@
1
1
  from typing import Optional
2
- from cgc.commands.compute.compute_utills import list_get_mounted_volumes
2
+ from cgc.commands.compute.compute_utils import list_get_mounted_volumes
3
3
  import cgc.utils.consts.env_consts as env_consts
4
4
 
5
5
 
@@ -10,7 +10,7 @@ from cgc.commands.compute.compute_responses import (
10
10
  compute_delete_response,
11
11
  )
12
12
 
13
- from cgc.commands.compute.compute_utills import compute_delete_payload
13
+ from cgc.commands.compute.compute_utils import compute_delete_payload
14
14
  from cgc.commands.resource.resource_responses import get_ingress_list_from_response
15
15
 
16
16
  from cgc.utils.prepare_headers import get_api_url_and_prepare_headers
@@ -0,0 +1,14 @@
1
+ from cgc.commands.exceptions import ResponseException
2
+
3
+
4
+ class KeysCommandException(ResponseException):
5
+ """Base exception for all key commands."""
6
+
7
+
8
+ class SecretsCommandException(ResponseException):
9
+ """Base exception for all secret commands."""
10
+
11
+
12
+ class NoSecretsToList(SecretsCommandException):
13
+ def __init__(self) -> None:
14
+ super().__init__("No secrets to list.")
@@ -1,14 +1,14 @@
1
1
  import json
2
2
  import click
3
3
  from typing import Optional
4
- from cgc.commands.keys.keys_responses import (
4
+ from cgc.commands.user.keys_responses import (
5
5
  create_ssh_key_response,
6
6
  delete_ssh_key_response,
7
7
  list_ssh_keys_response,
8
8
  update_ssh_key_response,
9
9
  )
10
- from cgc.commands.keys.keys_utils import create_ssh_key_payload, update_ssh_key_payload
11
- from cgc.commands.keys.keys_models import SSHKeyTypes
10
+ from cgc.commands.user.keys_utils import create_ssh_key_payload, update_ssh_key_payload
11
+ from cgc.commands.user.keys_models import SSHKeyTypes
12
12
  from cgc.utils.prepare_headers import get_api_url_and_prepare_headers
13
13
  from cgc.utils.response_utils import retrieve_and_validate_response_send_metric
14
14
  from cgc.utils.click_group import CustomGroup, CustomCommand
@@ -84,7 +84,8 @@ def create_ssh_key(
84
84
  click.echo(
85
85
  create_ssh_key_response(
86
86
  retrieve_and_validate_response_send_metric(__res, metric)
87
- )
87
+ ),
88
+ color="green",
88
89
  )
89
90
 
90
91
 
@@ -135,7 +136,8 @@ def update_ssh_key(
135
136
  click.echo(
136
137
  update_ssh_key_response(
137
138
  retrieve_and_validate_response_send_metric(__res, metric)
138
- )
139
+ ),
140
+ color="green",
139
141
  )
140
142
 
141
143
 
@@ -154,7 +156,8 @@ def delete_ssh_key(key_id: str):
154
156
  click.echo(
155
157
  delete_ssh_key_response(
156
158
  retrieve_and_validate_response_send_metric(__res, metric)
157
- )
159
+ ),
160
+ color="green",
158
161
  )
159
162
 
160
163
 
@@ -1,6 +1,6 @@
1
1
  import click
2
2
  from cgc.utils.message_utils import key_error_decorator_for_helpers
3
- from cgc.commands.keys.keys_utils import get_user_ssh_keys
3
+ from cgc.commands.user.keys_utils import get_user_ssh_keys
4
4
  from cgc.utils.response_utils import (
5
5
  fill_missing_values_in_a_response,
6
6
  tabulate_a_response,
@@ -8,7 +8,7 @@ from cgc.utils.response_utils import (
8
8
 
9
9
 
10
10
  @key_error_decorator_for_helpers
11
- def create_ssh_key_response(data: dict) -> dict:
11
+ def create_ssh_key_response(data: dict) -> str:
12
12
  """Create a response for creating a new SSH key"""
13
13
  try:
14
14
  key_id = data["details"]["key_id"]
@@ -18,7 +18,7 @@ def create_ssh_key_response(data: dict) -> dict:
18
18
 
19
19
 
20
20
  @key_error_decorator_for_helpers
21
- def delete_ssh_key_response(data: dict) -> dict:
21
+ def delete_ssh_key_response(data: dict) -> str:
22
22
  """Create a response for deleting an SSH key"""
23
23
  try:
24
24
  key_id = data["details"]["key_id"]
@@ -28,20 +28,17 @@ def delete_ssh_key_response(data: dict) -> dict:
28
28
 
29
29
 
30
30
  @key_error_decorator_for_helpers
31
- def list_ssh_keys_response(data: dict) -> dict:
31
+ def list_ssh_keys_response(data: dict) -> str:
32
32
  """Create a response for listing all SSH keys"""
33
33
  list_of_json_data = get_user_ssh_keys(data["details"])
34
+ if not list_of_json_data:
35
+ return "No keys found."
34
36
  table = fill_missing_values_in_a_response(list_of_json_data)
35
37
 
36
38
  return tabulate_a_response(table)
37
39
 
38
40
 
39
41
  @key_error_decorator_for_helpers
40
- def update_ssh_key_response(data: dict) -> dict:
42
+ def update_ssh_key_response(_: dict) -> str:
41
43
  """Create a response for updating an SSH key"""
42
- try:
43
- key_id = data["details"]["key_id"]
44
- except KeyError:
45
- return "Key updated."
46
- else:
47
- return f"Key updated. New key ID: {key_id}."
44
+ return "Key updated."
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
  import click
3
- from cgc.commands.keys.keys_models import SSHKeyTypes
3
+ from cgc.commands.user.keys_models import SSHKeyTypes
4
4
 
5
5
 
6
6
  def create_ssh_key_payload(
@@ -0,0 +1,154 @@
1
+ import json
2
+ from typing import Optional, Set
3
+ import click
4
+
5
+ from cgc.utils.prepare_headers import get_api_url_and_prepare_headers
6
+ from cgc.utils.response_utils import retrieve_and_validate_response_send_metric
7
+ from cgc.utils.click_group import CustomGroup, CustomCommand
8
+ from cgc.utils.requests_helper import call_api, EndpointTypes
9
+ from cgc.commands.user.secret_utils import create_secret_payload, update_secret_payload
10
+ from cgc.commands.user.secret_responses import (
11
+ create_secret_response,
12
+ update_secret_response,
13
+ delete_secret_response,
14
+ list_secrets_response,
15
+ )
16
+
17
+
18
+ @click.group(name="secret", cls=CustomGroup)
19
+ def secret_group():
20
+ """
21
+ Management of secrets.
22
+ """
23
+
24
+
25
+ @secret_group.command("create", cls=CustomCommand)
26
+ @click.argument("secret_name", type=click.STRING)
27
+ @click.option(
28
+ "-r",
29
+ "--registry-list",
30
+ "registry_list",
31
+ multiple=True,
32
+ help="URL of the registry",
33
+ required=True,
34
+ )
35
+ @click.option(
36
+ "-u",
37
+ "--username",
38
+ "username",
39
+ type=click.STRING,
40
+ help="Username for the registry",
41
+ required=True,
42
+ )
43
+ @click.option(
44
+ "-p",
45
+ "--password",
46
+ "password",
47
+ type=click.STRING,
48
+ help="Password for the username",
49
+ required=True,
50
+ )
51
+ def create_secret(
52
+ secret_name: str, registry_list: Set[str], username: str, password: str
53
+ ):
54
+ """Create a new secret in the namespace"""
55
+ api_url, headers = get_api_url_and_prepare_headers()
56
+ url = f"{api_url}/v1/api/secret/create"
57
+ metric = "user.secret.create"
58
+ __payload = create_secret_payload(secret_name, registry_list, username, password)
59
+ __res = call_api(
60
+ request=EndpointTypes.post,
61
+ url=url,
62
+ headers=headers,
63
+ data=json.dumps(__payload).encode("utf-8"),
64
+ )
65
+ click.echo(
66
+ create_secret_response(
67
+ retrieve_and_validate_response_send_metric(__res, metric)
68
+ ),
69
+ color="green",
70
+ )
71
+
72
+
73
+ @secret_group.command("update", cls=CustomCommand)
74
+ @click.argument("secret_name", type=click.STRING)
75
+ @click.option(
76
+ "-r",
77
+ "--registry-list",
78
+ "registry_list",
79
+ multiple=True,
80
+ help="URL of the registry",
81
+ )
82
+ @click.option(
83
+ "-u",
84
+ "--username",
85
+ "username",
86
+ type=click.STRING,
87
+ help="Username for the registry",
88
+ )
89
+ @click.option(
90
+ "-p",
91
+ "--password",
92
+ "password",
93
+ type=click.STRING,
94
+ help="Password for the username",
95
+ )
96
+ def update_secret(
97
+ secret_name: str,
98
+ registry_list: Optional[Set[str]] = None,
99
+ username: Optional[str] = None,
100
+ password: Optional[str] = None,
101
+ ):
102
+ """Update an existing secret in the namespace"""
103
+ api_url, headers = get_api_url_and_prepare_headers()
104
+ url = f"{api_url}/v1/api/secret/manage/{secret_name}"
105
+ metric = "user.secret.update"
106
+ __payload = update_secret_payload(registry_list, username, password)
107
+ __res = call_api(
108
+ request=EndpointTypes.put,
109
+ url=url,
110
+ headers=headers,
111
+ data=json.dumps(__payload).encode("utf-8"),
112
+ )
113
+ click.echo(
114
+ update_secret_response(
115
+ retrieve_and_validate_response_send_metric(__res, metric)
116
+ ),
117
+ color="green",
118
+ )
119
+
120
+
121
+ @secret_group.command("delete", cls=CustomCommand)
122
+ @click.argument("secret_name", type=click.STRING)
123
+ def delete_secret(secret_name: str):
124
+ """Delete an secret"""
125
+ api_url, headers = get_api_url_and_prepare_headers()
126
+ url = f"{api_url}/v1/api/secret/manage/{secret_name}"
127
+ metric = "user.secret.delete"
128
+ __res = call_api(
129
+ request=EndpointTypes.delete,
130
+ url=url,
131
+ headers=headers,
132
+ )
133
+ click.echo(
134
+ delete_secret_response(
135
+ retrieve_and_validate_response_send_metric(__res, metric)
136
+ ),
137
+ color="green",
138
+ )
139
+
140
+
141
+ @secret_group.command("list", cls=CustomCommand)
142
+ def list_secrets():
143
+ """List all secrets in the namespace"""
144
+ api_url, headers = get_api_url_and_prepare_headers()
145
+ url = f"{api_url}/v1/api/secret/list"
146
+ metric = "user.secret.list"
147
+ __res = call_api(
148
+ request=EndpointTypes.get,
149
+ url=url,
150
+ headers=headers,
151
+ )
152
+ click.echo(
153
+ list_secrets_response(retrieve_and_validate_response_send_metric(__res, metric))
154
+ )
@@ -0,0 +1,44 @@
1
+ import click
2
+
3
+ from cgc.commands.user import NoSecretsToList
4
+ from cgc.commands.user.secret_utils import get_secret_list
5
+ from cgc.telemetry.basic import setup_gauge
6
+ from cgc.utils.config_utils import get_namespace
7
+ from cgc.utils.message_utils import key_error_decorator_for_helpers
8
+ from cgc.utils.response_utils import (
9
+ fill_missing_values_in_a_response,
10
+ tabulate_a_response,
11
+ )
12
+
13
+
14
+ @key_error_decorator_for_helpers
15
+ def create_secret_response(data: dict) -> str:
16
+ """Create a response for creating a new secret in the namespace"""
17
+ return f'Secret {data.get("details", {}).get("secret_name")} successfully created.'
18
+
19
+
20
+ @key_error_decorator_for_helpers
21
+ def update_secret_response(data: dict) -> str:
22
+ """Create a response for updating a secret in the namespace"""
23
+ return f'Secret {data.get("details", {}).get("secret_name")} successfully updated.'
24
+
25
+
26
+ @key_error_decorator_for_helpers
27
+ def delete_secret_response(data: dict) -> str:
28
+ """Create a response for deleting a secret in the namespace"""
29
+ return f'Secret {data.get("details", {}).get("secret_name")} successfully deleted.'
30
+
31
+
32
+ @key_error_decorator_for_helpers
33
+ def list_secrets_response(data: dict) -> str:
34
+ """Create a response for listing all secrets in the namespace"""
35
+ secret_list = data.get("details", {}).get("secret_names", [])
36
+ setup_gauge(f"{get_namespace()}.secret.count", len(secret_list))
37
+
38
+ if not secret_list:
39
+ raise NoSecretsToList()
40
+
41
+ list_of_json_data = get_secret_list(secret_list)
42
+ table = fill_missing_values_in_a_response(list_of_json_data)
43
+
44
+ return tabulate_a_response(table)
@@ -0,0 +1,60 @@
1
+ from typing import Set
2
+
3
+
4
+ def create_secret_payload(
5
+ secret_name: str, registry_list: Set[str], username: str, password: str
6
+ ) -> dict:
7
+ """Create a payload for creating a new secret"""
8
+ payload = {
9
+ "name": secret_name,
10
+ "registry_list": registry_list,
11
+ "username": username,
12
+ "password": password,
13
+ }
14
+ return payload
15
+
16
+
17
+ def update_secret_payload(
18
+ registry_list: Set[str], username: str, password: str
19
+ ) -> dict:
20
+ """Create a payload for updating a secret"""
21
+ payload = {}
22
+ if registry_list:
23
+ payload["registry_list"] = registry_list
24
+ if username:
25
+ payload["username"] = username
26
+ if password:
27
+ payload["password"] = password
28
+ return payload
29
+
30
+
31
+ def _get_secret_json_data(secret_list: list):
32
+ """Formats and returns list of secrets to print.
33
+
34
+ :param job_list: list of secrets
35
+ :type job_list: list
36
+ :return: formatted list of secrets
37
+ :rtype: list
38
+ """
39
+ output_data = []
40
+
41
+ for secret in secret_list:
42
+ try:
43
+
44
+ secret_data = {
45
+ "name": secret.get("secret"),
46
+ "secret_type": secret.get("secret_type"),
47
+ "registry_list": secret.get("registry_list", []),
48
+ "secret_admin": secret.get("secret_admin"),
49
+ "date_created": f'{secret.get("date_created")} UTC',
50
+ "whitelist": secret.get("whitelist", ["*"]),
51
+ }
52
+ output_data.append(secret_data)
53
+ except KeyError:
54
+ pass
55
+
56
+ return output_data
57
+
58
+
59
+ def get_secret_list(secret_list: list):
60
+ return _get_secret_json_data(secret_list)
@@ -2,7 +2,7 @@ import json as _json
2
2
  import cgc.sdk.exceptions as _exceptions
3
3
  from cgc.utils.custom_exceptions import CUSTOM_EXCEPTIONS
4
4
  import cgc.utils.prepare_headers as _prepare_headers
5
- import cgc.commands.compute.compute_utills as _compute_utills
5
+ import cgc.commands.compute.compute_utils as _compute_utils
6
6
  import cgc.utils.requests_helper as _requests_helper
7
7
  import cgc.utils.response_utils as _response_utils
8
8
  from enum import Enum as _Enum
@@ -243,7 +243,7 @@ def compute_create_custom(
243
243
  gpu_type = gpu_type.upper()
244
244
  if gpu_type not in GPUsList.get_list():
245
245
  raise _exceptions.SDKException(-3, f"Invalid GPU type: {gpu_type}")
246
- __payload = _compute_utills.compute_create_payload(
246
+ __payload = _compute_utils.compute_create_payload(
247
247
  name=name,
248
248
  entity="custom",
249
249
  cpu=cpu,
@@ -291,7 +291,7 @@ def resource_update_port(
291
291
  api_url, headers = _prepare_headers.get_api_url_and_prepare_headers()
292
292
  url = f"{api_url}/v1/api/resource/ports?port_modification_mode=UPDATE"
293
293
  metric = "resource.ports.update"
294
- __payload = _compute_utills.port_modification_payload(
294
+ __payload = _compute_utils.port_modification_payload(
295
295
  port_name=port_name,
296
296
  port_number=new_port,
297
297
  ingress=ingress,
@@ -325,7 +325,7 @@ def resource_add_port(name: str, port_name: str, new_port: int, ingress: bool =
325
325
  api_url, headers = _prepare_headers.get_api_url_and_prepare_headers()
326
326
  url = f"{api_url}/v1/api/resource/ports?port_modification_mode=ADD"
327
327
  metric = "resource.ports.add"
328
- __payload = _compute_utills.port_modification_payload(
328
+ __payload = _compute_utils.port_modification_payload(
329
329
  port_name=port_name,
330
330
  port_number=new_port,
331
331
  ingress=ingress,
@@ -360,7 +360,7 @@ def resource_delete_port(
360
360
  api_url, headers = _prepare_headers.get_api_url_and_prepare_headers()
361
361
  url = f"{api_url}/v1/api/resource/ports?port_modification_mode=DELETE"
362
362
  metric = "resource.ports.delete"
363
- __payload = _compute_utills.port_delete_payload(
363
+ __payload = _compute_utils.port_delete_payload(
364
364
  port_name=port_name,
365
365
  app_name=name,
366
366
  )
@@ -411,7 +411,7 @@ def resource_delete(name: str):
411
411
  api_url, headers = _prepare_headers.get_api_url_and_prepare_headers()
412
412
  url = f"{api_url}/v1/api/resource/delete"
413
413
  metric = "resource.delete"
414
- __payload = _compute_utills.compute_delete_payload(name=name)
414
+ __payload = _compute_utils.compute_delete_payload(name=name)
415
415
  __res = _requests_helper.call_api(
416
416
  request=_requests_helper.EndpointTypes.delete,
417
417
  url=url,
@@ -27,7 +27,7 @@ from cgc.utils.response_utils import (
27
27
  tabulate_a_response,
28
28
  fill_missing_values_in_a_response,
29
29
  )
30
- from cgc.commands.compute.compute_utills import get_app_list
30
+ from cgc.commands.compute.compute_utils import get_app_list
31
31
 
32
32
 
33
33
  class TestVolumeResponses(unittest.TestCase):
File without changes
@@ -18,10 +18,12 @@ from cgc.utils.consts.message_consts import (
18
18
 
19
19
  urllib3.disable_warnings(urllib3.exceptions.SecurityWarning)
20
20
 
21
+
21
22
  class EndpointTypes(Enum):
22
23
  get = requests.get
23
24
  post = requests.post
24
25
  delete = requests.delete
26
+ put = requests.put
25
27
 
26
28
 
27
29
  def _process_endpoint_kwargs(**kwargs):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cgcsdk
3
- Version: 1.0.9
3
+ Version: 1.0.10
4
4
  Summary: Comtegra GPU Cloud REST API client
5
5
  Author: Comtegra AI Team
6
6
  Author-email: ai@comtegra.pl
@@ -27,7 +27,7 @@ cgc/commands/compute/__init__.py
27
27
  cgc/commands/compute/compute_cmd.py
28
28
  cgc/commands/compute/compute_models.py
29
29
  cgc/commands/compute/compute_responses.py
30
- cgc/commands/compute/compute_utills.py
30
+ cgc/commands/compute/compute_utils.py
31
31
  cgc/commands/db/__init__.py
32
32
  cgc/commands/db/db_cmd.py
33
33
  cgc/commands/db/db_models.py
@@ -37,14 +37,18 @@ cgc/commands/jobs/__init__.py
37
37
  cgc/commands/jobs/job_utils.py
38
38
  cgc/commands/jobs/jobs_cmd.py
39
39
  cgc/commands/jobs/jobs_responses.py
40
- cgc/commands/keys/__init__.py
41
- cgc/commands/keys/keys_cmd.py
42
- cgc/commands/keys/keys_models.py
43
- cgc/commands/keys/keys_responses.py
44
- cgc/commands/keys/keys_utils.py
45
40
  cgc/commands/resource/__init__.py
46
41
  cgc/commands/resource/resource_cmd.py
47
42
  cgc/commands/resource/resource_responses.py
43
+ cgc/commands/user/__init__.py
44
+ cgc/commands/user/keys_cmd.py
45
+ cgc/commands/user/keys_models.py
46
+ cgc/commands/user/keys_responses.py
47
+ cgc/commands/user/keys_utils.py
48
+ cgc/commands/user/secret_cmd.py
49
+ cgc/commands/user/secret_models.py
50
+ cgc/commands/user/secret_responses.py
51
+ cgc/commands/user/secret_utils.py
48
52
  cgc/commands/volume/__init__.py
49
53
  cgc/commands/volume/data_model.py
50
54
  cgc/commands/volume/volume_cmd.py
@@ -1,5 +0,0 @@
1
- from cgc.commands.exceptions import ResponseException
2
-
3
-
4
- class KeysCommandException(ResponseException):
5
- pass
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes