aboutsummaryrefslogtreecommitdiffstats
path: root/mcp/scripts/salt.sh
blob: 46ef6ffbf2f8e0476c5d7af5d69f90133f9cb613 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/bin/bash -e
##############################################################################
# Copyright (c) 2017 Mirantis Inc., Enea AB 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
##############################################################################
#
# Deploy Salt Master
#

CI_DEBUG=${CI_DEBUG:-0}; [[ "${CI_DEBUG}" =~ (false|0) ]] || set -x
F_GIT_ROOT=$(git rev-parse --show-toplevel)
F_GIT_DIR=$(cd "${F_GIT_ROOT}/mcp" && git rev-parse --git-dir)
F_GIT_SUBD=${F_GIT_ROOT#${F_GIT_DIR%%/.git*}}
OPNFV_TMP_DIR="/home/${SALT_MASTER_USER}/opnfv"
OPNFV_GIT_DIR="/root/opnfv"
OPNFV_FUEL_DIR="/root/fuel" # Should be in sync with patch.sh, scripts patches
OPNFV_RDIR="reclass/classes/cluster/all-mcp-arch-common"
OPNFV_VCP_IMG="mcp/scripts/base_image_opnfv_fuel_vcp.img"
OPNFV_VCP_DIR="/srv/salt/env/prd/salt/files/control/images"
LOCAL_GIT_DIR="${F_GIT_ROOT%${F_GIT_SUBD}}"
LOCAL_PDF_RECLASS=$1; shift
# shellcheck disable=SC2116,SC2086
LOCAL_VIRT_NODES=$(echo ${*//cfg01/}) # unquoted to filter space
NODE_MASK="${LOCAL_VIRT_NODES// /|}"

# push to cfg01 current git repo first (including submodules), at ~ubuntu/opnfv
# later we move it to ~root/opnfv (and ln as ~root/fuel); delete the temp clone
remote_tmp="${SSH_SALT}:$(basename "${OPNFV_TMP_DIR}")"
STORAGE_DIR=$(dirname "${LOCAL_PDF_RECLASS}")
REL_STORAGE_DIR_PATH=${STORAGE_DIR#${LOCAL_GIT_DIR}}
if [[ "${REL_STORAGE_DIR_PATH}" == "${STORAGE_DIR}" ]]
then
  REL_STORAGE_DIR_PATH=""
fi
rsync -Erl --delete -e "ssh ${SSH_OPTS}" \
  --exclude={.gitignore,"$REL_STORAGE_DIR_PATH"} \
  "${LOCAL_GIT_DIR}/" "${remote_tmp}/"
if [ -n "${LOCAL_PDF_RECLASS}" ] && [ -f "${LOCAL_PDF_RECLASS}" ]; then
  rsync -e "ssh ${SSH_OPTS}" "${LOCAL_PDF_RECLASS}" \
    "${remote_tmp}${F_GIT_SUBD}/mcp/${OPNFV_RDIR}/opnfv/"
fi
local_vcp_img=$(dirname "${LOCAL_PDF_RECLASS}")/$(basename "${OPNFV_VCP_IMG}")
if [ -e "${local_vcp_img}" ]; then
  rsync -L -e "ssh ${SSH_OPTS}" "${local_vcp_img}" \
    "${remote_tmp}${F_GIT_SUBD}/${OPNFV_VCP_IMG}"
fi

# ssh to cfg01
# shellcheck disable=SC2086,2087
ssh ${SSH_OPTS} "${SSH_SALT}" bash -s -e << SALT_INSTALL_END
  sudo -i
  set -e
  export TERM=${TERM}
  export CI_DEBUG=${CI_DEBUG}; [[ "${CI_DEBUG}" =~ (false|0) ]] || set -x

  echo -n 'Checking out cloud-init has finished running ...'
  while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo -n '.'; sleep 1; done
  echo ' done'

  mkdir -p /srv/salt /usr/share/salt-formulas/reclass
  rm -rf ${OPNFV_GIT_DIR} ${OPNFV_FUEL_DIR}
  mv ${OPNFV_TMP_DIR} ${OPNFV_GIT_DIR} && chown -R root.root ${OPNFV_GIT_DIR}
  find ${OPNFV_GIT_DIR} -name '.git' -type f | while read f_git; do
    sed -i 's@${LOCAL_GIT_DIR}@${OPNFV_GIT_DIR}@g' \$f_git
  done
  ln -sf ${OPNFV_GIT_DIR}${F_GIT_SUBD} ${OPNFV_FUEL_DIR}
  ln -sf ${OPNFV_FUEL_DIR}/mcp/reclass /srv/salt
  ln -sf ${OPNFV_FUEL_DIR}/mcp/deploy/scripts /srv/salt
  ln -sf ${OPNFV_FUEL_DIR}/mcp/scripts/mcp.rsa $(dirname "${OPNFV_FUEL_DIR}")

  cp -r ${OPNFV_FUEL_DIR}/mcp/metadata/service /usr/share/salt-formulas/reclass
  cd /srv/salt/reclass/classes/service && \
    ln -sf /usr/share/salt-formulas/reclass/service/opendaylight

  # Armband APT-MK nightly/extra repo for forked & extended reclass
  wget -qO - https://linux.enea.com/apt-mk/public.gpg | apt-key add -
  echo 'deb http://linux.enea.com/apt-mk/xenial nightly extra' > \
    '/etc/apt/sources.list.d/armband_mcp_extra.list'
  apt-get update

  cd /srv/salt/scripts
  export DEBIAN_FRONTEND=noninteractive
  echo 'Dpkg::Use-Pty "0";' > /etc/apt/apt.conf.d/90silence-dpkg
  OLD_DOMAIN=\$(grep -sPzo "id: cfg01\.\K(\S*)" /etc/salt/minion.d/minion.conf) || true
  BOOTSTRAP_SALTSTACK_OPTS=" -r -dX stable 2017.7 " \
    MASTER_HOSTNAME=cfg01.${CLUSTER_DOMAIN} DISTRIB_REVISION=nightly \
      EXTRA_FORMULAS="nfs panko gnocchi oslo-templates" \
        ./salt-master-init.sh
  salt-key -Ay

  cp -r ${OPNFV_FUEL_DIR}/mcp/salt-formulas/* /usr/share/salt-formulas/env
  cd ${OPNFV_FUEL_DIR}/mcp/patches && ./patch.sh patches.list formulas
  cd ${OPNFV_FUEL_DIR}/mcp/patches && ./patch.sh patches.list reclass

  source ${OPNFV_FUEL_DIR}/mcp/scripts/lib.sh
  wait_for 3.0 "salt-call state.apply salt"

  # In case scenario changed (and implicitly domain name), re-register minions
  if [ -n "\${OLD_DOMAIN}" ] && [ "\${OLD_DOMAIN}" != "${CLUSTER_DOMAIN}" ]; then
    salt "*.\${OLD_DOMAIN}" cmd.run "grep \${OLD_DOMAIN} -sRl /etc/salt | \
      xargs --no-run-if-empty sed -i 's/\${OLD_DOMAIN}/${CLUSTER_DOMAIN}/g'; \
        service salt-minion restart" || true
    salt-key -yd "*.\${OLD_DOMAIN}"
    salt-key -Ay
  fi

  # Init specific to VMs on FN (all for virtual, cfg|mas for baremetal)
  wait_for 3.0 'salt -C "cfg01*" state.apply linux'
  if [[ "${LOCAL_VIRT_NODES}" =~ mas ]]; then
    wait_for 3.0 'salt -C "mas*" test.ping'
  else
    wait_for 3.0 '(for n in ${LOCAL_VIRT_NODES}; do salt -C \${n}.* test.ping || exit; done)'
  fi
  wait_for 3.0 'salt -C "E@^(${NODE_MASK}|cfg01).*" saltutil.sync_all'
  wait_for 3.0 'salt -C "E@^(${NODE_MASK}|cfg01).*" state.apply salt'

  wait_for 3.0 'salt -C "E@^(${NODE_MASK}).*" state.sls linux.system,linux.storage'
  wait_for 2.0 'salt -C "E@^(${NODE_MASK}).*" state.sls linux.network'
  salt -C "E@^(${NODE_MASK}).*" system.reboot
  wait_for 90.0 'salt -C "E@^(${NODE_MASK}).*" test.ping'
  wait_for 3.0 'salt -C "E@^(${NODE_MASK}).*" pkg.upgrade refresh=False dist_upgrade=True'

  wait_for 3.0 'salt -C "E@^(${NODE_MASK}|cfg01).*" state.sls ntp'

  if [ -f "${OPNFV_FUEL_DIR}/${OPNFV_VCP_IMG}" ]; then
    mkdir -p "${OPNFV_VCP_DIR}"
    mv "${OPNFV_FUEL_DIR}/${OPNFV_VCP_IMG}" "${OPNFV_VCP_DIR}/"
  fi
SALT_INSTALL_END