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>
148 lines
3.8 KiB
Python
Executable File
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())
|