diff options
-rw-r--r-- | build/opnfv-apex-common.spec | 4 | ||||
-rwxr-xr-x | ci/deploy.sh | 162 | ||||
-rw-r--r-- | lib/common-functions.sh | 9 | ||||
-rwxr-xr-x | lib/parse-functions.sh | 174 |
4 files changed, 188 insertions, 161 deletions
diff --git a/build/opnfv-apex-common.spec b/build/opnfv-apex-common.spec index 5abd4493..ce77d6df 100644 --- a/build/opnfv-apex-common.spec +++ b/build/opnfv-apex-common.spec @@ -52,6 +52,7 @@ install config/network/network_settings_v6.yaml %{buildroot}%{_sysconfdir}/opnfv mkdir -p %{buildroot}%{_var}/opt/opnfv/lib/python/apex install lib/common-functions.sh %{buildroot}%{_var}/opt/opnfv/lib/ +install lib/parse-functions.sh %{buildroot}%{_var}/opt/opnfv/lib/ install lib/utility-functions.sh %{buildroot}%{_var}/opt/opnfv/lib/ install lib/python/apex_python_utils.py %{buildroot}%{_var}/opt/opnfv/lib/python/ mkdir -p %{buildroot}%{python3_sitelib}/apex/ @@ -84,6 +85,7 @@ install config/inventory/pod_example_settings.yaml %{buildroot}%{_docdir}/opnfv/ %attr(755,root,root) %{_bindir}/opnfv-clean %attr(755,root,root) %{_bindir}/opnfv-util %{_var}/opt/opnfv/lib/common-functions.sh +%{_var}/opt/opnfv/lib/parse-functions.sh %{_var}/opt/opnfv/lib/utility-functions.sh %{_var}/opt/opnfv/lib/python/ %{python3_sitelib}/apex/ @@ -113,6 +115,8 @@ install config/inventory/pod_example_settings.yaml %{buildroot}%{_docdir}/opnfv/ %doc %{_docdir}/opnfv/inventory.yaml.example %changelog +* Tue Jul 5 2016 Dan Radez <dradez@redhat.com> - 3.0-10 +- Adding parse-functions.sh * Thu Jun 15 2016 Tim Rozet <trozet@redhat.com> - 3.0-9 - Add fdio scenarios. * Tue Jun 14 2016 Feng Pan <fpan@redhat.com> - 3.0-8 diff --git a/ci/deploy.sh b/ci/deploy.sh index bcd8a6bb..906196e5 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -58,6 +58,7 @@ ip_address_family=4 # Libraries lib_files=( $LIB/common-functions.sh +$LIB/parse-functions.sh $LIB/utility-functions.sh $LIB/installer/onos/onos_gw_mac_update.sh ) @@ -69,25 +70,6 @@ for lib_file in ${lib_files[@]}; do done ##FUNCTIONS -##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" @@ -100,149 +82,7 @@ contains_prefix() { 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 output - if output=$(python3.4 -B $LIB/python/apex_python_utils.py parse-net-settings -s $NETSETS -i $net_isolation_enabled -e $CONFIG/network-environment.yaml); then - echo -e "${blue}${output}${reset}" - eval "$output" - else - echo -e "${red}ERROR: Failed to parse network settings file $NETSETS ${reset}" - exit 1 - fi -} - -##parses deploy settings yaml into globals -parse_deploy_settings() { - local output - if output=$(python3.4 -B $LIB/python/apex_python_utils.py parse-deploy-settings -f $DEPLOY_SETTINGS_FILE); then - echo -e "${blue}${output}${reset}" - eval "$output" - else - echo -e "${red}ERROR: Failed to parse deploy settings file $DEPLOY_SETTINGS_FILE ${reset}" - exit 1 - fi - - if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then - if [ "$net_isolation_enabled" == "FALSE" ]; then - echo -e "${red}ERROR: flat network is not supported with ovs-dpdk ${reset}" - exit 1 - fi - if [[ ! $enabled_network_list =~ "private_network" ]]; then - echo -e "${red}ERROR: tenant network is not enabled for ovs-dpdk ${reset}" - exit 1 - fi - fi -} - -##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" ]]; 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) || { - echo "${red}Failed to parse inventory.yaml. Aborting.${reset}" - exit 1 - } - - instackenv_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\": \"$(eval echo \${${node}pm_type})\", - \"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})\" -" - instackenv_output+=${node_output} - if [ $node_count -lt $node_total ]; then - instackenv_output+=" }," - else - instackenv_output+=" }" - fi - done - - instackenv_output+=' - ] -} -' - #Copy instackenv.json to undercloud for baremetal - echo -e "{blue}Parsed instackenv JSON:\n${instackenv_output}${reset}" - ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI -cat > instackenv.json << EOF -$instackenv_output -EOF -EOI - -} ##verify internet connectivity #params: none function verify_internet { diff --git a/lib/common-functions.sh b/lib/common-functions.sh index 079b0886..365f8e3f 100644 --- a/lib/common-functions.sh +++ b/lib/common-functions.sh @@ -1,4 +1,13 @@ #!/usr/bin/env bash +############################################################################## +# Copyright (c) 2015 Tim Rozet (Red Hat), Dan Radez (Red Hat) and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + # Common Functions used by OPNFV Apex # author: Tim Rozet (trozet@redhat.com) diff --git a/lib/parse-functions.sh b/lib/parse-functions.sh new file mode 100755 index 00000000..dde9041a --- /dev/null +++ b/lib/parse-functions.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash +############################################################################## +# Copyright (c) 2015 Tim Rozet (Red Hat), Dan Radez (Red Hat) and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Parser functions used by OPNFV Apex + +##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); + } + }' +} + +##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 output + if output=$(python3.4 -B $LIB/python/apex_python_utils.py parse-net-settings -s $NETSETS -i $net_isolation_enabled -e $CONFIG/network-environment.yaml); then + echo -e "${blue}${output}${reset}" + eval "$output" + else + echo -e "${red}ERROR: Failed to parse network settings file $NETSETS ${reset}" + exit 1 + fi +} + +##parses deploy settings yaml into globals +parse_deploy_settings() { + local output + if output=$(python3.4 -B $LIB/python/apex_python_utils.py parse-deploy-settings -f $DEPLOY_SETTINGS_FILE); then + echo -e "${blue}${output}${reset}" + eval "$output" + else + echo -e "${red}ERROR: Failed to parse deploy settings file $DEPLOY_SETTINGS_FILE ${reset}" + exit 1 + fi + + if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then + if [ "$net_isolation_enabled" == "FALSE" ]; then + echo -e "${red}ERROR: flat network is not supported with ovs-dpdk ${reset}" + exit 1 + fi + if [[ ! $enabled_network_list =~ "private_network" ]]; then + echo -e "${red}ERROR: tenant network is not enabled for ovs-dpdk ${reset}" + exit 1 + fi + fi +} + +##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" ]]; 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) || { + echo "${red}Failed to parse inventory.yaml. Aborting.${reset}" + exit 1 + } + + instackenv_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\": \"$(eval echo \${${node}pm_type})\", + \"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})\" +" + instackenv_output+=${node_output} + if [ $node_count -lt $node_total ]; then + instackenv_output+=" }," + else + instackenv_output+=" }" + fi + done + + instackenv_output+=' + ] +} +' + #Copy instackenv.json to undercloud for baremetal + echo -e "{blue}Parsed instackenv JSON:\n${instackenv_output}${reset}" + ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI +cat > instackenv.json << EOF +$instackenv_output +EOF +EOI + +} |