From 29e11d184c1219467cca68b327de13f3347a1441 Mon Sep 17 00:00:00 2001 From: jyejare Date: Tue, 30 Apr 2024 16:46:34 +0530 Subject: [PATCH] Translating URLs for Ipv6 --- conf/migrations.py | 1 - robottelo/config/__init__.py | 3 +++ robottelo/utils/__init__.py | 1 + robottelo/utils/url.py | 43 ++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/conf/migrations.py b/conf/migrations.py index b263fa352d6..e5ef283118e 100644 --- a/conf/migrations.py +++ b/conf/migrations.py @@ -8,7 +8,6 @@ """ from packaging.version import Version - from robottelo.logging import logger diff --git a/robottelo/config/__init__.py b/robottelo/config/__init__.py index cca2258c7e6..80a6d7bb0f4 100644 --- a/robottelo/config/__init__.py +++ b/robottelo/config/__init__.py @@ -10,6 +10,7 @@ from robottelo.config.validators import VALIDATORS from robottelo.logging import logger, robottelo_root_dir +from robottelo.utils.url import ipv6_hostname_translation if not os.getenv('ROBOTTELO_DIR'): # dynaconf robottelo file uses ROBOTELLO_DIR for screenshots @@ -44,6 +45,8 @@ def get_settings(): f'Dynaconf validation failed, continuing for the sake of unit tests\n{err}' ) + ipv6_hostname_translation(settings) + return settings diff --git a/robottelo/utils/__init__.py b/robottelo/utils/__init__.py index 0cf4020ca5a..1ece9e27bba 100644 --- a/robottelo/utils/__init__.py +++ b/robottelo/utils/__init__.py @@ -3,6 +3,7 @@ import base64 import re +from robottelo.logging import logger from cryptography.hazmat.backends import default_backend as crypto_default_backend from cryptography.hazmat.primitives import serialization as crypto_serialization from cryptography.hazmat.primitives.asymmetric import rsa diff --git a/robottelo/utils/url.py b/robottelo/utils/url.py index cadcfb56d14..239a2bd060f 100644 --- a/robottelo/utils/url.py +++ b/robottelo/utils/url.py @@ -1,4 +1,5 @@ from urllib.parse import urlparse +from robottelo.logging import logger def is_url(url): @@ -7,3 +8,45 @@ def is_url(url): return all([result.scheme, result.netloc]) except (ValueError, AttributeError): return False + + +def is_ipv4_url(text): + if isinstance(text, str) and 'ipv4' in text: + # Did not find the better way to filter only URLs so skipping it simple + # and open for reviewers suggestions + if 'redhat.com' in text: + return True + return False + + +def ipv6_translator(settings_list, setting_major, settings): + dotted_settings = '.'.join(setting_major) + for _key, _val in settings_list.items(): + if is_ipv4_url(_val): + settings.set(f'{dotted_settings}.{_key}', str(_val).replace('ipv4', 'ipv6')) + logger.debug(f'Setting translated to IPv6, Path: {dotted_settings}.{_key}') + elif type(_val) is list: + updated = False + new_list = _val + for i in range(len(new_list)): + if is_ipv4_url(new_list[i]): + new_list[i] = new_list[i].replace('ipv4', 'ipv6') + updated = True + if updated: + settings.set(f'{dotted_settings}.{_key}', new_list) + logger.debug(f'Setting translated to IPv6, Path: {dotted_settings}.{_key}') + elif type(_val) is dict: + new_setting_major = setting_major + [_key] + ipv6_translator(settings_list=_val, setting_major=new_setting_major, settings=settings) + + +def ipv6_hostname_translation(settings): + """Migrates any ipv4 containing hostname in conf to ipv6 hostname""" + settings_path = [] + if settings.server.is_ipv6: + all_settings = settings.loaded_by_loaders.items() + for loader_name, loader_settings in tuple(all_settings): + if loader_name.loader == 'yaml': + ipv6_translator(loader_settings, settings_path, settings) + else: + logger.debug('Ipv6 Hostname dynaconf migration hook is skipped for ipv4 testing')