88from django .db import transaction
99import urllib3
1010
11- from backend .apps .clusters .encryption import decrypt_value
11+ from backend .apps .clusters .encryption import decrypt_value , encrypt_value
1212from backend .apps .clusters .models import (
1313 ClusterSyncData ,
1414 ClusterSyncStatus ,
@@ -84,8 +84,47 @@ def headers(self):
8484 'Accept' : 'application/json' ,
8585 }
8686
87- def execute_get_one (self , url , timeout = None ):
88- logger .info (f'Executing GET request to { url } ' )
87+ def _reauth (self , timeout = None ):
88+ url = f'{ self .cluster .base_url } /api/o/token/' # TODO AAP version
89+ refresh_token = decrypt_value (self .cluster .refresh_token )
90+ client_id = self .cluster .client_id
91+ client_secret = decrypt_value (self .cluster .client_secret )
92+
93+ data = {
94+ 'grant_type' : 'refresh_token' ,
95+ 'refresh_token' : refresh_token ,
96+ }
97+ headers = {
98+ 'Content-Type' : 'application/x-www-form-urlencoded' ,
99+ 'Accept' : 'application/json' ,
100+ }
101+ auth = requests .auth .HTTPBasicAuth (client_id , client_secret )
102+ try :
103+ response = requests .post (
104+ url = url ,
105+ data = data ,
106+ auth = auth ,
107+ verify = self .cluster .verify_ssl ,
108+ timeout = timeout if timeout is not None else self .timeout ,
109+ headers = headers )
110+ except requests .exceptions .RequestException as e :
111+ logger .error (f'Token refresh POST request failed with exception { e } ' )
112+ return False
113+ if not response .ok :
114+ logger .error (f'Token refresh POST request failed with status { response .status_code } text={ response .json ()} ' )
115+ return False
116+ logger .info (f'Token refresh POST request succedded with status { response .status_code } ' )
117+ resp = response .json ()
118+
119+ self .cluster .access_token = encrypt_value (resp ['access_token' ])
120+ self .cluster .refresh_token = encrypt_value (resp ["refresh_token" ])
121+ self .access_token = resp ['access_token' ]
122+ self .cluster .save ()
123+
124+ return True
125+
126+ def _get_with_reauth (self , url , timeout = None ):
127+ # try 1st time
89128 try :
90129 response = requests .get (
91130 url = url ,
@@ -95,8 +134,32 @@ def execute_get_one(self, url, timeout=None):
95134 except requests .exceptions .RequestException as e :
96135 logger .error (f'GET request failed with exception { e } ' )
97136 return None
98- if not response .ok :
99- logger .error (f'GET request failed with status { response .status_code } ' )
137+ if response .ok :
138+ return response
139+
140+ # Try to re-auth only after 401 error
141+ logger .error (f'GET request failed with status { response .status_code } ' )
142+ if response .status_code != 401 :
143+ return response
144+ self ._reauth ()
145+
146+ # try 2nd time
147+ try :
148+ response = requests .get (
149+ url = url ,
150+ verify = self .cluster .verify_ssl ,
151+ timeout = timeout if timeout is not None else self .timeout ,
152+ headers = self .headers )
153+ except requests .exceptions .RequestException as e :
154+ logger .error ( f'GET request failed with exception { e } ' )
155+ return None
156+ logger .error (f'GET after reauth response.status_code={ response .status_code } ' )
157+ return response
158+
159+ def execute_get_one (self , url , timeout = None ):
160+ logger .info (f'Executing GET request to { url } ' )
161+ response = self ._get_with_reauth (url , timeout = timeout )
162+ if response is None or not response .ok :
100163 return None
101164 product_name = response .headers .get ("X-Api-Product-Name" , None )
102165 if product_name is None or product_name == "AWX" :
@@ -228,13 +291,15 @@ def check_aap_version(self):
228291 if self .cluster .aap_version != ClusterVersionChoices .AAP25 :
229292 self .cluster .aap_version = ClusterVersionChoices .AAP25
230293 self .cluster .save ()
294+ logger .info (f'Detected AAP version 2.5 at { self .cluster .base_url } ' )
231295 return True
232296
233297 is_aap24_instance = self .is_aap24_instance
234298 if is_aap24_instance :
235299 if self .cluster .aap_version != ClusterVersionChoices .AAP24 :
236300 self .cluster .aap_version = ClusterVersionChoices .AAP24
237301 self .cluster .save ()
302+ logger .info (f'Detected AAP version 2.4 at { self .cluster .base_url } ' )
238303 return True
239304 raise Exception (f'Not valid version for cluster { self .cluster .base_url } .' )
240305
0 commit comments