apt-ostree/apt_ostree/packages.py
Lindley Vieira fe0404eae9 Update summary in apt-ostree repos
When ostree changes a repository it requires a summary update for
the changes to be seen by clients of this remote repository.

This commit adds summary update call after every change in the repo.

Test Plan:
PASS: Deploy a host after a deploy start to apply
PASS: Undeploy a host after a deploy start to remove
PASS: Undeploy a host after an abort

Story: 2010676
Task: 51017

Change-Id: I276fd823b81db8c66cb0c83f8ab19f963d182bf0
Signed-off-by: Lindley Vieira <lindley.vieira@windriver.com>
2024-09-24 11:26:49 -03:00

193 lines
6.0 KiB
Python

"""
Copyright (c) 2023-2024 Wind River Systems, Inc.
SPDX-License-Identifier: Apache-2.0
"""
import logging
import sys
from rich.console import Console
from apt_ostree.apt import Apt
from apt_ostree.deploy import Deploy
from apt_ostree.ostree import Ostree
class Packages:
def __init__(self, state):
self.console = Console()
self.logging = logging.getLogger(__name__)
self.state = state
self.apt = Apt(self.state)
self.ostree = Ostree(self.state)
self.deploy = Deploy(self.state)
def install(self, packages, feed=None, component=None):
"""Use apt to install Debian packages."""
deps = set()
predeps = set()
all_deps = set()
rootfs = self.deploy.get_sysroot()
if not rootfs.exists():
self.logging.error("Unable to determine rootfs: {rootfs}")
sys.exit(1)
# Step 0 - Run the prestaging steps.
self.deploy.prestaging(rootfs, feed, component)
# Step 1 - Update the package cache in the deployment.
self.apt.apt_update(rootfs)
cache = self.apt.cache(rootfs)
# Step 2 - Check to see if the packages are valid.
packages = self.apt.check_valid_packages(cache, packages)
if len(packages) == 0:
self.logging.error("No valid packages found.")
sys.exit(1)
# Step 3 - Generate the commit message.
commit = "New packages installed: \n\n"
for pkg in packages:
version = self.apt.get_version(cache, pkg)
commit += f"- {pkg} ({version})\n"
deps = self.apt.get_dependencies(
cache, packages, deps, predeps, all_deps)
if len(deps) == 0:
commit += "\nNo new dependencies found."
else:
commit += "\nNew Dependencies: \n\n"
for dep in deps:
version = self.apt.get_version(cache, dep)
commit += f"- {dep} ({version})\n"
# Step 4 - Install the valid packages.
self.apt.apt_install(cache, packages, rootfs)
# Step 5 - Run post staging steps.
self.deploy.poststaging(rootfs)
# Step 6 - Ostree commit.
self.logging.info(
f"Commiting to {self.ostree.get_branch()}. Please wait.")
self.ostree.ostree_commit(
root=str(rootfs),
branch=self.ostree.get_branch(),
repo=self.state.repo,
subject="New packages",
msg=commit,
)
self.ostree.ostree_summary_update(self.state.repo)
# Step 7 - Cleanup
self.deploy.cleanup(rootfs)
def upgrade(self, feed):
"""Use apt to install Debian packages."""
rootfs = self.deploy.get_sysroot()
if not rootfs.exists():
self.logging.error("Unable to determine rootfs: {rootfs}")
sys.exit(1)
# Step 0 - Setup prestaging.
self.deploy.prestaging(rootfs, feed)
# Step 1 - Update the package cache.
self.apt.apt_update(rootfs)
cache = self.apt.cache(rootfs)
# Step 2 - Check for updates.
self.logging.info(
"Checking for upgradable packages."
)
# Fake upgrading so we can determine the packages
# that need to be upgraded. This is done so we
# can check for any updates before doing anything
# else.
cache.upgrade(False)
packages = [package.name for package in cache.get_changes()]
if len(packages) == 0:
self.logging.error("No package to upgrade.")
sys.exit(1)
# Step 3 - Build the commit message
r = self.apt.apt_list(rootfs, "--upgradable")
commit = "Packages upgraded: \n\n"
for line in r.stdout.splitlines():
line = line.decode("utf-8").strip()
if line != "Listing...":
columns = line.split(" ")
name, repo = columns[0].split("/")
current = columns[5][:-1]
update = columns[1]
commit += f"- {name} ({current} -> {update})\n"
# Step 4 - Do the upgrade.
self.apt.apt_upgrade(rootfs)
# Step 5 - Poststaging.
self.deploy.poststaging(rootfs)
# Step 6 - Commit to the repo
self.logging.info(
f"Commiting to {self.ostree.get_branch()}. Please wait.")
self.ostree.ostree_commit(
root=str(rootfs),
branch=self.ostree.get_branch(),
repo=self.state.repo,
subject="Package Upgrade",
msg=commit,
)
self.ostree.ostree_summary_update(self.state.repo)
# Step 7 - Cleanup
self.deploy.cleanup(rootfs)
def uninstall(self, packages):
"""Use apt to uninstall Debian packages."""
rootfs = self.deploy.get_sysroot()
if not rootfs.exists():
self.logging.error("Unable to determine rootfs: {rootfs}")
sys.exit(1)
# Step 0 - Run the prestaging steps.
self.deploy.prestaging(rootfs)
# Step 1 - Update the package cache in the deployment.
self.apt.apt_update(rootfs)
cache = self.apt.cache(rootfs)
# Step 3 - Check for package depenendencies so we can
# generate a commit message at the end.
commit = "Packages uninstalled: \n\n"
for pkg in packages:
version = self.apt.get_version(cache, pkg)
commit += f"- {pkg} ({version})\n"
# Step 4 - Uninstall the valid packages.
self.apt.apt_uninstall(packages, rootfs)
# Step 5 - Run poststaging steps.
self.deploy.poststaging(rootfs)
# Step 6 - Ostree commit.
self.logging.info(
f"Commiting to {self.ostree.get_branch()}. Please wait.")
self.ostree.ostree_commit(
root=str(rootfs),
branch=self.ostree.get_branch(),
repo=self.state.repo,
subject="Uninstall packages",
msg=commit,
)
self.ostree.ostree_summary_update(self.state.repo)
# Step 7 - Cleanup
self.deploy.cleanup(rootfs)