Skip to content

Commit 515f39e

Browse files
authored
Merge pull request #28 from jupyter-naas/27-vc-authentication-logic
Update authentication logic for SDK/CLI
2 parents 1f26a3e + bc0ddb9 commit 515f39e

File tree

10 files changed

+529
-128
lines changed

10 files changed

+529
-128
lines changed

naas_python/__init__.py

+2-18
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,5 @@
1-
from pathlib import Path
1+
from .domains.registry.handlers.PythonHandler import primaryAdaptor as registry
2+
from .domains.space.handlers.PythonHandler import primaryAdaptor as space
23
from .utils.log import initialize_logging
34

45
logger = initialize_logging()
5-
6-
__ROOT_DIR__ = Path(__file__).parents[1].absolute()
7-
8-
# If the package is run as a script, run the main function to load the CLI.
9-
if __name__ == "__main__":
10-
from naas_python.main import main
11-
12-
main()
13-
else:
14-
# Else use it as a library.
15-
from .domains.space.handlers.PythonHandler import primaryAdaptor as __space
16-
17-
space = __space
18-
19-
from .domains.registry.handlers.PythonHandler import primaryAdaptor as __registry
20-
21-
registry = __registry

naas_python/cli.py

+20-16
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
import typer
2-
from os import getenv
3-
import sys
4-
from naas_python.domains.space.handlers.CLISpaceAdaptor import (
5-
primaryAdaptor as spaceAdaptor,
6-
)
2+
73
from naas_python.domains.registry.handlers.CLIRegistryHandler import (
8-
primaryAdaptor as registryAdaptor,
4+
primaryAdaptor as typerRegistryAdaptor,
5+
)
6+
7+
# from naas_python.domains import spaceCliAdaptor # , registryCliAdaptor
8+
from naas_python.domains.space.handlers.CLISpaceHandler import (
9+
primaryAdaptor as typerSpaceAdaptor,
910
)
1011

1112

12-
# if getenv("NAAS_PYTHON_DEBUG", "False").lower() == "false":
13-
# sys.tracebacklimit = 0 # Disable traceback
13+
def _create_cli_app():
14+
app = typer.Typer(
15+
epilog="Found a bug? Report it at https://github.com/jupyter-naas/naas-python/issues",
16+
pretty_exceptions_show_locals=False,
17+
pretty_exceptions_short=True,
18+
# pretty_exceptions_enable=False,
19+
)
1420

15-
app = typer.Typer(
16-
epilog="Found a bug? Report it at https://github.com/jupyter-naas/naas-python/issues ",
17-
pretty_exceptions_show_locals=False,
18-
pretty_exceptions_short=True,
19-
# pretty_exceptions_enable=False,
20-
)
21+
# Registry domain's related commands
22+
app.add_typer(typerSpaceAdaptor.app, name="space")
23+
app.add_typer(typerRegistryAdaptor.app, name="registry")
24+
25+
return app
2126

22-
app.add_typer(spaceAdaptor.app, name="space")
2327

24-
app.add_typer(registryAdaptor.app, name="registry")
28+
app = _create_cli_app()

naas_python/domains/registry/adaptors/secondary/NaasRegistryAPIAdaptor.py

+13-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from os import getenv
2+
import logging
33

44
import requests
55

@@ -15,39 +15,37 @@
1515
class NaasRegistryAPIAdaptor(BaseAPIAdaptor, IRegistryAdaptor):
1616
def __init__(self):
1717
super().__init__()
18-
# TODO: proper authorization validation utility function
19-
self._authorization_token = getenv("NAAS_PYTHON_API_TOKEN")
18+
# self.authenticator = NaasSpaceAuthenticatorAdapter()
19+
# self._authorization_token = self.authenticator.jwt_token
2020

2121
@BaseAPIAdaptor.service_status_decorator
2222
def create_registry(self, name) -> dict:
2323
_url = f"{self.host}/registry/"
2424

25-
self.logger.debug(f"create request url: {_url}")
25+
logging.debug(f"create request url: {_url}")
2626

2727
api_response = self.make_api_request(
2828
requests.post,
2929
_url,
3030
payload=json.dumps({"name": name}),
31-
token=self._authorization_token,
3231
)
3332

34-
self.logger.debug(
33+
logging.debug(
3534
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
3635
)
3736
return self._handle_create_response(api_response)
3837

3938
@BaseAPIAdaptor.service_status_decorator
4039
def get_registry_by_name(self, name) -> dict:
4140
_url = f"{self.host}/registry/{name}"
42-
self.logger.debug(f"get request url: {_url}")
41+
logging.debug(f"get request url: {_url}")
4342

4443
api_response = self.make_api_request(
4544
requests.get,
4645
f"{self.host}/registry/{name}",
47-
token=self._authorization_token,
4846
)
4947

50-
self.logger.debug(
48+
logging.debug(
5149
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
5250
)
5351

@@ -57,30 +55,28 @@ def get_registry_by_name(self, name) -> dict:
5755
def list_registries(self, page_size, page_number) -> dict:
5856
_url = f"{self.host}/registry/?page_size={page_size}&page_number={page_number}"
5957

60-
self.logger.debug(f"list request url: {_url}")
58+
logging.debug(f"list request url: {_url}")
6159

6260
api_response = self.make_api_request(
6361
requests.get,
6462
_url,
65-
token=self._authorization_token,
6663
)
67-
self.logger.debug(
64+
logging.debug(
6865
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
6966
)
7067
return self._handle_list_response(api_response)
7168

7269
@BaseAPIAdaptor.service_status_decorator
7370
def delete_registry(self, name) -> dict:
7471
_url = f"{self.host}/registry/{name}"
75-
self.logger.debug(f"delete request url: {_url}")
72+
logging.debug(f"delete request url: {_url}")
7673

7774
api_response = self.make_api_request(
7875
requests.delete,
7976
_url,
80-
token=self._authorization_token,
8177
)
8278

83-
self.logger.debug(
79+
logging.debug(
8480
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
8581
)
8682

@@ -90,15 +86,14 @@ def delete_registry(self, name) -> dict:
9086
def get_registry_credentials(self, name) -> dict:
9187
_url = f"{self.host}/registry/{name}/credentials"
9288

93-
self.logger.debug(f"get credentials request url: {_url}")
89+
logging.debug(f"get credentials request url: {_url}")
9490

9591
api_response = self.make_api_request(
9692
requests.get,
9793
_url,
98-
token=self._authorization_token,
9994
)
10095

101-
self.logger.debug(
96+
logging.debug(
10297
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
10398
)
10499

naas_python/domains/space/adaptors/primary/SDKSpaceAdaptor.py

+15-21
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,7 @@ def add(
101101
# Step 1: Create a new Registry on space.naas.ai if requested
102102

103103
if not skip_registry:
104-
self.console.print(
105-
f"[cyan]Creating Docker Registry '{registry_name}'...[/cyan]"
106-
)
104+
print(f"Creating Docker Registry '{registry_name}'...")
107105
from naas_python.domains.registry.handlers.PythonHandler import (
108106
primaryAdaptor as RegistryHandler,
109107
)
@@ -112,41 +110,37 @@ def add(
112110
try:
113111
registry = RegistryHandler.create(name=registry_name)
114112
except RegistryConflictError:
115-
self.console.print(
116-
f"[yellow]A registry with the name '{registry_name}' already exists. Proceeding with existing registry.[/yellow]"
113+
print(
114+
f"A registry with the name '{registry_name}' already exists. Proceeding with existing registry."
117115
)
118116
registry = RegistryHandler.get(name=registry_name)
119117

120118
# Get credentials for the registry (will create a credentials file if it doesn't exist)
121119
# and set up docker login for the registry (if type is docker)
122120
if space_type == "docker":
123-
self.console.print(
124-
f"[cyan]Retrieving credentials for Docker Registry...[/cyan]"
125-
)
121+
print(f"Retrieving credentials for Docker Registry...")
126122
RegistryHandler.get_credentials(name=registry_name)
127123

128124
# Step 2.a: Build and push image to registry container if requested:
129125
if space_type == "docker":
130-
self.console.print(
131-
f"[cyan]Building Docker Image for '{space_name}'...[/cyan]"
132-
)
126+
print(f"Building Docker Image for '{space_name}'...")
133127
os.system(
134-
f"docker build -t {registry.uri}:latest -f {dockerfile_path} {docker_context}"
128+
f"docker build -t {registry.registry.uri}:latest -f {dockerfile_path} {docker_context}"
135129
)
136130

137-
self.console.print("[cyan]Pushing Docker Image...")
138-
os.system(f"docker push {registry.uri}:latest")
131+
print("Pushing Docker Image...")
132+
os.system(f"docker push {registry.registry.uri}:latest")
139133

140134
# Step 2.b: Create a new space on space.naas.ai
141-
self.console.print(f"[cyan]Creating Naas Space '{space_name}'...[/cyan]")
135+
print(f"Creating Naas Space '{space_name}'...")
142136
try:
143137
self.domain.create(
144138
name=space_name,
145139
domain=f"{space_name}.naas.ai",
146140
containers=[
147141
{
148142
"name": space_name,
149-
"image": image if image else f"{registry.uri}:latest",
143+
"image": image if image else f"{registry.registry.uri}:latest",
150144
"env": {},
151145
"cpu": cpu,
152146
"memory": memory,
@@ -155,8 +149,8 @@ def add(
155149
],
156150
)
157151
except SpaceConflictError as e:
158-
self.console.print(
159-
f"[yellow]A space with the name '{space_name}' already exists. Proceeding with existing space.[/yellow]"
152+
print(
153+
f"A space with the name '{space_name}' already exists. Proceeding with existing space."
160154
)
161155
self.domain.get(name=space_name)
162156

@@ -207,7 +201,7 @@ def add(
207201
)
208202

209203
try:
210-
_build_command = f" docker build -t {registry.uri}:latest -f {dockerfile_path} {docker_context}"
204+
_build_command = f" docker build -t {registry.registry.uri}:latest -f {dockerfile_path} {docker_context}"
211205
except ValueError as e:
212206
raise ValueError(
213207
"When space_type is 'docker', dockerfile_path and docker_context must be provided. Please provide these values and try again"
@@ -218,11 +212,11 @@ def add(
218212
f'if: ${{ github.event_name == "push" }}',
219213
"run: |",
220214
_build_command,
221-
f" docker push { registry.uri }:latest",
215+
f" docker push { registry.registry.uri }:latest",
222216
]
223217
pipeline.add_job("Build and Push Docker Image", docker_steps)
224218

225219
# Render the CI/CD configuration
226220
pipeline.render()
227221

228-
self.console.print("[green]Generated CI/CD configuration.[/green]")
222+
print("Generated CI/CD configuration.")

naas_python/domains/space/adaptors/secondary/NaasSpaceAPIAdaptor.py

+13-25
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,51 @@
11
import json
22
import os
3-
from logging import getLogger
43
from os import getenv
4+
import logging
55

66
import requests
77
from requests.exceptions import ConnectionError
88

99
from naas_python.domains.space.SpaceSchema import (
1010
ISpaceAdaptor,
11-
SpaceValidationError,
1211
SpaceConflictError,
1312
SpaceNotFound,
13+
SpaceValidationError,
1414
)
15-
16-
logger = getLogger(__name__)
1715
from naas_python.utils.domains_base.secondary.BaseAPIAdaptor import BaseAPIAdaptor
1816

1917

2018
class NaasSpaceAPIAdaptor(BaseAPIAdaptor, ISpaceAdaptor):
2119
def __init__(self):
2220
super().__init__()
23-
# TODO: proper authorization validation utility function
24-
self._authorization_token = getenv("NAAS_PYTHON_API_TOKEN")
2521

2622
@BaseAPIAdaptor.service_status_decorator
2723
def create_space(self, name, domain, containers) -> dict:
2824
_url = f"{self.host}/space/"
2925

30-
self.logger.debug(f"create request url: {_url}")
26+
logging.debug(f"create request url: {_url}")
3127

3228
api_response = self.make_api_request(
3329
requests.post,
3430
_url,
3531
payload=json.dumps(
3632
{"name": name, "domain": domain, "containers": containers}
3733
),
38-
token=self._authorization_token,
3934
)
4035

41-
self.logger.debug(
36+
logging.debug(
4237
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
4338
)
4439
return self._handle_create_response(api_response)
4540

4641
@BaseAPIAdaptor.service_status_decorator
4742
def get_space_by_name(self, name):
4843
_url = f"{self.host}/space/{name}"
49-
self.logger.debug(f"get request url: {_url}")
44+
logging.debug(f"get request url: {_url}")
5045

51-
api_response = self.make_api_request(
52-
requests.get,
53-
f"{self.host}/space/{name}",
54-
token=self._authorization_token,
55-
)
46+
api_response = self.make_api_request(requests.get, f"{self.host}/space/{name}")
5647

57-
self.logger.debug(
48+
logging.debug(
5849
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
5950
)
6051

@@ -64,14 +55,13 @@ def get_space_by_name(self, name):
6455
def list_spaces(self, page_size, page_number) -> dict:
6556
_url = f"{self.host}/space/?page_size={page_size}&page_number={page_number}"
6657

67-
self.logger.debug(f"list request url: {_url}")
58+
logging.debug(f"list request url: {_url}")
6859

6960
api_response = self.make_api_request(
7061
requests.get,
7162
_url,
72-
token=self._authorization_token,
7363
)
74-
self.logger.debug(
64+
logging.debug(
7565
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
7666
)
7767
return self._handle_list_response(api_response)
@@ -87,32 +77,30 @@ def update_space(self, name, domain, containers) -> dict:
8777

8878
_url = f"{self.host}/space/{name}"
8979

90-
self.logger.debug(f"update request url: {_url}")
80+
logging.debug(f"update request url: {_url}")
9181

9282
api_response = self.make_api_request(
9383
requests.put,
9484
_url,
9585
payload=json.dumps(payload),
96-
token=self._authorization_token,
9786
)
9887

99-
self.logger.debug(
88+
logging.debug(
10089
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
10190
)
10291
return self._handle_get_response(api_response)
10392

10493
@BaseAPIAdaptor.service_status_decorator
10594
def delete_space(self, name) -> dict:
10695
_url = f"{self.host}/space/{name}"
107-
self.logger.debug(f"delete request url: {_url}")
96+
logging.debug(f"delete request url: {_url}")
10897

10998
api_response = self.make_api_request(
11099
requests.delete,
111100
_url,
112-
token=self._authorization_token,
113101
)
114102

115-
self.logger.debug(
103+
logging.debug(
116104
f"Request URL: {api_response.url} :: status_code: {api_response.status_code}"
117105
)
118106
return self._handle_delete_response(api_response)

0 commit comments

Comments
 (0)