config/sysinv/sysinv/sysinv/sysinv/cmd/utils.py

191 lines
7.7 KiB
Python

#!/usr/bin/env python
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
import sys
import yaml
from sysinv.common import constants
from sysinv.common import service
from sysinv.db import api
from oslo_config import cfg
from oslo_log import log as logging
# Log and config
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
def create_host_overrides(filename):
try:
dbapi = api.get_instance()
data = {}
# Get the distributed cloud role info
system = dbapi.isystem_get_one()
if system.distributed_cloud_role:
data.update({'distributed_cloud_role': system.distributed_cloud_role})
else:
data.update({'distributed_cloud_role': 'none'})
# region_config and region_name are overriden for subclouds
if (system.distributed_cloud_role and
system.distributed_cloud_role == constants.DISTRIBUTED_CLOUD_ROLE_SUBCLOUD):
data.update({'region_config': True})
data.update({'region_name': system.region_name})
data.update({'system_mode': system.system_mode})
if system.location:
data.update({'location': system.location})
if system.description:
data.update({'description': system.description})
# Get the DNS info
dns = dbapi.idns_get_one()
if dns.nameservers:
dns_list = dns.nameservers.split(',')
data.update({'dns_servers': dns_list})
# Get the address pool info
pools = dbapi.address_pools_get_all()
for pool in pools:
subnet = pool.network + '/' + str(pool.prefix)
range_start = pool.ranges[0][0].encode('utf-8')
range_end = pool.ranges[0][-1].encode('utf-8')
if pool.name == 'pxeboot':
pool_data = {'pxeboot_subnet': subnet,
'pxeboot_start_address': range_start,
'pxeboot_end_address': range_end,
'pxeboot_floating_address': pool.floating_address,
'pxeboot_node_0_address': pool.controller0_address,
'pxeboot_node_1_address': pool.controller1_address
}
data.update(pool_data)
elif pool.name == 'management':
pool_data = {'management_subnet': subnet,
'management_start_address': range_start,
'management_end_address': range_end,
'management_floating_address': pool.floating_address,
'management_node_0_address': pool.controller0_address,
'management_node_1_address': pool.controller1_address
}
data.update(pool_data)
elif pool.name == 'multicast-subnet':
pool_data = {'management_multicast_subnet': subnet,
'management_multicast_start_address': range_start,
'management_multicast_end_address': range_end
}
data.update(pool_data)
elif pool.name == 'cluster-host-subnet':
pool_data = {'cluster_host_subnet': subnet,
'cluster_host_start_address': range_start,
'cluster_host_end_address': range_end,
'cluster_host_floating_address': pool.floating_address,
'cluster_host_node_0_address': pool.controller0_address,
'cluster_host_node_1_address': pool.controller1_address
}
data.update(pool_data)
elif pool.name == 'cluster-pod-subnet':
pool_data = {'cluster_pod_subnet': subnet,
'cluster_pod_start_address': range_start,
'cluster_pod_end_address': range_end
}
data.update(pool_data)
elif pool.name == 'cluster-service-subnet':
pool_data = {'cluster_service_subnet': subnet,
'cluster_sevice_start_address': range_start,
'cluster_service_end_address': range_end
}
data.update(pool_data)
elif pool.name == 'oam':
pool_data = {'external_oam_subnet': subnet,
'external_oam_start_address': range_start,
'external_oam_end_address': range_end,
'external_oam_floating_address': pool.floating_address,
'external_oam_gateway_address': pool.gateway_address
}
data.update(pool_data)
system = dbapi.isystem_get_one()
if system.system_mode != constants.SYSTEM_MODE_SIMPLEX:
pool_data = {'external_oam_node_0_address': pool.controller0_address,
'external_oam_node_1_address': pool.controller1_address,
}
data.update(pool_data)
elif pool.name == 'system-controller-subnet':
pool_data = {'system_controller_subnet': subnet,
'system_controller_floating_address': pool.floating_address,
}
data.update(pool_data)
elif pool.name == 'system-controller-oam-subnet':
pool_data = {'system_controller_oam_subnet': subnet,
'system_controller_oam_floating_address': pool.floating_address,
}
data.update(pool_data)
docker_list = dbapi.service_parameter_get_all(service=constants.SERVICE_TYPE_DOCKER,
section=constants.SERVICE_PARAM_SECTION_DOCKER_PROXY)
for docker in docker_list:
# Get the docker no-proxy info if it exists
if docker.name == constants.SERVICE_PARAM_NAME_DOCKER_NO_PROXY:
# Remove the open and close parenthesis if address is IPV6
_value = docker.value.strip("[]")
no_proxy_list = _value.split(',')
data.update({'docker_no_proxy': no_proxy_list})
# Get the docker http_proxy info if it exists
elif docker.name == constants.SERVICE_PARAM_NAME_DOCKER_HTTP_PROXY:
data.update({'docker_http_proxy': docker.value})
# Get the docker https_proxy info if it exists
elif docker.name == constants.SERVICE_PARAM_NAME_DOCKER_HTTPS_PROXY:
data.update({'docker_https_proxy': docker.value})
# Save collected information in file
with open(filename, 'w') as outfile:
yaml.safe_dump(data, outfile, default_flow_style=False)
except Exception as e:
LOG.error("Error with create_host_overrides: %s", e)
sys.exit(1)
def add_action_parsers(subparsers):
parser = subparsers.add_parser('create-host-overrides')
parser.set_defaults(func=create_host_overrides)
parser.add_argument('filename', nargs='?')
CONF.register_cli_opt(
cfg.SubCommandOpt('action',
title='actions',
help='Perform sysinv operations',
handler=add_action_parsers))
def main():
service.prepare_service(sys.argv)
if CONF.action.name == 'create-host-overrides':
if not CONF.action.filename:
LOG.error("filename is required")
else:
CONF.action.func(CONF.action.filename)
else:
CONF.action.func()