ha/service-mgmt-tools/sm-tools/sm_tools/sm_configure.py
Bin Qian 720232befe Enable configurable sm process priority through sm-configure
In some cases sm will need to adjust its process priority. This
change enables the configuring sm priority as part of sm at runtime

Partial-Bug: 1816764
Change-Id: I860759621c0d1389ca5a3c947d7973c185274bdd
Signed-off-by: Bin Qian <bin.qian@windriver.com>
2019-02-22 10:37:24 -05:00

267 lines
10 KiB
Python

#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
import sys
import argparse
import sqlite3
from netaddr import IPNetwork
from sm_api_msg_utils import database_name as database_name
cpe_duplex = "duplex"
cpe_duplex_direct = "duplex-direct"
mgmt_if = 'management-interface'
infra_if = 'infrastructure-interface'
tor_connect = 'tor'
dc_connect = 'dc'
database_name = "/var/lib/sm/sm.db"
def main():
try:
parser = argparse.ArgumentParser(description='SM Configuration')
subparsers = parser.add_subparsers(help='types')
if_parser = subparsers.add_parser('interface',
help='Interface Configuration')
if_parser.set_defaults(which='interface')
if_parser.add_argument('service_domain', help='service domain name')
if_parser.add_argument('service_domain_interface',
help='service domain interface name')
if_parser.add_argument('network_multicast', help='network multicast')
if_parser.add_argument('network_address', help='network address')
if_parser.add_argument('network_port', help='network port')
if_parser.add_argument('network_heartbeat_port',
help='network heartbeat port')
if_parser.add_argument('network_peer_address',
help='network peer address')
if_parser.add_argument('network_peer_port', help='network peer port')
if_parser.add_argument('network_peer_heartbeat_port',
help='network peer heartbeat port')
si_parser = subparsers.add_parser('service_instance',
help='Service Instance '
'Configuration')
si_parser.set_defaults(which='service_instance')
si_parser.add_argument('service', help='service name')
si_parser.add_argument('instance', help='instance name')
si_parser.add_argument('parameters', help='instance parameters')
sys_parser = subparsers.add_parser('system',
help='system Configuration')
sys_parser.set_defaults(which='system')
sys_parser.add_argument(
"--cpe_mode", choices=[cpe_duplex, cpe_duplex_direct],
help='cpe mode, available selections: %s, %s' % (
cpe_duplex, cpe_duplex_direct)
)
sys_parser.add_argument(
"--sm_server_port",
help='port sm receives '
'hbs agent cluster information update'
)
sys_parser.add_argument(
"--sm_client_port",
help='port mtce receives sm commands from'
)
sys_parser.add_argument(
"--sm_process_priority",
help='sm process nice value, range from -2 to -20, default -2.'
)
sg_parser = subparsers.add_parser('service_group',
help='Service Group '
'Configuration')
sg_parser.set_defaults(which='service_group')
sg_parser.add_argument('provisioned', help='provisioned')
sg_parser.add_argument('service_domain', help='service domain name')
sg_parser.add_argument('service_group', help='service group name')
sg_parser.add_argument('redundancy', help='redundancy mode')
sg_parser.add_argument('active', help='number of active unit')
sg_parser.add_argument('standby', help='number of standby unit')
sg_parser.add_argument('aggregate', help='service group aggregate')
sg_parser.add_argument('active_only', help='active only if active')
args = parser.parse_args()
if args.which == "system":
if cpe_duplex == args.cpe_mode:
configure_cpe_duplex()
elif cpe_duplex_direct == args.cpe_mode:
configure_cpe_dc()
if args.sm_server_port:
configure_system_opt("sm_server_port", args.sm_server_port)
if args.sm_client_port:
configure_system_opt("sm_client_port", args.sm_client_port)
if args.sm_process_priority:
if int(args.sm_process_priority) in range(-20, -1):
configure_system_opt("sm_process_priority",
args.sm_process_priority)
else:
print("Invalid sm_process_priority value. "
"Must be between -2 to -20")
sys.exit(-1)
else:
database = sqlite3.connect(database_name)
_dispatch_config_action(args, database)
database.close()
sys.exit(0)
except KeyboardInterrupt:
sys.exit()
except Exception as e:
print(e)
sys.exit(-1)
def _dispatch_config_action(args, database):
if args.which == 'interface':
cursor = database.cursor()
cursor.execute("SELECT INTERFACE_NAME FROM "
"SERVICE_DOMAIN_INTERFACES WHERE "
"SERVICE_DOMAIN = '%s' and "
"SERVICE_DOMAIN_INTERFACE = '%s';"
% (args.service_domain,
args.service_domain_interface))
data = cursor.fetchone()
if IPNetwork(args.network_address).version == 6:
network_type = "ipv6-udp"
else:
network_type = "ipv4-udp"
if data is not None:
cursor.execute("UPDATE SERVICE_DOMAIN_INTERFACES SET "
"NETWORK_TYPE = '%s', "
"NETWORK_MULTICAST = '%s', "
"NETWORK_ADDRESS = '%s', "
"NETWORK_PORT = '%s', "
"NETWORK_HEARTBEAT_PORT = '%s', "
"NETWORK_PEER_ADDRESS = '%s', "
"NETWORK_PEER_PORT = '%s', "
"NETWORK_PEER_HEARTBEAT_PORT = '%s' "
"WHERE SERVICE_DOMAIN = '%s' and "
"SERVICE_DOMAIN_INTERFACE = '%s';"
% (network_type,
args.network_multicast,
args.network_address,
args.network_port,
args.network_heartbeat_port,
args.network_peer_address,
args.network_peer_port,
args.network_peer_heartbeat_port,
args.service_domain,
args.service_domain_interface))
database.commit()
if args.which == 'service_instance':
cursor = database.cursor()
cursor.execute("SELECT SERVICE_NAME FROM SERVICE_INSTANCES "
"WHERE SERVICE_NAME = '%s';" % args.service)
data = cursor.fetchone()
if data is None:
cursor.execute("INSERT INTO SERVICE_INSTANCES "
"VALUES( NULL, '%s', '%s', '%s' );"
% (args.service, args.instance,
args.parameters))
else:
cursor.execute("UPDATE SERVICE_INSTANCES SET "
"INSTANCE_NAME = '%s', "
"INSTANCE_PARAMETERS = '%s' "
"WHERE SERVICE_NAME = '%s';"
% (args.instance, args.parameters,
args.service))
database.commit()
if args.which == 'service_group':
cursor = database.cursor()
cursor.execute("SELECT SERVICE_GROUP_NAME FROM SERVICE_DOMAIN_MEMBERS "
"WHERE NAME = '%s' and "
"SERVICE_GROUP_NAME = '%s';"
% (args.service_domain,
args.service_group))
data = cursor.fetchone()
if data is None:
cursor.execute("INSERT INTO SERVICE_DOMAIN_MEMBERS "
"VALUES( NULL, '%s', '%s', '%s', '%s',"
"'%s', '%s', '%s', '%s');"
% (args.provisioned,
args.service_domain,
args.service_group,
args.redundancy,
args.active,
args.standby,
args.aggregate,
args.active_only))
else:
cursor.execute("UPDATE SERVICE_DOMAIN_MEMBERS SET "
"REDUNDANCY_MODEL = '%s', "
"N_ACTIVE = '%s', "
"M_STANDBY = '%s', "
"SERVICE_GROUP_AGGREGATE = '%s' "
"WHERE SERVICE_GROUP_NAME = '%s';"
% (args.redundancy,
args.active,
args.standby,
args.aggregate,
args.service_group
))
database.commit()
def configure_cpe_duplex():
configure_if_connect_type(mgmt_if, tor_connect)
configure_if_connect_type(infra_if, tor_connect)
def configure_cpe_dc():
configure_if_connect_type(mgmt_if, dc_connect)
configure_if_connect_type(infra_if, dc_connect)
def configure_if_connect_type(if_name, connect_type):
database = sqlite3.connect(database_name)
cursor = database.cursor()
sql = "UPDATE SERVICE_DOMAIN_INTERFACES SET INTERFACE_CONNECT_TYPE='%s' " \
"WHERE SERVICE_DOMAIN_INTERFACE = '%s'" % (connect_type, if_name)
cursor.execute(sql)
database.commit()
database.close()
def configure_system_opt(key, value):
database = sqlite3.connect(database_name)
cursor = database.cursor()
sql = 'INSERT OR REPLACE INTO CONFIGURATION ( ID, "KEY", "VALUE" ) ' \
'VALUES((SELECT ID FROM CONFIGURATION WHERE KEY = "%s"), ' \
'"%s", "%s");' % (key, key, value)
cursor.execute(sql)
database.commit()
database.close()