From 4d85820f9b06b6f7dda7d6c843c1bd6cd32c0285 Mon Sep 17 00:00:00 2001 From: Felipe Reyes Date: Thu, 31 Jul 2025 18:43:07 -0400 Subject: [PATCH] Sync charm-helpers Change-Id: I7160ad3ac03c844f95352ba69c1139ba9005755e Signed-off-by: Felipe Reyes --- charmhelpers/contrib/network/ip.py | 18 ++++++++++++++++-- charmhelpers/contrib/openstack/context.py | 5 ++++- charmhelpers/core/host.py | 9 ++++++--- charmhelpers/fetch/ubuntu.py | 7 ++++--- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/charmhelpers/contrib/network/ip.py b/charmhelpers/contrib/network/ip.py index f3b4864f..14602661 100644 --- a/charmhelpers/contrib/network/ip.py +++ b/charmhelpers/contrib/network/ip.py @@ -134,6 +134,8 @@ def get_address_in_network(network, fallback=None, fatal=False): def is_ipv6(address): """Determine whether provided address is IPv6 or not.""" + if not address: + return False try: address = netaddr.IPAddress(address) except netaddr.AddrFormatError: @@ -467,9 +469,21 @@ def ns_query(address): return None try: - answers = dns.resolver.query(address, rtype) + resolv = dns.resolver.Resolver() + # The dnspython library sets a default DNS query lifetime of 5.0 seconds, + # as defined in BaseResolver.reset() (see https://github.com/rthalley/ + # dnspython/blob/7ed1648b/dns/resolver.py#L709, commit 7ed1648b). + resolv.lifetime = config('dns-query-timeout') or 5.0 + if hasattr(resolv, 'resolve'): + answers = resolv.resolve(address, rtype) + else: + answers = resolv.query(address, rtype) except (dns.resolver.NXDOMAIN, dns.resolver.NoNameservers): return None + except dns.exception.Timeout: + log("DNS query timed out for address {} with rtype {} and timeout " + "{}".format(address, rtype, resolv.lifetime), level=WARNING) + return None if answers: return str(answers[0]) @@ -618,7 +632,7 @@ def get_relation_ip(interface, cidr_network=None): # Currently IPv6 has priority, eventually we want IPv6 to just be # another network space. assert_charm_supports_ipv6() - return get_ipv6_addr()[0] + return get_ipv6_addr(dynamic_only=False)[0] elif cidr_network: # If a specific CIDR network is passed get the address from that # network. diff --git a/charmhelpers/contrib/openstack/context.py b/charmhelpers/contrib/openstack/context.py index cd70b55c..9082348b 100644 --- a/charmhelpers/contrib/openstack/context.py +++ b/charmhelpers/contrib/openstack/context.py @@ -25,7 +25,10 @@ import socket import time from base64 import b64decode -from distutils.version import LooseVersion +try: + from distutils.version import LooseVersion +except ImportError: + from looseversion import LooseVersion from subprocess import ( check_call, check_output, diff --git a/charmhelpers/core/host.py b/charmhelpers/core/host.py index def403c5..8371daac 100644 --- a/charmhelpers/core/host.py +++ b/charmhelpers/core/host.py @@ -357,7 +357,7 @@ def init_is_systemd(service_name=None): return os.path.isdir(SYSTEMD_SYSTEM) -def adduser(username, password=None, shell='/bin/bash', +def adduser(username, password=None, shell=None, system_user=False, primary_group=None, secondary_groups=None, uid=None, home_dir=None): """Add a user to the system. @@ -389,11 +389,14 @@ def adduser(username, password=None, shell='/bin/bash', if home_dir: cmd.extend(['--home', str(home_dir)]) if system_user or password is None: - cmd.append('--system') + cmd.extend([ + '--system', + '--shell', shell if shell else '/usr/sbin/nologin' + ]) else: cmd.extend([ '--create-home', - '--shell', shell, + '--shell', shell if shell else '/bin/bash', '--password', password, ]) if not primary_group: diff --git a/charmhelpers/fetch/ubuntu.py b/charmhelpers/fetch/ubuntu.py index fdcad025..0b2f229d 100644 --- a/charmhelpers/fetch/ubuntu.py +++ b/charmhelpers/fetch/ubuntu.py @@ -341,7 +341,7 @@ UBUNTU_OPENSTACK_RELEASE = OrderedDict([ ]) -APT_NO_LOCK = 100 # The return code for "couldn't acquire lock" in APT. +APT_ERROR_CODE = 100 # The return code for APT errors. CMD_RETRY_DELAY = 10 # Wait 10 seconds between command retries. CMD_RETRY_COUNT = 10 # Retry a failing fatal command X times. @@ -464,6 +464,8 @@ def apt_upgrade(options=None, fatal=False, dist=False): def apt_update(fatal=False): """Update local apt cache.""" cmd = ['apt-get', 'update'] + if fatal: + cmd.append("--error-on=any") _run_apt_command(cmd, fatal) @@ -1021,8 +1023,7 @@ def _run_apt_command(cmd, fatal=False, quiet=False): """ if fatal: _run_with_retries( - cmd, retry_exitcodes=(1, APT_NO_LOCK,), - retry_message="Couldn't acquire DPKG lock", + cmd, retry_exitcodes=(1, APT_ERROR_CODE,), quiet=quiet) else: kwargs = {}