update/software/software/config.py

189 lines
5.3 KiB
Python

"""
Copyright (c) 2023 Wind River Systems, Inc.
SPDX-License-Identifier: Apache-2.0
"""
import configparser
import io
import logging
import os
import socket
from oslo_config import cfg
import tsconfig.tsconfig as tsc
import software.utils as utils
import software.constants as constants
controller_mcast_group = None
agent_mcast_group = None
controller_port = 0
agent_port = 0
api_port = 0
alt_postgresql_port = 0
mgmt_if = None
nodetype = None
package_feed = None
platform_conf_mtime = 0
software_conf_mtime = 0
software_conf = constants.SOFTWARE_CONFIG_FILE_LOCAL
# setup a shareable config
CONF = cfg.CONF
# define the pecan configuration options
PECAN_CONFIG_GROUP = 'pecan'
# todo(abailey): Add help text for these options
pecan_opts = [
cfg.StrOpt(
'root',
default='software.api.controllers.root.RootController'
),
cfg.ListOpt(
'modules',
default=["software.api"]
),
cfg.BoolOpt(
'debug',
default=False
),
cfg.BoolOpt(
'auth_enable',
default=True
),
cfg.BoolOpt(
'force_canonical',
default=True
),
cfg.BoolOpt(
'guess_content_type_from_ext',
default=False
),
cfg.StrOpt(
"package_feed",
default="http://controller:8080/updates/debian/rel-%s/ bullseye updates"
% constants.STARLINGX_RELEASE
),
]
# register the configuration for this component
CONF.register_opts(pecan_opts, group=PECAN_CONFIG_GROUP)
def read_config():
global software_conf_mtime
global software_conf
if software_conf_mtime == os.stat(software_conf).st_mtime:
# The file has not changed since it was last read
return
defaults = {
'controller_mcast_group': "239.1.1.3",
'agent_mcast_group': "239.1.1.4",
'api_port': "5493",
'controller_port': "5494",
'agent_port': "5495",
'alt_postgresql_port': "6666",
"package_feed":
"http://controller:8080/updates/debian/rel-%s/ bullseye updates"
% constants.STARLINGX_RELEASE,
}
global controller_mcast_group
global agent_mcast_group
global api_port
global controller_port
global agent_port
global alt_postgresql_port
global package_feed
config = configparser.ConfigParser(defaults)
config.read(software_conf)
software_conf_mtime = os.stat(software_conf).st_mtime
controller_mcast_group = config.get('runtime',
'controller_multicast')
agent_mcast_group = config.get('runtime', 'agent_multicast')
api_port = config.getint('runtime', 'api_port')
controller_port = config.getint('runtime', 'controller_port')
agent_port = config.getint('runtime', 'agent_port')
alt_postgresql_port = config.getint('runtime', 'alt_postgresql_port')
package_feed = config.get("runtime", "package_feed")
# The platform.conf file has no section headers, which causes problems
# for ConfigParser. So we'll fake it out.
ini_str = '[platform_conf]\n' + open(tsc.PLATFORM_CONF_FILE, 'r').read()
ini_fp = io.StringIO(ini_str)
config.read_file(ini_fp)
try:
value = str(config.get('platform_conf', 'nodetype'))
global nodetype
nodetype = value
except configparser.Error:
logging.exception("Failed to read nodetype from config")
def get_mgmt_ip():
# Check if initial config is complete
if not os.path.exists(tsc.INITIAL_CONFIG_COMPLETE_FLAG):
return None
# Due to https://storyboard.openstack.org/#!/story/2010722
# the management IP for AIO-SX can be reconfigured during the startup.
# Check if /var/run/.<node>_config_complete exists to be sure that IP
# address will be the correct mgmt IP
try:
if tsc.system_mode == constants.SYSTEM_MODE_SIMPLEX and \
not os.path.exists(tsc.VOLATILE_CONTROLLER_CONFIG_COMPLETE):
return None
except Exception:
logging.info("not able to get system_mode, continue sw-patch services")
mgmt_hostname = socket.gethostname()
return utils.gethostbyname(mgmt_hostname)
# Because the software daemons are launched before manifests are
# applied, the content of some settings in platform.conf can change,
# such as the management interface. As such, we can't just directly
# use tsc.management_interface
#
def get_mgmt_iface():
# Check if initial config is complete
if not os.path.exists(constants.INITIAL_CONFIG_COMPLETE_FLAG):
return None
global mgmt_if
global platform_conf_mtime
if mgmt_if is not None and \
platform_conf_mtime == os.stat(tsc.PLATFORM_CONF_FILE).st_mtime:
# The platform.conf file hasn't been modified since we read it,
# so return the cached value.
return mgmt_if
config = configparser.ConfigParser()
# The platform.conf file has no section headers, which causes problems
# for ConfigParser. So we'll fake it out.
ini_str = '[platform_conf]\n' + open(tsc.PLATFORM_CONF_FILE, 'r').read()
ini_fp = io.StringIO(ini_str)
config.read_file(ini_fp)
try:
value = str(config.get('platform_conf', 'management_interface'))
mgmt_if = value
platform_conf_mtime = os.stat(tsc.PLATFORM_CONF_FILE).st_mtime
except configparser.Error:
logging.exception("Failed to read management_interface from config")
return None
return mgmt_if