@@ -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