+##translates yaml into variables
+##params: filename, prefix (ex. "config_")
+##usage: parse_yaml opnfv_ksgen_settings.yml "config_"
+parse_yaml() {
+ local prefix=$2
+ local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
+ sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
+ -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
+ awk -F$fs '{
+ indent = length($1)/2;
+ vname[indent] = $2;
+ for (i in vname) {if (i > indent) {delete vname[i]}}
+ if (length($3) > 0) {
+ vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
+ printf("%s%s%s=%s\n", "'$prefix'",vn, $2, $3);
+ }
+ }'
+}
+
+##checks if prefix exists in string
+##params: string, prefix
+##usage: contains_prefix "deploy_setting_launcher=1" "deploy_setting"
+contains_prefix() {
+ local mystr=$1
+ local prefix=$2
+ if echo $mystr | grep -E "^$prefix.*$" > /dev/null; then
+ return 0
+ else
+ return 1
+ fi
+}
+##parses variable from a string with '='
+##and removes global prefix
+##params: string, prefix
+##usage: parse_setting_var 'deploy_myvar=2' 'deploy_'
+parse_setting_var() {
+ local mystr=$1
+ local prefix=$2
+ if echo $mystr | grep -E "^.+\=" > /dev/null; then
+ echo $(echo $mystr | grep -Eo "^.+\=" | tr -d '=' | sed 's/^'"$prefix"'//')
+ else
+ return 1
+ fi
+}
+##parses value from a string with '='
+##params: string
+##usage: parse_setting_value
+parse_setting_value() {
+ local mystr=$1
+ echo $(echo $mystr | grep -Eo "\=.*$" | tr -d '=')
+}
+##parses network settings yaml into globals
+parse_network_settings() {
+ local required_network_settings="cidr"
+ local common_optional_network_settings="usable_ip_range"
+ local admin_network_optional_settings="provisioner_ip dhcp_range introspection_range"
+ local public_network_optional_settings="floating_ip_range gateway provisioner_ip"
+ local nic_value cidr
+
+ eval $(parse_yaml ${NETSETS})
+ for network in ${OPNFV_NETWORK_TYPES}; do
+ if [[ $(eval echo \${${network}_enabled}) == 'true' ]]; then
+ enabled_network_list+="${network} "
+ elif [ "${network}" == 'admin_network' ]; then
+ echo -e "${red}ERROR: You must enable admin_network and configure it explicitly or use auto-detection${reset}"
+ exit 1
+ elif [ "${network}" == 'public_network' ]; then
+ echo -e "${red}ERROR: You must enable public_network and configure it explicitly or use auto-detection${reset}"
+ exit 1
+ else
+ echo -e "${blue}INFO: Network: ${network} is disabled, will collapse into admin_network"
+ fi
+ done
+
+ # check for enabled network values
+ for enabled_network in ${enabled_network_list}; do
+ # detect required settings first to continue
+ echo -e "${blue}INFO: Detecting Required settings for: ${enabled_network}${reset}"
+ for setting in ${required_network_settings}; do
+ eval "setting_value=\${${enabled_network}_${setting}}"
+ if [ -z "${setting_value}" ]; then
+ # if setting is missing we try to autodetect
+ eval "nic_value=\${${enabled_network}_bridged_interface}"
+ if [ -n "$nic_value" ]; then
+ setting_value=$(eval find_${setting} ${nic_value})
+ if [ -n "$setting_value" ]; then
+ eval "${enabled_network}_${setting}=${setting_value}"
+ echo -e "${blue}INFO: Auto-detection: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ else
+ echo -e "${red}ERROR: Auto-detection failed: ${setting} not found using interface: ${nic_value}${reset}"
+ exit 1
+ fi
+ else
+ echo -e "${red}ERROR: Required setting: ${setting} not found, and bridge interface not provided\
+for Auto-detection${reset}"
+ exit 1
+ fi
+ else
+ echo -e "${blue}INFO: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ fi
+ done
+ echo -e "${blue}INFO: Detecting Common settings for: ${enabled_network}${reset}"
+ # detect optional common settings
+ # these settings can be auto-generated if missing
+ for setting in ${common_optional_network_settings}; do
+ eval "setting_value=\${${enabled_network}_${setting}}"
+ if [ -z "${setting_value}" ]; then
+ if [ -n "$nic_value" ]; then
+ setting_value=$(eval find_${setting} ${nic_value})
+ else
+ setting_value=''
+ echo -e "${blue}INFO: Skipping Auto-detection, NIC not specified for ${enabled_network}. Attempting Auto-generation...${reset}"
+ fi
+ if [ -n "$setting_value" ]; then
+ eval "${enabled_network}_${setting}=${setting_value}"
+ echo -e "${blue}INFO: Auto-detection: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ else
+ # if Auto-detection fails we can auto-generate with CIDR
+ eval "cidr=\${${enabled_network}_cidr}"
+ if [ -n "$cidr" ]; then
+ echo -e "${blue}INFO: Auto-generating: ${setting}${reset}"
+ setting_value=$(eval generate_${setting} ${cidr})
+ else
+ setting_value=''
+ echo -e "${red}ERROR: Auto-generation failed: required parameter CIDR missing for network ${enabled_network}${reset}"
+ fi
+ if [ -n "$setting_value" ]; then
+ eval "${enabled_network}_${setting}=${setting_value}"
+ echo -e "${blue}INFO: Auto-generated: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ else
+ echo -e "${red}ERROR: Auto-generation failed: ${setting} not found${reset}"
+ exit 1
+ fi
+ fi
+ else
+ echo -e "${blue}INFO: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ fi
+ done
+ echo -e "${blue}INFO: Detecting Network Specific settings for: ${enabled_network}${reset}"
+ # detect network specific settings
+ if [ -n $(eval echo \${${network}_optional_settings}) ]; then
+ eval "network_specific_settings=\${${enabled_network}_optional_settings}"
+ for setting in ${network_specific_settings}; do
+ eval "setting_value=\${${enabled_network}_${setting}}"
+ if [ -z "${setting_value}" ]; then
+ if [ -n "$nic_value" ]; then
+ setting_value=$(eval find_${setting} ${nic_value})
+ else
+ setting_value=''
+ echo -e "${blue}INFO: Skipping Auto-detection, NIC not specified for ${enabled_network}. Attempting Auto-generation...${reset}"
+ fi
+ if [ -n "$setting_value" ]; then
+ eval "${enabled_network}_${setting}=${setting_value}"
+ echo -e "${blue}INFO: Auto-detection: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ else
+ eval "cidr=\${${enabled_network}_cidr}"
+ if [ -n "$cidr" ]; then
+ setting_value=$(eval generate_${setting} ${cidr})
+ else
+ setting_value=''
+ echo -e "${red}ERROR: Auto-generation failed: required parameter CIDR missing for network ${enabled_network}${reset}"
+ fi
+ if [ -n "$setting_value" ]; then
+ eval "${enabled_network}_${setting}=${setting_value}"
+ echo -e "${blue}INFO: Auto-generated: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ else
+ echo -e "${red}ERROR: Auto-generation failed: ${setting} not found${reset}"
+ exit 1
+ fi
+ fi
+ else
+ echo -e "${blue}INFO: ${enabled_network}_${setting}: ${setting_value}${reset}"
+ fi
+ done
+ fi
+ done
+}
+##parses deploy settings yaml into globals and options array
+##params: none
+##usage: parse_deploy_settings
+parse_deploy_settings() {
+ local global_prefix="deploy_global_params_"
+ local options_prefix="deploy_deploy_options_"
+ local myvar myvalue
+ local settings=$(parse_yaml $DEPLOY_SETTINGS_FILE "deploy_")
+
+ for this_setting in $settings; do
+ if contains_prefix $this_setting $global_prefix; then
+ myvar=$(parse_setting_var $this_setting $global_prefix)
+ if [ -z "$myvar" ]; then
+ echo -e "${red}ERROR: while parsing ${DEPLOY_SETTINGS_FILE} for setting: ${this_setting}${reset}"
+ fi
+ myvalue=$(parse_setting_value $this_setting)
+ # Do not override variables set by cmdline
+ if [ -z "$(eval echo \$$myvar)" ]; then
+ eval "$myvar=\$myvalue"
+ echo -e "${blue}Global parameter set: ${myvar}:${myvalue}${reset}"
+ else
+ echo -e "${blue}Global parameter already set: ${myvar}${reset}"
+ fi
+ elif contains_prefix $this_setting $options_prefix; then
+ myvar=$(parse_setting_var $this_setting $options_prefix)
+ if [ -z "$myvar" ]; then
+ echo -e "${red}ERROR: while parsing ${DEPLOY_SETTINGS_FILE} for setting: ${this_setting}${reset}"
+ fi
+ myvalue=$(parse_setting_value $this_setting)
+ deploy_options_array[$myvar]=$myvalue
+ echo -e "${blue}Deploy option set: ${myvar}:${myvalue}${reset}"
+ fi
+ done
+}
+##parses baremetal yaml settings into compatible json
+##writes the json to $CONFIG/instackenv_tmp.json
+##params: none
+##usage: parse_inventory_file
+parse_inventory_file() {
+ local inventory=$(parse_yaml $INVENTORY_FILE)
+ local node_list
+ local node_prefix="node"
+ local node_count=0
+ local node_total
+ local inventory_list
+
+ # detect number of nodes
+ for entry in $inventory; do
+ if echo $entry | grep -Eo "^nodes_node[0-9]+_" > /dev/null; then
+ this_node=$(echo $entry | grep -Eo "^nodes_node[0-9]+_")
+ if [[ "$inventory_list" != *"$this_node"* ]]; then
+ inventory_list+="$this_node "
+ fi
+ fi
+ done
+
+ inventory_list=$(echo $inventory_list | sed 's/ $//')
+
+ for node in $inventory_list; do
+ ((node_count+=1))
+ done
+
+ node_total=$node_count
+
+ if [[ "$node_total" -lt 5 && ( ha_enabled == "TRUE" || "$ha_enabled" == "true" ) ]]; then
+ echo -e "${red}ERROR: You must provide at least 5 nodes for HA baremetal deployment${reset}"
+ exit 1
+ elif [[ "$node_total" -lt 2 ]]; then
+ echo -e "${red}ERROR: You must provide at least 2 nodes for non-HA baremetal deployment${reset}"
+ exit 1
+ fi
+
+ eval $(parse_yaml $INVENTORY_FILE)
+
+ instack_env_output="
+{
+ \"nodes\" : [
+
+"
+ node_count=0
+ for node in $inventory_list; do
+ ((node_count+=1))
+ node_output="
+ {
+ \"pm_password\": \"$(eval echo \${${node}ipmi_pass})\",
+ \"pm_type\": \"pxe_ipmitool\",
+ \"mac\": [
+ \"$(eval echo \${${node}mac_address})\"
+ ],
+ \"cpu\": \"$(eval echo \${${node}cpus})\",
+ \"memory\": \"$(eval echo \${${node}memory})\",
+ \"disk\": \"$(eval echo \${${node}disk})\",
+ \"arch\": \"$(eval echo \${${node}arch})\",
+ \"pm_user\": \"$(eval echo \${${node}ipmi_user})\",
+ \"pm_addr\": \"$(eval echo \${${node}ipmi_ip})\",
+ \"capabilities\": \"$(eval echo \${${node}capabilities})\"
+"
+ instack_env_output+=${node_output}
+ if [ $node_count -lt $node_total ]; then
+ instack_env_output+=" },"
+ else
+ instack_env_output+=" }"
+ fi
+ done
+
+ instack_env_output+='
+ ]
+}
+'
+ #Copy instackenv.json to undercloud for baremetal
+ echo -e "{blue}Parsed instackenv JSON:\n${instack_env_output}${reset}"
+ ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
+cat > instackenv.json << EOF
+$instack_env_output
+EOF
+EOI
+
+}