Skip to content

Commit e759118

Browse files
WojCzujpkrajewski
andauthored
feat: add org register before api gw login (#79)
* feat: add org register before api gw login * fix: remove unnecessary loggers; add timeout; move register method * feat: change manual status check with raise_for_status method Co-authored-by: Jakub Krajewski <95274389+jpkrajewski@users.noreply.github.com> * feat: add flag to register org only once; * refactor: extract base_url to separate method; * fix: remove headers --------- Co-authored-by: Jakub Krajewski <95274389+jpkrajewski@users.noreply.github.com>
1 parent abc4eee commit e759118

1 file changed

Lines changed: 42 additions & 1 deletion

File tree

catalystwan/apigw_auth.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class ApiGwAuth(AuthBase, AuthProtocol):
3737
def __init__(self, login: ApiGwLogin, logger: Optional[logging.Logger] = None, verify: bool = False):
3838
self.login = login
3939
self.token = ""
40+
self.org_registered: bool = False
4041
self.logger = logger or logging.getLogger(__name__)
4142
self.verify = verify
4243
self.session_count: int = 0
@@ -53,14 +54,25 @@ def __call__(self, request: PreparedRequest) -> PreparedRequest:
5354
return request
5455

5556
def handle_auth(self, request: PreparedRequest) -> None:
57+
if not self.org_registered:
58+
self.register(request)
5659
if self.token == "":
5760
self.authenticate(request)
5861

5962
def authenticate(self, request: PreparedRequest):
63+
base_url = self.get_base_url(request)
64+
self.token = self.get_token(base_url, self.login, self.logger, self.verify, self.request_timeout)
65+
66+
def register(self, request: PreparedRequest):
67+
base_url = self.get_base_url(request)
68+
self.register_org(base_url, self.login, self.logger, self.verify, self.request_timeout)
69+
self.org_registered = True
70+
71+
def get_base_url(self, request: PreparedRequest):
6072
assert request.url is not None
6173
url = urlparse(request.url)
6274
base_url = f"{url.scheme}://{url.netloc}" # noqa: E231
63-
self.token = self.get_token(base_url, self.login, self.logger, self.verify, self.request_timeout)
75+
return base_url
6476

6577
def build_digest_header(self, request: PreparedRequest) -> None:
6678
header = {
@@ -101,6 +113,35 @@ def get_token(
101113
raise CatalystwanException("Failed to get bearer token")
102114
return token
103115

116+
@staticmethod
117+
def register_org(
118+
base_url: str,
119+
apigw_login: ApiGwLogin,
120+
logger: Optional[logging.Logger] = None,
121+
verify: bool = False,
122+
timeout: int = 10,
123+
) -> None:
124+
try:
125+
payload = apigw_login.model_dump(include={"client_id", "client_secret", "org_name"})
126+
response = post(
127+
url=f"{base_url}/apigw/organization/registration",
128+
json=payload,
129+
verify=verify,
130+
timeout=timeout,
131+
)
132+
if logger is not None:
133+
logger.debug(auth_response_debug(response))
134+
135+
response.raise_for_status()
136+
137+
except HTTPError as ex:
138+
raise CatalystwanException(
139+
f"Problem with connecting to API GW organization registration endpoint, ({ex}).\
140+
Response: ({response.text})"
141+
)
142+
except Exception as ex:
143+
raise CatalystwanException(f"Org registration to API-GW failed: {ex}")
144+
104145
def logout(self, client: APIEndpointClient) -> None:
105146
return None
106147

0 commit comments

Comments
 (0)