ci/deploy.sh, lib.sh: Align SSH_KEY with Jenkins 25/40725/7
authorAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Thu, 31 Aug 2017 01:09:51 +0000 (03:09 +0200)
committerAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Tue, 5 Sep 2017 00:20:57 +0000 (02:20 +0200)
Jenkins defines a build param also called SSH_KEY, which holds
the full path to our MCP private RSA key, as opposed to Fuel@OPNFV,
which uses the file basename as SSH_KEY.
Switch to using full path in SSH_KEY, while also moving the key
outside /tmp.

NOTE: When running `ci/deploy.sh` with sudo, key will land in
/root/opnfv/mcp.rsa unless SSH_KEY is set via env var.

While at it, bring back VM image storage dir param, allowing us
to drop one more reference to /tmp.

JIRA: FUEL-280

Change-Id: Id1cfa6dbe7b2e6f3915b22281da5957333718401
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
.gitignore
ci/deploy.sh
mcp/deploy/images/.gitkeep [new file with mode: 0644]
mcp/scripts/lib.sh

index 20bd388..72e939c 100644 (file)
@@ -9,7 +9,6 @@ deploy/autodeploy.log
 /docs_build/
 /docs_output/
 /releng/
-mcp/scripts/images/mcp_*iso
-mcp/scripts/images/mcp_*qcow2
+mcp/deploy/images/
 mcp/scripts/mcp.rsa*
 mcp/scripts/user-data.sh
index f51ba5f..b9c5333 100755 (executable)
@@ -32,7 +32,8 @@ $(notify "$(basename "$0"): Deploy the Fuel@OPNFV MCP stack" 3)
 
 $(notify "USAGE:" 2)
   $(basename "$0") -b base-uri -l lab-name -p pod-name -s deploy-scenario \\
-    [-B PXE Bridge [-B Mgmt Bridge [-B Internal Bridge [-B Public Bridge]]]]
+    [-B PXE Bridge [-B Mgmt Bridge [-B Internal Bridge [-B Public Bridge]]]] \\
+    [-S storage-dir]
 
 $(notify "OPTIONS:" 2)
   -b  Base-uri for the stack-configuration structure
@@ -41,6 +42,7 @@ $(notify "OPTIONS:" 2)
   -l  Lab-name
   -p  Pod-name
   -s  Deploy-scenario short-name
+  -S  Storage dir for VM images
 
 $(notify "DISABLED OPTIONS (not yet supported with MCP):" 3)
   -d  (disabled) Dry-run
@@ -49,7 +51,6 @@ $(notify "DISABLED OPTIONS (not yet supported with MCP):" 3)
   -F  (disabled) Do only create a Salt master
   -i  (disabled) iso url
   -L  (disabled) Deployment log path and file name
-  -S  (disabled) Storage dir for VM images
   -T  (disabled) Timeout, in minutes, for the deploy.
 
 $(notify "Description:" 2)
@@ -78,6 +79,7 @@ $(notify "Input parameters to the build script are:" 2)
 -p POD name as defined in the configuration directory, e.g. pod-1
 -s Deployment-scenario, this points to a short deployment scenario name, which
    has to be defined in config directory (e.g. os-odl_l2-nofeature-noha).
+-S Storage dir for VM images, default is mcp/deploy/images
 
 $(notify "Disabled input parameters (not yet supported with MCP):" 3)
 -d (disabled) Dry-run - Produce deploy config files, but do not execute deploy
@@ -85,7 +87,6 @@ $(notify "Disabled input parameters (not yet supported with MCP):" 3)
 -e (disabled) Do not launch environment deployment
 -F (disabled) Do only create a Salt master
 -L (disabled) Deployment log path and name, eg. -L /home/jenkins/job.log.tar.gz
--S (disabled) Storage dir for VM images, default is fuel/deploy/images
 -T (disabled) Timeout, in minutes, for the deploy.
    It defaults to using the DEPLOY_TIMEOUT environment variable when defined.
 -i (disabled) .iso image to be deployed (needs to be provided in a URI
@@ -133,11 +134,14 @@ clean() {
 #
 SCRIPT_PATH=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
 DEPLOY_DIR=$(cd "${SCRIPT_PATH}/../mcp/scripts"; pwd)
+STORAGE_DIR=$(cd "${SCRIPT_PATH}/../mcp/deploy/images"; pwd)
 DEPLOY_TYPE='baremetal'
 OPNFV_BRIDGES=('pxebr' 'mgmt' 'internal' 'public')
 URI_REGEXP='(file|https?|ftp)://.*'
 
-export SSH_KEY=${SSH_KEY:-mcp.rsa}
+# NOTE: When this script runs with sudo, key will land in /root/opnfv/mcp.rsa,
+# unless SSH_KEY is set to point to non-root user's home (e.g. via env var).
+export SSH_KEY=${SSH_KEY:-"${HOME}/opnfv/mcp.rsa"}
 export SALT_MASTER=${SALT_MASTER_IP:-192.168.10.100}
 export MAAS_IP=${MAAS_IP:-192.168.10.3}
 export SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${SSH_KEY}"
@@ -147,7 +151,6 @@ set +x
 USE_EXISTING_FUEL=''
 FUEL_CREATION_ONLY=''
 NO_DEPLOY_ENVIRONMENT=''
-STORAGE_DIR=''
 DRY_RUN=0
 if ! [ -z "${DEPLOY_TIMEOUT}" ]; then
     DEPLOY_TIMEOUT="-dt ${DEPLOY_TIMEOUT}"
@@ -220,7 +223,6 @@ do
             DEPLOY_SCENARIO=${OPTARG}
             ;;
         S)
-            notify '' 3 "${OPTION}"; continue
             if [[ ${OPTARG} ]]; then
                 STORAGE_DIR="-s ${OPTARG}"
             fi
@@ -295,11 +297,11 @@ if [ "$(uname -i)" = "aarch64" ]; then
 fi
 
 # Check scenario file existence
-if [ ! -f  ../config/scenario/${DEPLOY_TYPE}/${DEPLOY_SCENARIO}.yaml ]; then
+if [ ! -f  "../config/scenario/${DEPLOY_TYPE}/${DEPLOY_SCENARIO}.yaml" ]; then
     notify "[WARN] ${DEPLOY_SCENARIO}.yaml not found! \
             Setting simplest scenario (os-nosdn-nofeature-noha)\n" 3
     DEPLOY_SCENARIO='os-nosdn-nofeature-noha'
-    if [ ! -f  ../config/scenario/${DEPLOY_TYPE}/${DEPLOY_SCENARIO}.yaml ]; then
+    if [ ! -f  "../config/scenario/${DEPLOY_TYPE}/${DEPLOY_SCENARIO}.yaml" ]; then
         notify "[ERROR] Scenario definition file is missing!\n" 1>&2
         exit 1
     fi
@@ -322,9 +324,10 @@ done
 
 # Infra setup
 generate_ssh_key
-prepare_vms virtual_nodes "${base_image}"
+prepare_vms virtual_nodes "${base_image}" "${STORAGE_DIR}"
 create_networks OPNFV_BRIDGES
-create_vms virtual_nodes virtual_nodes_ram virtual_nodes_vcpus OPNFV_BRIDGES
+create_vms virtual_nodes virtual_nodes_ram virtual_nodes_vcpus \
+  OPNFV_BRIDGES "${STORAGE_DIR}"
 update_mcpcontrol_network
 start_vms virtual_nodes
 check_connection
diff --git a/mcp/deploy/images/.gitkeep b/mcp/deploy/images/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
index 67c960a..1812663 100644 (file)
@@ -4,25 +4,28 @@
 #
 
 generate_ssh_key() {
+  # shellcheck disable=SC2155
+  local mcp_ssh_key=$(basename "${SSH_KEY}")
   local user=${USER}
   if [ -n "${SUDO_USER}" ] && [ "${SUDO_USER}" != 'root' ]; then
     user=${SUDO_USER}
   fi
 
-  if [ -f "/tmp/${SSH_KEY}" ]; then
-    cp "/tmp/${SSH_KEY}" .
-    ssh-keygen -f "${SSH_KEY}" -y > "${SSH_KEY}.pub"
+  if [ -f "${SSH_KEY}" ]; then
+    cp "${SSH_KEY}" .
+    ssh-keygen -f "${mcp_ssh_key}" -y > "${mcp_ssh_key}.pub"
   fi
 
-  [ -f "${SSH_KEY}" ] || ssh-keygen -f "${SSH_KEY}" -N ''
-  install -o "${user}" -m 0600 "${SSH_KEY}" /tmp/
+  [ -f "${mcp_ssh_key}" ] || ssh-keygen -f "${mcp_ssh_key}" -N ''
+  install -D -o "${user}" -m 0600 "${mcp_ssh_key}" "${SSH_KEY}"
 }
 
 get_base_image() {
   local base_image=$1
+  local image_dir=$2
 
-  mkdir -p images
-  wget -P /tmp -N "${base_image}"
+  mkdir -p "${image_dir}"
+  wget -P "${image_dir}" -N "${base_image}"
 }
 
 cleanup_vms() {
@@ -38,18 +41,19 @@ cleanup_vms() {
 prepare_vms() {
   local -n vnodes=$1
   local base_image=$2
+  local image_dir=$3
 
   cleanup_vms
-  get_base_image "${base_image}"
+  get_base_image "${base_image}" "${image_dir}"
   envsubst '${SALT_MASTER},${CLUSTER_DOMAIN}' < \
     user-data.template > user-data.sh
 
   for node in "${vnodes[@]}"; do
     # create/prepare images
-    ./create-config-drive.sh -k "${SSH_KEY}.pub" -u user-data.sh \
-       -h "${node}" "images/mcp_${node}.iso"
-    cp "/tmp/${base_image/*\/}" "images/mcp_${node}.qcow2"
-    qemu-img resize "images/mcp_${node}.qcow2" 100G
+    ./create-config-drive.sh -k "$(basename "${SSH_KEY}").pub" -u user-data.sh \
+       -h "${node}" "${image_dir}/mcp_${node}.iso"
+    cp "${image_dir}/${base_image/*\/}" "${image_dir}/mcp_${node}.qcow2"
+    qemu-img resize "${image_dir}/mcp_${node}.qcow2" 100G
   done
 }
 
@@ -77,6 +81,7 @@ create_vms() {
   local -n vnodes_ram=$2
   local -n vnodes_vcpus=$3
   local -n vnode_networks=$4
+  local image_dir=$5
 
   # AArch64: prepare arch specific arguments
   local virt_extra_args=""
@@ -106,10 +111,10 @@ create_vms() {
     virt-install --name "${node}" \
     --ram "${vnodes_ram[$node]}" --vcpus "${vnodes_vcpus[$node]}" \
     --cpu host-passthrough --accelerate ${net_args} \
-    --disk path="$(pwd)/images/mcp_${node}.qcow2",format=qcow2,bus=virtio,cache=none,io=native \
+    --disk path="${image_dir}/mcp_${node}.qcow2",format=qcow2,bus=virtio,cache=none,io=native \
     --os-type linux --os-variant none \
     --boot hd --vnc --console pty --autostart --noreboot \
-    --disk path="$(pwd)/images/mcp_${node}.iso",device=cdrom \
+    --disk path="${image_dir}/mcp_${node}.iso",device=cdrom \
     --noautoconsole \
     ${virt_extra_args}
   done
@@ -117,7 +122,9 @@ create_vms() {
 
 update_mcpcontrol_network() {
   # set static ip address for salt master node, MaaS node
+  # shellcheck disable=SC2155
   local cmac=$(virsh domiflist cfg01 2>&1| awk '/mcpcontrol/ {print $5; exit}')
+  # shellcheck disable=SC2155
   local amac=$(virsh domiflist mas01 2>&1| awk '/mcpcontrol/ {print $5; exit}')
   virsh net-update "mcpcontrol" add ip-dhcp-host \
     "<host mac='${cmac}' name='cfg01' ip='${SALT_MASTER}'/>" --live