Skip to content

Commit

Permalink
fix(apt): Allow forcibly updating apt
Browse files Browse the repository at this point in the history
This is required to configure apt when a dependency is not installed.

Co-authored-by: James Falcon <james.falcon@canonical.com>

Fixes canonicalGH-5223
  • Loading branch information
holmanb committed May 2, 2024
1 parent 9454e2f commit fb4ba98
Show file tree
Hide file tree
Showing 16 changed files with 36 additions and 37 deletions.
6 changes: 1 addition & 5 deletions cloudinit/config/cc_apt_configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -769,10 +769,6 @@ def add_apt_key(ent, cloud, gpg, hardened=False, file_name=None):
)


def update_packages(cloud):
cloud.distro.update_package_sources()


def add_apt_sources(
srcdict, cloud, gpg, template_params=None, aa_repo_match=None
):
Expand Down Expand Up @@ -856,7 +852,7 @@ def add_apt_sources(
LOG.exception("failed write to file %s: %s", sourcefn, detail)
raise

update_packages(cloud)
cloud.distro.update_package_sources(force=True)

return

Expand Down
4 changes: 2 additions & 2 deletions cloudinit/distros/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ def package_command(self, command, args=None, pkgs=None):
# managers.
raise NotImplementedError()

def update_package_sources(self):
def update_package_sources(self, *, force=False):
for manager in self.package_managers:
if not manager.available():
LOG.debug(
Expand All @@ -404,7 +404,7 @@ def update_package_sources(self):
)
continue
try:
manager.update_package_sources()
manager.update_package_sources(force=force)
except Exception as e:
LOG.error(
"Failed to update package using %s: %s", manager.name, e
Expand Down
6 changes: 3 additions & 3 deletions cloudinit/distros/alpine.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

from cloudinit import distros, helpers, subp, util
from cloudinit.distros.parsers.hostname import HostnameConf
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_INSTANCE, PER_ALWAYS

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -186,12 +186,12 @@ def package_command(self, command, args=None, pkgs=None):
# Allow the output of this to flow outwards (ie not be captured)
subp.subp(cmd, capture=False)

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources",
self.package_command,
["update"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)

@property
Expand Down
2 changes: 1 addition & 1 deletion cloudinit/distros/amazon.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ class Distro(rhel.Distro):
dhclient_lease_directory = "/var/lib/dhcp"
dhclient_lease_file_regex = r"dhclient-[\w-]+\.lease"

def update_package_sources(self):
def update_package_sources(self, *, force=False):
return None
9 changes: 6 additions & 3 deletions cloudinit/distros/arch.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from cloudinit.distros import PackageList
from cloudinit.distros.parsers.hostname import HostnameConf
from cloudinit.net.netplan import CLOUDINIT_NETPLAN_FILE
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -141,7 +141,10 @@ def package_command(self, command, args=None, pkgs=None):
# Allow the output of this to flow outwards (ie not be captured)
subp.subp(cmd, capture=False)

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources", self.package_command, ["-y"], freq=PER_INSTANCE
"update-sources",
self.package_command,
["-y"],
freq=PER_ALWAYS if force else PER_INSTANCE,
)
6 changes: 3 additions & 3 deletions cloudinit/distros/freebsd.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import cloudinit.distros.bsd
from cloudinit import subp, util
from cloudinit.distros.networking import FreeBSDNetworking
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -203,12 +203,12 @@ def _get_pkg_cmd_environ(self):
operations"""
return {"ASSUME_ALWAYS_YES": "YES"}

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources",
self.package_command,
["update"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)

@staticmethod
Expand Down
6 changes: 3 additions & 3 deletions cloudinit/distros/gentoo.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from cloudinit import distros, helpers, subp, util
from cloudinit.distros import PackageList
from cloudinit.distros.parsers.hostname import HostnameConf
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -132,10 +132,10 @@ def package_command(self, command, args=None, pkgs=None):
# Allow the output of this to flow outwards (ie not be captured)
subp.subp(cmd, capture=False)

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources",
self.package_command,
["--sync"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)
2 changes: 1 addition & 1 deletion cloudinit/distros/netbsd.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def _get_pkg_cmd_environ(self):
)
}

def update_package_sources(self):
def update_package_sources(self, *, force=False):
pass


Expand Down
6 changes: 3 additions & 3 deletions cloudinit/distros/opensuse.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from cloudinit.distros import PackageList
from cloudinit.distros import rhel_util as rhutil
from cloudinit.distros.parsers.hostname import HostnameConf
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -150,12 +150,12 @@ def set_timezone(self, tz):
# This ensures that the correct tz will be used for the system
util.copy(tz_file, self.tz_local_fn)

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources",
self.package_command,
["refresh"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)

def _read_hostname(self, filename, default=None):
Expand Down
6 changes: 3 additions & 3 deletions cloudinit/distros/package_management/apt.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
PackageManager,
UninstalledPackages,
)
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -108,12 +108,12 @@ def from_config(cls, runner: helpers.Runners, cfg: Mapping) -> "Apt":
def available(self) -> bool:
return bool(subp.which(self.apt_get_command[0]))

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self.runner.run(
"update-sources",
self.run_package_command,
["update"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)

@functools.lru_cache(maxsize=1)
Expand Down
2 changes: 1 addition & 1 deletion cloudinit/distros/package_management/package_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def available(self) -> bool:
"""Return if package manager is installed on system."""

@abstractmethod
def update_package_sources(self):
def update_package_sources(self, *, force=False):
...

@abstractmethod
Expand Down
2 changes: 1 addition & 1 deletion cloudinit/distros/package_management/snap.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class Snap(PackageManager):
def available(self) -> bool:
return bool(subp.which("snap"))

def update_package_sources(self):
def update_package_sources(self, *, force=False):
pass

def install_packages(self, pkglist: Iterable) -> UninstalledPackages:
Expand Down
6 changes: 3 additions & 3 deletions cloudinit/distros/photon.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from cloudinit import distros, helpers, net, subp, util
from cloudinit.distros import PackageList
from cloudinit.distros import rhel_util as rhutil
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -156,10 +156,10 @@ def package_command(self, command, args=None, pkgs=None):
if ret:
LOG.error("Error while installing packages: %s", err)

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources",
self.package_command,
["makecache"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)
6 changes: 3 additions & 3 deletions cloudinit/distros/rhel.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from cloudinit import distros, helpers, subp, util
from cloudinit.distros import PackageList, rhel_util
from cloudinit.distros.parsers.hostname import HostnameConf
from cloudinit.settings import PER_INSTANCE
from cloudinit.settings import PER_ALWAYS, PER_INSTANCE

LOG = logging.getLogger(__name__)

Expand Down Expand Up @@ -209,10 +209,10 @@ def package_command(self, command, args=None, pkgs=None):
# Allow the output of this to flow outwards (ie not be captured)
subp.subp(cmd, capture=False)

def update_package_sources(self):
def update_package_sources(self, *, force=False):
self._runner.run(
"update-sources",
self.package_command,
["makecache"],
freq=PER_INSTANCE,
freq=PER_ALWAYS if force else PER_INSTANCE,
)
2 changes: 1 addition & 1 deletion tests/unittests/config/test_apt_source_v1.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
class FakeDistro:
"""Fake Distro helper object"""

def update_package_sources(self):
def update_package_sources(self, *, force=False):
"""Fake update_package_sources helper method"""
return

Expand Down
2 changes: 1 addition & 1 deletion tests/unittests/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ def shutdown_command(self, *, mode, delay, message):
def package_command(self, command, args=None, pkgs=None):
pass

def update_package_sources(self):
def update_package_sources(self, *, force=False):
return (True, "yay")

def do_as(self, command, args=None, **kwargs):
Expand Down

0 comments on commit fb4ba98

Please sign in to comment.