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>
101 lines
2.6 KiB
Python
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))
|