Files
update/software/scripts/sync-controllers-feed
Cristian Mondo 2a7902dbbe Improve feed repo sync script to detect inactive peer
This commit allows detecting the inactive node in a duplex subcloud
to which the changes of the active node must be synchronized.

When the content of the feed repo directory on the active node is
modified, it must be synchronized with the inactive node.

This only applies to a duplex system. On a simplex subcloud, if the
script is invoked, the synchronization will simply be skipped.

Test Plan:
PASS - Bring up a 24.09 system controller.
     - Bring up a 24.09 duplex subcloud.
     - Upload and deploy patch 24.09.1 on subcloud.
     - Verify in software.log that the ostree feed repo is
       synchronized and check the directory content.

PASS - Bring up a 24.09 system controller.
     - Bring up a 24.09 simplex subcloud.
     - Upload and deploy patch 24.09.1 on subcloud.
     - Verify in software.log that the synchronization is
       skipped.

Story: 2010676
Task: 51147

Change-Id: I94a3f0f78b08368ebfb6f7dba82b4fab245580f7
Signed-off-by: Cristian Mondo <cristian.mondo@windriver.com>
2024-10-08 12:03:40 -03:00

101 lines
2.6 KiB
Python

#!/usr/bin/python3
# -*- encoding: utf-8 -*-
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (c) 2023-2024 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
"""
Run feed synchronization between controllers
"""
import logging as LOG
import os
import socket
import subprocess
import sys
import upgrade_utils
CONTROLLER_0_HOSTNAME = "controller-0"
CONTROLLER_1_HOSTNAME = "controller-1"
SYSTEM_MODE_SIMPLEX = "simplex"
def sync_controllers(feed):
controller = socket.gethostname()
controller = CONTROLLER_1_HOSTNAME if \
controller == CONTROLLER_0_HOSTNAME else CONTROLLER_0_HOSTNAME
LOG.info(f"Synchronized feed with {controller}")
cmd = [
"rsync",
"-ac",
"--delete",
"--exclude", "tmp",
feed,
f"rsync://{controller}/feed"
]
subprocess.run(cmd)
def print_usage(sys_argv):
script_name = sys_argv[0]
print("Usage: %s --feed=<feed>" % script_name)
def get_system_mode():
system_mode=None
with open(os.devnull, "w") as fnull:
cmd = "bash -c 'grep system_mode /etc/platform/platform.conf'"
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
executable='/bin/bash')
stdout, stderr = process.communicate()
output = stdout.decode("utf-8").strip()
error_output = stderr.decode("utf-8").strip()
if process.returncode == 0:
system_mode = output.split('=')[1]
else:
LOG.error(f"Error: {error_output}")
return system_mode
def main(sys_argv):
args = upgrade_utils.parse_arguments(sys_argv)
try:
feed = args["feed"]
system_mode = get_system_mode()
if system_mode is None:
LOG.error("Unable to get the system mode.")
return 1
elif system_mode == SYSTEM_MODE_SIMPLEX:
LOG.info("System mode is simplex. Skipping sync controllers feed.")
return 0
sync_controllers(feed)
LOG.info("Feed synchronized between controllers.")
except KeyError as e:
msg = "%s is not provided" % str(e)
LOG.error(msg)
print(msg)
print_usage(sys_argv)
return 1
except subprocess.CalledProcessError as e:
LOG.exception("Feed synchronization command failed. Error: %s", e)
return 1
except Exception as e:
LOG.exception("Feed synchronization failed. Error: %s", e)
return 1
if __name__ == "__main__":
upgrade_utils.configure_logging('/var/log/software.log', log_level=LOG.INFO)
sys.exit(main(sys.argv))