|
7 | 7 | import requests |
8 | 8 | from django.db import transaction |
9 | 9 | import urllib3 |
| 10 | +import json |
10 | 11 |
|
11 | 12 | from backend.apps.clusters.encryption import decrypt_value, encrypt_value |
12 | 13 | from backend.apps.clusters.models import ( |
@@ -85,7 +86,7 @@ def headers(self): |
85 | 86 | } |
86 | 87 |
|
87 | 88 | def _reauth(self, timeout=None): |
88 | | - url = f'{self.cluster.base_url}/api/o/token/' # TODO AAP version |
| 89 | + url = f'{self.cluster.base_url}{self.cluster.oauth_token_url}' |
89 | 90 | refresh_token = decrypt_value(self.cluster.refresh_token) |
90 | 91 | client_id = self.cluster.client_id |
91 | 92 | client_secret = decrypt_value(self.cluster.client_secret) |
@@ -270,39 +271,48 @@ def sync_common(self, sync_type): |
270 | 271 | def ping(self, ping_url): |
271 | 272 | logger.info(f'Pinging api {self.cluster.base_url}{ping_url}') |
272 | 273 | url = f'{self.cluster.base_url}{ping_url}' |
273 | | - return self.execute_get_one(url=url, timeout=5) |
| 274 | + # Do same as execute_get_one(), but without authentication. |
| 275 | + # ping is used to check version before token refresh, so we might not have a valid access token yet. |
| 276 | + # ping endpoint does not required authentication, but (AAP 2.6 at least): |
| 277 | + # - request is rejected if invalid HTTP basic auth is provided. |
| 278 | + # - request is accepted if invalid 'Authorization: Bearer ...' is provided. |
| 279 | + timeout = 5 |
| 280 | + response = requests.get( |
| 281 | + url=url, |
| 282 | + verify=self.cluster.verify_ssl, |
| 283 | + timeout=timeout, |
| 284 | + headers=self.headers) |
| 285 | + if response is None or not response.ok: |
| 286 | + return None |
| 287 | + response = response.json() |
| 288 | + return response |
274 | 289 |
|
275 | | - @property |
276 | | - def is_aap25_instance(self): |
277 | | - logger.info(f'Checking if is AAP 2.5 at {self.cluster.base_url}') |
278 | | - response = self.ping("/api/gateway/v1/ping/") |
279 | | - return True if response is not None else False |
| 290 | + def detect_aap_version(self): |
| 291 | + logger.info(f'Checking if is AAP 2.5 ... 2.6 at {self.cluster.base_url}') |
| 292 | + response25 = self.ping("/api/gateway/v1/ping/") |
| 293 | + if response25: |
| 294 | + if response25["version"] == "2.6": |
| 295 | + return ClusterVersionChoices.AAP26 |
| 296 | + elif response25["version"] == "2.5": |
| 297 | + return ClusterVersionChoices.AAP25 |
| 298 | + else: |
| 299 | + raise Exception(f'Not valid version {response25["version"]} for cluster {self.cluster.base_url}.') |
280 | 300 |
|
281 | | - @property |
282 | | - def is_aap24_instance(self): |
283 | 301 | logger.info(f'Checking if is AAP 2.4 at {self.cluster.base_url}') |
284 | | - response = self.ping("/api/v2/ping/") |
285 | | - return True if response is not None else False |
| 302 | + response24 = self.ping("/api/v2/ping/") |
| 303 | + if response24: |
| 304 | + return ClusterVersionChoices.AAP24 |
286 | 305 |
|
287 | | - def check_aap_version(self): |
288 | | - logger.info(f'Checking AAP version at {self.cluster.base_url}') |
289 | | - is_aap25_instance = self.is_aap25_instance |
290 | | - if is_aap25_instance: |
291 | | - if self.cluster.aap_version != ClusterVersionChoices.AAP25: |
292 | | - self.cluster.aap_version = ClusterVersionChoices.AAP25 |
293 | | - self.cluster.save() |
294 | | - logger.info(f'Detected AAP version 2.5 at {self.cluster.base_url}') |
295 | | - return True |
296 | | - |
297 | | - is_aap24_instance = self.is_aap24_instance |
298 | | - if is_aap24_instance: |
299 | | - if self.cluster.aap_version != ClusterVersionChoices.AAP24: |
300 | | - self.cluster.aap_version = ClusterVersionChoices.AAP24 |
301 | | - self.cluster.save() |
302 | | - logger.info(f'Detected AAP version 2.4 at {self.cluster.base_url}') |
303 | | - return True |
304 | 306 | raise Exception(f'Not valid version for cluster {self.cluster.base_url}.') |
305 | 307 |
|
| 308 | + def check_aap_version(self): |
| 309 | + aap_version = self.detect_aap_version() |
| 310 | + if self.cluster.aap_version != aap_version: |
| 311 | + self.cluster.aap_version = aap_version |
| 312 | + self.cluster.save() |
| 313 | + logger.info(f'Detected AAP version {aap_version} at {self.cluster.base_url}') |
| 314 | + return True |
| 315 | + |
306 | 316 | def sync_jobs(self): |
307 | 317 | for job in self.jobs: |
308 | 318 | logger.info("Checking status of job %s", job) |
|
0 commit comments