Software upload: create pxeboot versioned dir

Details: This commit is to create pxeboot versioned directory.
It combines the lengacy functionalities of import.sh and
upgrade-start-pkg-extract scripts that setup to-release
pxeboot files.

Test Plan:

PASS: software upload and pxeboot files are in place

Task: 48999
Story: 2010676
Change-Id: I16cb7fa5e2e7bbe5784b9bb4c75ca596a54e9e8e
Signed-off-by: junfeng-li <junfeng.li@windriver.com>
This commit is contained in:
junfeng-li
2023-10-26 21:06:29 +00:00
parent e222c1b9dc
commit 22f76f53ef
3 changed files with 109 additions and 31 deletions

View File

@@ -101,10 +101,7 @@ PATCH_EXTENSION = ".patch"
SUPPORTED_UPLOAD_FILE_EXT = [ISO_EXTENSION, SIG_EXTENSION, PATCH_EXTENSION] SUPPORTED_UPLOAD_FILE_EXT = [ISO_EXTENSION, SIG_EXTENSION, PATCH_EXTENSION]
SCRATCH_DIR = "/scratch" SCRATCH_DIR = "/scratch"
RELEASE_METADATA_FILE = "STX_%s_GA-metadata.xml" RELEASE_METADATA_FILE = "STX_%s_GA-metadata.xml"
VAR_PXEBOOT_DIR = "/var/pxeboot"
CONTROLLER_HOSTNAME = 'controller'
CONTROLLER_0_HOSTNAME = '%s-0' % CONTROLLER_HOSTNAME
CONTROLLER_1_HOSTNAME = '%s-1' % CONTROLLER_HOSTNAME
# Precheck constants # Precheck constants
LICENSE_FILE = "/etc/platform/.license" LICENSE_FILE = "/etc/platform/.license"

View File

@@ -11,6 +11,7 @@ sys.modules['osprofiler'] = None
import configparser import configparser
import gc import gc
import glob
import json import json
import os import os
import select import select
@@ -58,6 +59,7 @@ from software.software_functions import ReleaseData
from software.release_verify import verify_files from software.release_verify import verify_files
import software.config as cfg import software.config as cfg
import software.utils as utils import software.utils as utils
import re
import software.messages as messages import software.messages as messages
import software.constants as constants import software.constants as constants
@@ -1004,30 +1006,8 @@ class PatchController(PatchService):
raise UpgradeNotSupported("Current release %s not supported to upgrade to %s" raise UpgradeNotSupported("Current release %s not supported to upgrade to %s"
% (SW_VERSION, to_release)) % (SW_VERSION, to_release))
# After successful validation, copy metadata.xml to /opt/software/metadata/available LOG.info("Start to import iso file %s", iso_file)
os.makedirs(constants.AVAILABLE_DIR, exist_ok=True) threading.Thread(target=self._import_iso, args=(iso_mount_dir, to_release, release_data))
stx_release_metadata_file = "STX_%s_GA-metadata.xml" % to_release
abs_stx_release_metadata_file = os.path.join(iso_mount_dir,
'upgrades',
stx_release_metadata_file)
# Copy stx release metadata.xml to available metadata dir
shutil.copyfile(abs_stx_release_metadata_file,
os.path.join(constants.AVAILABLE_DIR, stx_release_metadata_file))
LOG.info("Copied %s to %s", abs_stx_release_metadata_file, constants.AVAILABLE_DIR)
# Copy the iso file to /var/www/pages/feed/rel-<release>
os.makedirs(constants.FEED_OSTREE_BASE_DIR, exist_ok=True)
to_release_iso_dir = os.path.join(constants.FEED_OSTREE_BASE_DIR, ("rel-%s" % to_release))
shutil.copytree(iso_mount_dir, to_release_iso_dir)
LOG.info("Copied iso file %s to %s", iso_file, to_release_iso_dir)
# Update the release metadata
release_data.parse_metadata(abs_stx_release_metadata_file, state=constants.AVAILABLE)
LOG.info("Updated release metadata for %s", to_release)
# Unmount the iso file.
unmount_iso_load(iso_mount_dir)
except ReleaseValidationFailure: except ReleaseValidationFailure:
msg = "Upgrade file signature verification failed" msg = "Upgrade file signature verification failed"
@@ -1048,6 +1028,101 @@ class PatchController(PatchService):
local_error += msg + "\n" local_error += msg + "\n"
return local_info, local_warning, local_error return local_info, local_warning, local_error
def _import_iso(self, iso_mount_dir, to_release, release_data):
'''
Import the iso file
:param iso_mount_dir: iso mount directory
:param to_release: to release version
:param release_data: ReleaseData object
'''
try:
# After successful validation, copy metadata.xml to /opt/software/metadata/available
os.makedirs(constants.AVAILABLE_DIR, exist_ok=True)
stx_release_metadata_file = "STX_%s_GA-metadata.xml" % to_release
abs_stx_release_metadata_file = os.path.join(iso_mount_dir,
'upgrades',
stx_release_metadata_file)
# Copy stx release metadata.xml to available metadata dir
shutil.copyfile(abs_stx_release_metadata_file,
os.path.join(constants.AVAILABLE_DIR, stx_release_metadata_file))
LOG.info("Copied %s to %s", abs_stx_release_metadata_file, constants.AVAILABLE_DIR)
# Copy the iso file to /var/www/pages/feed/rel-<release>
os.makedirs(constants.FEED_OSTREE_BASE_DIR, exist_ok=True)
to_release_feed_dir = os.path.join(constants.FEED_OSTREE_BASE_DIR, ("rel-%s" % to_release))
shutil.copytree(iso_mount_dir, to_release_feed_dir, dirs_exist_ok=True)
LOG.info("Copied iso file %s to %s", "iso_file", to_release_feed_dir)
# Copy install_uuid to /var/www/pages/feed/rel-<release>
from_release_feed_dir = os.path.join(constants.FEED_OSTREE_BASE_DIR, ("rel-%s" % SW_VERSION))
shutil.copyfile(os.path.join(from_release_feed_dir, "install_uuid"),
os.path.join(to_release_feed_dir, "install_uuid"))
# Copy pxeboot-update-${SW_VERSION}.sh to from-release feed /upgrades
from_release_iso_upgrades_dir = os.path.join(from_release_feed_dir, "upgrades")
os.makedirs(from_release_iso_upgrades_dir, exist_ok=True)
shutil.copyfile(os.path.join("etc", "pxeboot-update-%s.sh" % SW_VERSION),
os.path.join(from_release_iso_upgrades_dir, "pxeboot-update-%s.sh" % SW_VERSION))
# Copy pxelinux.cfg.files to from-release feed /pxeboot
from_release_feed_pxeboot_dir = os.path.join(from_release_feed_dir, "pxeboot")
os.makedirs(from_release_feed_pxeboot_dir, exist_ok=True)
# Find from-release pxelinux.cfg.files
pxe_dir = os.path.join(constants.VAR_PXEBOOT_DIR, "pxelinux.cfg.files")
from_release_pxe_files = glob.glob(os.path.join(pxe_dir, 'SW_VERSION$'))
for from_release_pxe_file in from_release_pxe_files:
if os.path.isfile(from_release_pxe_file):
shutil.copyfile(from_release_pxe_file, os.path.join(from_release_feed_pxeboot_dir,
os.path.basename(from_release_pxe_file)))
# Converted from upgrade package extraction script
shutil.copyfile(os.path.join(to_release_feed_dir, "kickstart", "kickstart.cfg"),
os.path.join(to_release_feed_dir, "kickstart.cfg"))
# Copy bzImage and initrd
bzimage_files = bzimage_files = glob.glob(os.path.join(to_release_feed_dir, 'pxeboot', 'bzImage*'))
for bzimage_file in bzimage_files:
if os.path.isfile(bzimage_file):
shutil.copyfile(bzimage_file, os.path.join(constants.PXEBOOT_DIR,
os.path.basename(bzimage_file)))
initrd_files = glob.glob(os.path.join(to_release_feed_dir, 'pxeboot', 'initrd*'))
for initrd_file in initrd_files:
if os.path.isfile(initrd_file):
shutil.copyfile(initrd_file, os.path.join(constants.PXEBOOT_DIR,
os.path.basename(initrd_file)))
# Copy to_release_feed/pxelinux.cfg.files to /var/pxeboot/pxelinux.cfg.files
pxeboot_cfg_files = glob.glob(os.path.join(to_release_feed_dir, 'pxeboot', 'pxelinux.cfg.files',
'SW_VERSION$'))
for pxeboot_cfg_file in pxeboot_cfg_files:
if os.path.isfile(pxeboot_cfg_file):
shutil.copyfile(pxeboot_cfg_file, os.path.join(constants.PXEBOOT_DIR, 'pxelinux.cfg.files',
os.path.basename(pxeboot_cfg_file)))
# Copy pxeboot-update.sh to /etc
pxeboot_update_filename = "pxeboot-update-%s.sh" % to_release
shutil.copyfile(os.path.join(to_release_feed_dir, "upgrade", pxeboot_update_filename),
os.path.join("etc", pxeboot_update_filename))
# Update the release metadata
release_data.parse_metadata(abs_stx_release_metadata_file, state=constants.AVAILABLE)
LOG.info("Updated release metadata for %s", to_release)
# Unmount the iso file.
unmount_iso_load(iso_mount_dir)
except Exception as e:
msg = "Failed to import iso"
LOG.exception(msg)
local_error += msg + "\n"
def _process_upload_patch_files(self, patch_files): def _process_upload_patch_files(self, patch_files):
''' '''

View File

@@ -159,7 +159,9 @@ def save_temp_file(file_item, temp_dir=constants.SCRATCH_DIR):
try: try:
if not os.path.exists(temp_dir): if not os.path.exists(temp_dir):
shutil.rmtree(temp_dir, ignore_errors=True) shutil.rmtree(temp_dir, ignore_errors=True)
os.makedirs(temp_dir) os.makedirs(temp_dir, mode=0o755)
LOG.info("Created directory %s with free space %s bytes",
temp_dir, shutil.disk_usage(temp_dir).free)
except Exception: except Exception:
raise Exception("Failed to create directory {}".format(temp_dir)) raise Exception("Failed to create directory {}".format(temp_dir))
@@ -172,14 +174,18 @@ def save_temp_file(file_item, temp_dir=constants.SCRATCH_DIR):
LOG.error("Not enough space to save file %s in %s \n \ LOG.error("Not enough space to save file %s in %s \n \
Available %s bytes. File size %s", file_name, temp_dir, avail_space, file_size) Available %s bytes. File size %s", file_name, temp_dir, avail_space, file_size)
except Exception: except Exception:
LOG.exception("Failed to get file size in bytes for %s or disk space for %s", file_item, temp_dir) msg = "Failed to get file size in bytes for {} or disk space for {}".format(file_item, temp_dir)
LOG.exception(msg)
raise Exception(msg)
saved_file = os.path.join(temp_dir, os.path.basename(file_name)) saved_file = os.path.join(temp_dir, os.path.basename(file_name))
try: try:
with open(saved_file, 'wb') as destination_file: with open(saved_file, 'wb') as destination_file:
destination_file.write(file_item.value) destination_file.write(file_item.value)
except Exception: except Exception:
LOG.exception("Failed to save file %s", file_name) msg = "Failed to save file {} in {}".format(file_name, temp_dir)
LOG.exception(msg)
raise Exception(msg)
def delete_temp_file(file_name, temp_dir=constants.SCRATCH_DIR): def delete_temp_file(file_name, temp_dir=constants.SCRATCH_DIR):