diff --git a/bin/client.py b/bin/client.py index 3df3de5e..6f3db233 100755 --- a/bin/client.py +++ b/bin/client.py @@ -20,6 +20,7 @@ import netaddr import os import re import requests +import simplejson as json import socket import sys import time @@ -34,6 +35,7 @@ import switch_virtualenv from compass.apiclient.restful import Client from compass.utils import flags from compass.utils import logsetting +from compass.utils import util flags.add('compass_server', @@ -108,6 +110,9 @@ flags.add('domain', flags.add('search_path', help='search path', default='') +flags.add('local_repo_url', + help='local repo url', + default='') flags.add('default_gateway', help='default gateway', default='') @@ -117,6 +122,9 @@ flags.add('server_credential', '=' ), default='root=root') +flags.add('os_config_json_file', + help='json formatted os config file', + default='') flags.add('service_credentials', help=( 'comma seperated service credentials formatted as ' @@ -150,6 +158,9 @@ flags.add('network_mapping', '=' ), default='') +flags.add('package_config_json_file', + help='json formatted os config file', + default='') flags.add('host_roles', help=( 'semicomma separated host roles ' @@ -176,6 +187,14 @@ flags.add('dashboard_link_pattern', default=r'(?m)(http://\d+\.\d+\.\d+\.\d+:5000/v2\.0)') +def _load_config(config_filename): + if not config_filename: + return {} + with open(config_filename) as config_file: + content = config_file.read() + return json.loads(content) + + def _get_client(): """get apiclient object.""" return Client(flags.OPTIONS.compass_server) @@ -617,6 +636,14 @@ def _set_cluster_os_config(client, cluster_id, host_ips): os_config['partition'][partition_name] = { partition_type: partition_value } + local_repo_url = flags.OPTIONS.local_repo_url + if local_repo_url: + os_config['general']['local_repo'] = local_repo_url + os_config_filename = flags.OPTIONS.os_config_json_file + if os_config_filename: + util.merge_dict( + os_config, _load_config(os_config_filename) + ) status, resp = client.update_cluster_config( cluster_id, os_config=os_config) logging.info( @@ -689,12 +716,6 @@ def _set_host_networking(client, host_mapping, subnet_mapping): def _set_cluster_package_config(client, cluster_id): """set cluster package config.""" package_config = { - 'security': { - 'service_credentials': { - }, - 'console_credentials': { - } - } } service_credentials = [ service_credential @@ -715,7 +736,11 @@ def _set_cluster_package_config(client, cluster_id): 'there is no = in service %s security' % service_name ) username, password = service_pair.split('=', 1) - package_config['security']['service_credentials'][service_name] = { + package_config.setdefault( + 'security', {} + ).setdefault( + 'service_credentials', {} + )[service_name] = { 'username': username, 'password': password } @@ -738,15 +763,28 @@ def _set_cluster_package_config(client, cluster_id): 'there is no = in console %s security' % console_name ) username, password = console_pair.split('=', 1) - package_config['security']['console_credentials'][console_name] = { + package_config.setdefault( + 'security', {} + ).setdefault( + 'console_credentials', {} + )[console_name] = { 'username': username, 'password': password } - package_config['network_mapping'] = dict([ + network_mapping = dict([ network_pair.split('=', 1) for network_pair in flags.OPTIONS.network_mapping.split(',') if '=' in network_pair ]) + for network_type, network in network_mapping.items(): + package_config.setdefault( + 'network_mapping', {} + )[network_type] = network + package_config_filename = flags.OPTIONS.package_config_json_file + if package_config_filename: + util.merge_dict( + package_config, _load_config(package_config_filename) + ) status, resp = client.update_cluster_config( cluster_id, package_config=package_config) logging.info( diff --git a/regtest/regtest.conf b/regtest/regtest.conf index 9119ffed..efbfa51c 100644 --- a/regtest/regtest.conf +++ b/regtest/regtest.conf @@ -37,6 +37,9 @@ export HOME_PERCENTAGE=${HOME_PERCENTAGE:-'5'} export TMP_PERCENTAGE=${TMP_PERCENTAGE:-'5'} export VAR_PERCENTAGE=${VAR_PERCENTAGE:-'10'} export PARTITION=${PARTITION:-"/home=${HOME_PERCENTAGE}%,/tmp=${TMP_PERCENTAGE}%,/var=${VAR_PERCENTAGE}%"} +export LOCAL_REPO_URL=${LOCAL_REPO_URL:-} +export OS_CONFIG_FILENAME=${OS_CONFIG_FILENAME:-} +export PACKAGE_CONFIG_FILENAME=${PACKAGE_CONFIG_FILENAME:-} function ip_subnet { ip_addr=$1 diff --git a/regtest/regtest.sh b/regtest/regtest.sh index 1c7d92f7..57fd5d3c 100755 --- a/regtest/regtest.sh +++ b/regtest/regtest.sh @@ -160,7 +160,7 @@ else POLL_SWITCHES_FLAG="poll_switches" fi -${CLIENT_SCRIPT} --logfile= --loglevel=debug --logdir= --compass_server="${COMPASS_SERVER_URL}" --compass_user_email="${COMPASS_USER_EMAIL}" --compass_user_password="${COMPASS_USER_PASSWORD}" --cluster_name="${CLUSTER_NAME}" --language="${LANGUAGE}" --timezone="${TIMEZONE}" --hostnames="${HOSTNAMES}" --partitions="${PARTITIONS}" --subnets="${SUBNETS}" --adapter_os_pattern="${ADAPTER_OS_PATTERN}" --adapter_name="${ADAPTER_NAME}" --adapter_target_system_pattern="${ADAPTER_TARGET_SYSTEM_PATTERN}" --adapter_flavor_pattern="${ADAPTER_FLAVOR_PATTERN}" --http_proxy="${PROXY}" --https_proxy="${PROXY}" --no_proxy="${IGNORE_PROXY}" --ntp_server="${NTP_SERVER}" --dns_servers="${NAMESERVERS}" --domain="${DOMAIN}" --search_path="${SEARCH_PATH}" --default_gateway="${GATEWAY}" --server_credential="${SERVER_CREDENTIAL}" --service_credentials="${SERVICE_CREDENTIALS}" --console_credentials="${CONSOLE_CREDENTIALS}" --host_networks="${HOST_NETWORKS}" --network_mapping="${NETWORK_MAPPING}" --host_roles="${HOST_ROLES}" --default_roles="${DEFAULT_ROLES}" --switch_ips="${SWITCH_IPS}" --machines="${machines}" --switch_credential="${SWITCH_CREDENTIAL}" --deployment_timeout="${DEPLOYMENT_TIMEOUT}" --${POLL_SWITCHES_FLAG} --dashboard_url="${DASHBOARD_URL}" +${CLIENT_SCRIPT} --logfile= --loglevel=debug --logdir= --compass_server="${COMPASS_SERVER_URL}" --compass_user_email="${COMPASS_USER_EMAIL}" --compass_user_password="${COMPASS_USER_PASSWORD}" --cluster_name="${CLUSTER_NAME}" --language="${LANGUAGE}" --timezone="${TIMEZONE}" --hostnames="${HOSTNAMES}" --partitions="${PARTITIONS}" --subnets="${SUBNETS}" --adapter_os_pattern="${ADAPTER_OS_PATTERN}" --adapter_name="${ADAPTER_NAME}" --adapter_target_system_pattern="${ADAPTER_TARGET_SYSTEM_PATTERN}" --adapter_flavor_pattern="${ADAPTER_FLAVOR_PATTERN}" --http_proxy="${PROXY}" --https_proxy="${PROXY}" --no_proxy="${IGNORE_PROXY}" --ntp_server="${NTP_SERVER}" --dns_servers="${NAMESERVERS}" --domain="${DOMAIN}" --search_path="${SEARCH_PATH}" --default_gateway="${GATEWAY}" --server_credential="${SERVER_CREDENTIAL}" --local_repo_url="${LOCAL_REPO_URL}" --os_config_json_file="${OS_CONFIG_FILENAME}" --service_credentials="${SERVICE_CREDENTIALS}" --console_credentials="${CONSOLE_CREDENTIALS}" --host_networks="${HOST_NETWORKS}" --network_mapping="${NETWORK_MAPPING}" --package_config_json_file="${PACKAGE_CONFIG_FILENAME}" --host_roles="${HOST_ROLES}" --default_roles="${DEFAULT_ROLES}" --switch_ips="${SWITCH_IPS}" --machines="${machines}" --switch_credential="${SWITCH_CREDENTIAL}" --deployment_timeout="${DEPLOYMENT_TIMEOUT}" --${POLL_SWITCHES_FLAG} --dashboard_url="${DASHBOARD_URL}" rc=$? deactivate # Tear down machines after the test