Skip to content

Commit

Permalink
Translating URLs for Ipv6
Browse files Browse the repository at this point in the history
  • Loading branch information
jyejare committed May 6, 2024
1 parent 4dd7ff5 commit a939288
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
3 changes: 3 additions & 0 deletions robottelo/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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


Expand Down
44 changes: 44 additions & 0 deletions robottelo/utils/url.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,53 @@
from urllib.parse import urlparse

from robottelo.logging import logger


def is_url(url):
try:
result = urlparse(url)
return all([result.scheme, result.netloc])
except (ValueError, AttributeError):
return False


def is_ipv4_url(text):
# Did not find the better way to filter only URLs so skipping it simple
# and open for reviewers suggestions
if isinstance(text, str) and 'ipv4' in text and 'redhat.com' in text:
return True
return False


def ipv6_translator(settings_list, setting_major, settings):
"""Translates the hostname containing ipv4 to ipv6 and updates the settings object"""
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 isinstance(_val, 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 isinstance(_val, 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')
4 changes: 1 addition & 3 deletions tests/foreman/installer/test_installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,7 @@ def sat_non_default_install(module_sat_ready_rhels):
install_satellite(module_sat_ready_rhels[1], installer_args, enable_fapolicyd=True)
sat = module_sat_ready_rhels[1]
http_proxy = sat.enable_ipv6_http_proxy()
sat.execute(
'dnf -y --disableplugin=foreman-protector install foreman-discovery-image'
)
sat.execute('dnf -y --disableplugin=foreman-protector install foreman-discovery-image')
yield sat
sat.disable_ipv6_http_proxy(http_proxy)

Expand Down

0 comments on commit a939288

Please sign in to comment.