Files
update/software/upgrade-scripts/09-remove-backup-service-parameter.py
Rahul Roshan Kachchap 79bbc6f2e6 Managing out_of_tree_drivers param during upgrade & rollback
This commit updates out_of_tree_drivers service parameter
to backup_oot_drivers_24.09 and removes out-of-tree-drivers
kernel parameter when upgrading from stx.10 to stx.11.
In case of rollback this commit update backup_oot_drivers_24.09
to out_of_tree_drivers service parameter & out-of-tree-drivers
kernel parameters to same value set before the upgrade.

Added migrate script that:
 - Delete any existing backup_oot_drivers_24.09 service
   parameter from sysinv DB.
 - Updates the original out_of_tree_drivers service parameter
   to backup_oot_drivers_24.09

Added delete script that:
 - Removes the backup_oot_drivers_24.09 service parameter entry
   when action=delete

Added an upgrade and rollback hook that:
 - Removes out-of-tree-drivers kernel parameter during upgrade
 - Retrieve and restores the out-of-tree-drivers kernel parameter
   from backup_oot_drivers if present during rollback

TestPlan:
PASS: build-pkgs -c software
PASS: build-image
PASS: bootstrap
PASS: AIO-SX & Standard upgrade and rollback (Verfied below by
      presetting out_of_tree_drivers to 'none' before upgrade and
      also without presetting)
      - After deploy-activate validated no out_of_tree_drivers
        service parameter exists
      - After delpoy-activate, validated no out-of-tree-drivers
        kernel parameter exists
      - After deploy-delete, validated the backup_oot_drivers
        service parameter gets removed
      - After rollback, Validated out_of_tree_drivers service
        parameter value is restored to original value
      - Validated out-of-tree-drivers kernel parameter value is
        restored to original value
PASS: AIO-SX & Standard upgrade and rollback succesfully
PASS: No double-reboot is observed after upgrade & rollback unlock

Story: 2011384
Task: 52853

Change-Id: I30aa179e329d7ea4cfa659737f66bad9ab4036e9
Signed-off-by: Rahul Roshan Kachchap <rahulroshan.kachchap@windriver.com>
2025-09-25 14:37:23 -04:00

148 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright (c) 2025 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# This script deletes the backup_oot_drivers service parameter
# from the sysinv DB when invoked with action=delete.
#
import logging as LOG
import sys
import re
import configparser
import psycopg2
DEFAULT_POSTGRES_PORT = 5432
DB_NAME = "sysinv"
DB_HOST = "localhost"
BACKUP_NAME = "backup_oot_drivers_24.09"
PARAM_SERVICE = "platform"
PARAM_SECTION = "kernel"
LOG.basicConfig(
filename="/var/log/software.log",
format='%(asctime)s: [%(process)s]: %(filename)s(%(lineno)s): '
'%(levelname)s: %(message)s',
level=LOG.INFO,
datefmt="%FT%T"
)
def get_db_credentials():
"""Retrieve DB credentials from sysinv.conf"""
try:
config = configparser.ConfigParser()
config.read("/etc/sysinv/sysinv.conf")
conn_string = config["database"]["connection"]
match = re.match(r"postgresql\+psycopg2://([^:]+):([^@]+)@", conn_string)
if match:
username = match.group(1)
password = match.group(2)
return username, password
else:
raise Exception("Failed to parse DB credentials from sysinv.conf")
except Exception as e:
LOG.error(f"Error getting DB credentials: {e}")
sys.exit(1)
def connect_to_db(port):
"""Establish DB connection"""
username, password = get_db_credentials()
try:
conn = psycopg2.connect(
dbname=DB_NAME,
user=username,
password=password,
host=DB_HOST,
port=port,
)
return conn
except Exception as e:
LOG.error(f"Database connection failed: {e}")
sys.exit(1)
def db_query(conn, query, params=()):
"""Execute SELECT query and return results"""
with conn.cursor() as cur:
cur.execute(query, params)
return cur.fetchall()
def db_update(conn, query, params=(), autocommit=True):
"""Execute UPDATE/DELETE query"""
with conn.cursor() as cur:
cur.execute(query, params)
if autocommit:
conn.commit()
def del_backup_param(conn):
"""Delete backup_oot_drivers_24.09 service parameter from sysinv DB."""
delete_query = (
"DELETE FROM service_parameter "
"WHERE name=%s AND service=%s AND section=%s;"
)
db_update(conn, delete_query, (BACKUP_NAME, PARAM_SERVICE, PARAM_SECTION))
rows = db_query(
conn,
"SELECT COUNT(*) FROM service_parameter "
"WHERE name=%s AND service=%s AND section=%s;",
(BACKUP_NAME, PARAM_SERVICE, PARAM_SECTION),
)
if rows and rows[0][0] > 0:
LOG.info(
"Deleted %d backup parameter(s) named '%s'.",
rows[0][0], BACKUP_NAME
)
else:
LOG.info("No backup parameter '%s' found to delete.", BACKUP_NAME)
def main():
action = None
from_release = None
to_release = None
postgres_port = DEFAULT_POSTGRES_PORT
if len(sys.argv) < 4:
print("Usage: %s from_release to_release action [postgres_port]" % sys.argv[0])
return 1
from_release = sys.argv[1]
to_release = sys.argv[2]
action = sys.argv[3]
if len(sys.argv) > 4:
postgres_port = sys.argv[4]
LOG.info(
"%s invoked from_release=%s to_release=%s action=%s",
sys.argv[0],
from_release,
to_release,
action,
)
if action == "delete":
try:
conn = connect_to_db(postgres_port)
del_backup_param(conn)
conn.close()
except Exception as e:
LOG.exception("Error removing backup service parameter: %s", e)
sys.exit(1)
else:
LOG.info("Nothing to do. Skipping")
return 0
if __name__ == "__main__":
sys.exit(main())