Change the way base ostree repository is handle

This change now allows the user to specify the ostree repository he
wishes to use as base for the pre-patched ISO.

Test plan:
    PASS: Build pre-patched ISO with default ostree repository
    PASS: Build pre-patched ISO with specific ostree repository

Partial-Bug: 2090871

Change-Id: I52845b2a633b30f3407a3e2a65edd2ba088b63c7
Signed-off-by: Dostoievski Batista <dostoievski.albinobatista@windriver.com>
This commit is contained in:
Dostoievski Batista 2024-12-03 16:44:49 -03:00 committed by Dostoievski Albino Batista
parent 1c4e9f3a48
commit 4d731b86dd

View File

@ -18,6 +18,7 @@ import argparse
import glob
import logging
import os
import re
import shutil
import subprocess
import sys
@ -35,6 +36,7 @@ LAT_SDK_SYSROOT = "/opt/LAT/SDK/sysroots/x86_64-wrlinuxsdk-linux"
MYUNAME = os.environ.get('MYUNAME')
PROJECT = os.environ.get('PROJECT')
FEED_PATH = f"/localdisk/loadbuild/{MYUNAME}/{PROJECT}/patches_feed"
DEPLOY_DIR = os.environ.get('DEPLOY_DIR')
logger = logging.getLogger('create-prepatched-iso')
@ -290,6 +292,27 @@ def update_metadata_info(metadata, iso_path):
# Save metadata file changes
tree.write(metadata)
def clean_ostree(ostree_repo_path):
'''
This function takes an ostree repository path as input and deletes all
commits in that repository except for the latest one.
:param ostree_repo_path: Path to the ostree repository
'''
cmd = f"ostree --repo='{ostree_repo_path}' log starlingx"
repo_history = subprocess.check_output(cmd, shell=True).decode(sys.stdout.encoding)
commits = re.findall(pattern=r"^commit\s*(.*)", string=repo_history, flags=re.MULTILINE)
# Delete each commit except the latest one
for commit in commits[1:]:
cmd = f"ostree --repo='{ostree_repo_path}' prune --delete-commit='{commit}'"
_ = subprocess.check_output(cmd, shell=True).decode(sys.stdout.encoding)
cmd = ["ostree", "summary", "--update", f"--repo={ostree_repo_path}"]
logger.debug('Running command: %s', cmd)
subprocess.check_call(cmd, shell=False)
def main():
parser = argparse.ArgumentParser(description="Create a valid StarlingX ISO with patches \
already applied.",
@ -309,6 +332,9 @@ def main():
required=True)
parser.add_argument('-v','--verbose',action='store_true',
help="Active debug logging")
parser.add_argument('-b','--base',type=str,
help="Full path to ostree repository to be used as base to the \
pre-patched iso. Default value is: $DEPLOY_DIR/ostree_repo")
args = parser.parse_args()
@ -329,6 +355,12 @@ def main():
if not os.path.isfile(patch):
logger.error(f"Patch file {patch} doesn't exist, please input a valid file.")
sys.exit(1)
path_ostree_repo = f"{DEPLOY_DIR}/ostree_repo"
if args.base:
path_ostree_repo = args.base
if not os.path.isdir(f"{path_ostree_repo}"):
logger.error("Not able to find %s folder.", path_ostree_repo)
sys.exit(1)
# Check if env variables are correctly set
if not MYUNAME:
@ -352,8 +384,8 @@ def main():
mount_iso(args.iso, mnt_folder)
logger.info('Copying all files from %s to %s', mnt_folder, iso_folder)
# Copy all files from the mount point to the iso temporary folder
cmd = ["rsync", "-a", f'{mnt_folder}/', iso_folder]
# Copy all files, except ostree_repo, from the mount point to the iso temporary folder
cmd = ["rsync", "-a", "--exclude", "ostree_repo/", f'{mnt_folder}/', iso_folder]
logger.debug('Running command: %s', cmd)
subprocess.check_call(cmd, shell=False)
@ -363,6 +395,12 @@ def main():
# Change permissions on iso folder so we can update the files
os.chmod(iso_folder, 0o777)
# Copy the base ostree repository to the iso folder
logger.info('Copying ostree repository...')
cmd = ["rsync", "-a", f'{path_ostree_repo}/', f"{iso_folder}/ostree_repo"]
logger.debug('Running command: %s', cmd)
subprocess.check_call(cmd, shell=False)
# We initiate a reprepo feed in loadbuild because we need to access it
# through a http service
logger.info(f'Setting up package feed in {FEED_PATH}')
@ -490,7 +528,9 @@ def main():
logger.debug('Running command: %s', cmd)
subprocess.check_call(cmd, shell=False)
# TODO(dalbinob): Remember to copy only the latest ostree commit
# Keep only the latest commit in ostree_repo to save storage space
clean_ostree(f"{iso_folder}/ostree_repo")
# Now we get the label and re create the ISO with the new ostree
logger.info('Creating new .iso file...')
instlabel = get_label_from_isolinux_cfg(f"{iso_folder}/isolinux/isolinux.cfg")