Browse code

Refactor vagrant provision scripts for reuse

This change factors reusable functionality out of the vagrant provision
scripts into a utility script (provision-util.sh) to make maintenance
easier.

Maru Newby authored on 2015/08/08 08:42:11
Showing 7 changed files
... ...
@@ -1,6 +1,7 @@
1 1
 /_output
2 2
 /_tools
3 3
 /openshift.local.*
4
+/third-party
4 5
 /.project
5 6
 /.vagrant
6 7
 /cpu.pprof
... ...
@@ -155,7 +155,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
155 155
         minion_ip = minion_ips[n]
156 156
         minion.vm.box = kube_box[kube_os]["name"]
157 157
         minion.vm.box_url = kube_box[kube_os]["box_url"]
158
-        minion.vm.provision "shell", inline: "/vagrant/vagrant/provision-minion.sh #{master_ip} #{num_minion} #{minion_ips_str} #{minion_ip} #{minion_index} #{ENV['OPENSHIFT_SDN']}"
158
+        minion.vm.provision "shell", inline: "/vagrant/vagrant/provision-minion.sh #{master_ip} #{num_minion} #{minion_ips_str} #{minion_ip} #{minion_index}"
159 159
         minion.vm.network "private_network", ip: "#{minion_ip}"
160 160
         minion.vm.hostname = "openshift-minion-#{minion_index}"
161 161
       end
... ...
@@ -1,10 +1,21 @@
1 1
 #!/bin/bash
2
-set -e
2
+
3
+set -o errexit
4
+set -o nounset
5
+set -o pipefail
6
+
7
+ORIGIN_ROOT=$(
8
+  unset CDPATH
9
+  origin_root=$(dirname "${BASH_SOURCE}")/..
10
+  cd "${origin_root}"
11
+  pwd
12
+)
13
+source ${ORIGIN_ROOT}/vagrant/provision-util.sh
3 14
 
4 15
 # Passed as arguments to provisioning from Vagrantfile
5
-MASTER_IP=$1
6
-NUM_MINIONS=$2
7
-MINION_IPS=$3
16
+MASTER_IP=${1:-""}
17
+NUM_MINIONS=${2:-""}
18
+MINION_IPS=${3:-""}
8 19
 
9 20
 INSTANCE_PREFIX=openshift
10 21
 MASTER_NAME="${INSTANCE_PREFIX}-master"
... ...
@@ -3,86 +3,38 @@
3 3
 set -ex
4 4
 source $(dirname $0)/provision-config.sh
5 5
 
6
-OPENSHIFT_SDN=$4
7
-if [ "${OPENSHIFT_SDN}" == "redhat/openshift-ovs-multitenant" ] || [ "${OPENSHIFT_SDN}" == "redhat/openshift-ovs-subnet" ] || [ "${OPENSHIFT_SDN}" == "" ]; then
8
-	OPENSHIFT_SDN_PLUGIN=${OPENSHIFT_SDN}
9
-fi
10
-OPENSHIFT_SDN_PLUGIN=${OPENSHIFT_SDN_PLUGIN:-redhat/openshift-ovs-subnet}
6
+NETWORK_PLUGIN=$(os::util::get-network-plugin ${4:-""})
11 7
 
12 8
 NETWORK_CONF_PATH=/etc/sysconfig/network-scripts/
13 9
 sed -i 's/^NM_CONTROLLED=no/#NM_CONTROLLED=no/' ${NETWORK_CONF_PATH}ifcfg-eth1
14 10
 
15 11
 systemctl restart network
16 12
 
17
-# Setup hosts file to support ping by hostname to each minion in the cluster from apiserver
18
-node_list=""
13
+# Setup hosts file to ensure name resolution to each member of the cluster
19 14
 minion_ip_array=(${MINION_IPS//,/ })
20
-for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
21
-  minion=${MINION_NAMES[$i]}
22
-  node_list="${node_list},${minion}"
23
-  ip=${minion_ip_array[$i]}
24
-  if [ ! "$(cat /etc/hosts | grep $minion)" ]; then
25
-    echo "Adding $minion to hosts file"
26
-    echo "$ip $minion" >> /etc/hosts
27
-  fi
28
-done
29
-if ! grep ${MASTER_IP} /etc/hosts; then
30
-  echo "${MASTER_IP} ${MASTER_NAME}" >> /etc/hosts
31
-fi
32
-node_list=${node_list:1}
15
+os::util::setup-hosts-file "${MASTER_NAME}" "${MASTER_IP}" MINION_NAMES \
16
+  minion_ip_array
33 17
 
34 18
 # Install the required packages
35 19
 yum install -y docker-io git golang e2fsprogs hg net-tools bridge-utils which
36 20
 
37 21
 # Build openshift
38 22
 echo "Building openshift"
39
-pushd /vagrant
23
+pushd "${ORIGIN_ROOT}"
40 24
   ./hack/build-go.sh
41
-  cp _output/local/go/bin/openshift /usr/bin
25
+  os::util::install-cmds "${ORIGIN_ROOT}"
42 26
   ./hack/install-etcd.sh
43 27
 popd
44 28
 
45
-# Initialize certificates
46
-echo "Generating certs"
47
-pushd /vagrant
48
-  SERVER_CONFIG_DIR="`pwd`/openshift.local.config"
49
-  VOLUMES_DIR="/var/lib/openshift.local.volumes"
50
-  MASTER_CONFIG_DIR="${SERVER_CONFIG_DIR}/master"
51
-  CERT_DIR="${MASTER_CONFIG_DIR}"
52
-
53
-  # Master certs
54
-  /usr/bin/openshift admin ca create-master-certs \
55
-    --overwrite=false \
56
-    --cert-dir=${CERT_DIR} \
57
-    --master=https://${MASTER_IP}:8443 \
58
-    --hostnames=${MASTER_IP},${MASTER_NAME}
59
-
60
-  # Certs for nodes
61
-  for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
62
-    minion=${MINION_NAMES[$i]}
63
-    ip=${minion_ip_array[$i]}
64
-
65
-    /usr/bin/openshift admin create-node-config \
66
-      --node-dir="${SERVER_CONFIG_DIR}/node-${minion}" \
67
-      --node="${minion}" \
68
-      --hostnames="${minion},${ip}" \
69
-      --master="https://${MASTER_IP}:8443" \
70
-      --network-plugin="${OPENSHIFT_SDN_PLUGIN}" \
71
-      --node-client-certificate-authority="${CERT_DIR}/ca.crt" \
72
-      --certificate-authority="${CERT_DIR}/ca.crt" \
73
-      --signer-cert="${CERT_DIR}/ca.crt" \
74
-      --signer-key="${CERT_DIR}/ca.key" \
75
-      --signer-serial="${CERT_DIR}/ca.serial.txt" \
76
-      --volume-dir="${VOLUMES_DIR}"
77
-  done
78
-
79
-popd
29
+os::util::init-certs "${ORIGIN_ROOT}" "${NETWORK_PLUGIN}" "${MASTER_NAME}" \
30
+  "${MASTER_IP}" MINION_NAMES minion_ip_array
80 31
 
81 32
 # Start docker
82 33
 systemctl enable docker.service
83 34
 systemctl start docker.service
84 35
 
85 36
 # Create systemd service
37
+node_list=$(os::util::join , ${MINION_NAMES[@]})
86 38
 cat <<EOF > /usr/lib/systemd/system/openshift-master.service
87 39
 [Unit]
88 40
 Description=OpenShift Master
... ...
@@ -90,8 +42,8 @@ Requires=docker.service network.service
90 90
 After=network.service
91 91
 
92 92
 [Service]
93
-ExecStart=/usr/bin/openshift start master --master=https://${MASTER_IP}:8443 --nodes=${node_list} --network-plugin=${OPENSHIFT_SDN_PLUGIN}
94
-WorkingDirectory=/vagrant/
93
+ExecStart=/usr/bin/openshift start master --master=https://${MASTER_IP}:8443 --nodes=${node_list} --network-plugin=${NETWORK_PLUGIN}
94
+WorkingDirectory=${ORIGIN_ROOT}/
95 95
 
96 96
 [Install]
97 97
 WantedBy=multi-user.target
... ...
@@ -102,8 +54,8 @@ systemctl daemon-reload
102 102
 systemctl start openshift-master.service
103 103
 
104 104
 # setup SDN
105
-$(dirname $0)/provision-sdn.sh $@
105
+$(dirname $0)/provision-sdn.sh
106 106
 
107 107
 # Set up the KUBECONFIG environment variable for use by oc
108
-echo 'export KUBECONFIG=/vagrant/openshift.local.config/master/admin.kubeconfig' >> /root/.bash_profile
109
-echo 'export KUBECONFIG=/vagrant/openshift.local.config/master/admin.kubeconfig' >> /home/vagrant/.bash_profile
108
+os::util::set-oc-env "${ORIGIN_ROOT}" "/root/.bash_profile"
109
+os::util::set-oc-env "${ORIGIN_ROOT}" "/home/vagrant/.bash_profile"
... ...
@@ -3,7 +3,6 @@ set -ex
3 3
 source $(dirname $0)/provision-config.sh
4 4
 
5 5
 MINION_IP=$4
6
-OPENSHIFT_SDN=$6
7 6
 MINION_INDEX=$5
8 7
 
9 8
 NETWORK_CONF_PATH=/etc/sysconfig/network-scripts/
... ...
@@ -14,44 +13,29 @@ systemctl restart network
14 14
 # get the minion name, index is 1-based
15 15
 minion_name=${MINION_NAMES[$MINION_INDEX-1]}
16 16
 
17
-# Setup hosts file to support ping by hostname to master
18
-if [ ! "$(cat /etc/hosts | grep $MASTER_NAME)" ]; then
19
-  echo "Adding $MASTER_NAME to hosts file"
20
-  echo "$MASTER_IP $MASTER_NAME" >> /etc/hosts
21
-fi
22
-
23
-# Setup hosts file to support ping by hostname to each minion in the cluster
17
+# Setup hosts file to ensure name resolution to each member of the cluster
24 18
 minion_ip_array=(${MINION_IPS//,/ })
25
-for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
26
-  minion=${MINION_NAMES[$i]}
27
-  ip=${minion_ip_array[$i]}  
28
-  if [ ! "$(cat /etc/hosts | grep $minion)" ]; then
29
-    echo "Adding $minion to hosts file"
30
-    echo "$ip $minion" >> /etc/hosts
31
-  fi
32
-done
33
-if ! grep ${MINION_IP} /etc/hosts; then
34
-  echo "${MINION_IP} ${minion_name}" >> /etc/hosts
35
-fi
19
+os::util::setup-hosts-file "${MASTER_NAME}" "${MASTER_IP}" MINION_NAMES \
20
+  minion_ip_array
36 21
 
37 22
 # Install the required packages
38 23
 yum install -y docker-io git golang e2fsprogs hg openvswitch net-tools bridge-utils which ethtool
39 24
 
40 25
 # Build openshift
41 26
 echo "Building openshift"
42
-pushd /vagrant
27
+pushd "${ORIGIN_ROOT}"
43 28
   ./hack/build-go.sh
44
-  cp _output/local/go/bin/openshift /usr/bin
29
+  os::util::install-cmds "${ORIGIN_ROOT}"
45 30
 popd
46 31
 
47 32
 # Copy over the certificates directory
48
-cp -r /vagrant/openshift.local.config /
33
+cp -r "${ORIGIN_ROOT}/openshift.local.config" /
49 34
 chown -R vagrant.vagrant /openshift.local.config
50 35
 
51 36
 mkdir -p /openshift.local.volumes
52 37
 
53 38
 # Setup SDN
54
-$(dirname $0)/provision-sdn.sh $@
39
+$(dirname $0)/provision-sdn.sh
55 40
 
56 41
 # Create systemd service
57 42
 cat <<EOF > /usr/lib/systemd/system/openshift-node.service
... ...
@@ -75,8 +59,8 @@ systemctl enable openshift-node.service
75 75
 systemctl start openshift-node.service
76 76
 
77 77
 # Set up the KUBECONFIG environment variable for use by the client
78
-echo 'export KUBECONFIG=/openshift.local.config/master/admin.kubeconfig' >> /root/.bash_profile
79
-echo 'export KUBECONFIG=/openshift.local.config/master/admin.kubeconfig' >> /home/vagrant/.bash_profile
78
+os::util::set-oc-env / "/root/.bash_profile"
79
+os::util::set-oc-env / "/home/vagrant/.bash_profile"
80 80
 
81 81
 # Register with the master
82 82
 #curl -X POST -H 'Accept: application/json' -d "{\"kind\":\"Minion\", \"id\":"${MINION_IP}", \"apiVersion\":\"v1beta1\", \"hostIP\":"${MINION_IP}" }" http://${MASTER_IP}:8080/api/v1beta1/minions
... ...
@@ -2,24 +2,12 @@
2 2
 set -ex
3 3
 source $(dirname $0)/provision-config.sh
4 4
 
5
-pushd $HOME
6
-# build openshift-sdn
7
-if [ -d openshift-sdn ]; then
8
-    cd openshift-sdn
9
-    git fetch origin
10
-    git reset --hard origin/master
11
-    git checkout -b multitenant
12
-else
13
-    git clone https://github.com/openshift/openshift-sdn -b multitenant
14
-    cd openshift-sdn
15
-fi
16
-
17
-make clean
18
-make
19
-make install
20
-popd
5
+os::util::install-sdn "${ORIGIN_ROOT}"
21 6
 
22
-systemctl enable openvswitch
23
-systemctl start openvswitch
7
+# Only start openvswitch if it has been installed (only minions).
8
+if rpm -qa | grep -q openvswitch; then
9
+  systemctl enable openvswitch
10
+  systemctl start openvswitch
11
+fi
24 12
 
25 13
 # no need to start openshift-sdn, as it is integrated with openshift binary
26 14
new file mode 100644
... ...
@@ -0,0 +1,145 @@
0
+#!/bin/bash
1
+
2
+os::util::join() {
3
+  local IFS="$1"
4
+
5
+  shift
6
+  echo "$*"
7
+}
8
+
9
+os::util::install-cmds() {
10
+  local deployed_root=$1
11
+
12
+  cp ${deployed_root}/_output/local/go/bin/{openshift,oc} /usr/bin
13
+}
14
+
15
+os::util::add-to-hosts-file() {
16
+  local ip=$1
17
+  local name=$2
18
+
19
+  if ! grep -q "${ip}" /etc/hosts; then
20
+    local entry="${ip}\t${name}"
21
+    echo -e "Adding '${entry}' to hosts file"
22
+    echo -e "${entry}" >> /etc/hosts
23
+  fi
24
+}
25
+
26
+os::util::setup-hosts-file() {
27
+  local master_name=$1
28
+  local master_ip=$2
29
+  local -n node_names=$3
30
+  local -n node_ips=$4
31
+
32
+  # Setup hosts file to support ping by hostname to master
33
+  os::util::add-to-hosts-file "${master_ip}" "${master_name}"
34
+
35
+  # Setup hosts file to support ping by hostname to each node in the cluster
36
+  for (( i=0; i < ${#node_names[@]}; i++ )); do
37
+    os::util::add-to-hosts-file "${node_ips[$i]}" "${node_names[$i]}"
38
+  done
39
+}
40
+
41
+os::util::init-certs() {
42
+  local openshift_root=$1
43
+  local network_plugin=$2
44
+  local master_name=$3
45
+  local master_ip=$4
46
+  local -n node_names=$5
47
+  local -n node_ips=$6
48
+
49
+  local server_config_dir=${openshift_root}/openshift.local.config
50
+  local volumes_dir="/var/lib/openshift.local.volumes"
51
+  local cert_dir="${server_config_dir}/master"
52
+
53
+  echo "Generating certs"
54
+
55
+  pushd "${openshift_root}"
56
+
57
+  # Master certs
58
+  /usr/bin/openshift admin ca create-master-certs \
59
+    --overwrite=false \
60
+    --cert-dir="${cert_dir}" \
61
+    --master="https://${master_ip}:8443" \
62
+    --hostnames="${master_ip},${master_name}"
63
+
64
+  # Certs for nodes
65
+  for (( i=0; i < ${#node_names[@]}; i++ )); do
66
+    local name=${node_names[$i]}
67
+    local ip=${node_ips[$i]}
68
+    /usr/bin/openshift admin create-node-config \
69
+      --node-dir="${server_config_dir}/node-${name}" \
70
+      --node="${name}" \
71
+      --hostnames="${name},${ip}" \
72
+      --master="https://${master_ip}:8443" \
73
+      --network-plugin="${network_plugin}" \
74
+      --node-client-certificate-authority="${cert_dir}/ca.crt" \
75
+      --certificate-authority="${cert_dir}/ca.crt" \
76
+      --signer-cert="${cert_dir}/ca.crt" \
77
+      --signer-key="${cert_dir}/ca.key" \
78
+      --signer-serial="${cert_dir}/ca.serial.txt" \
79
+      --volume-dir="${volumes_dir}"
80
+  done
81
+
82
+  popd
83
+}
84
+
85
+# Set up the KUBECONFIG environment variable for use by oc
86
+os::util::set-oc-env() {
87
+  local deployed_root=$1
88
+  local target=$2
89
+
90
+  if [ "${deployed_root}" = "/" ]; then
91
+    deployed_root=""
92
+  fi
93
+
94
+  local path="${deployed_root}/openshift.local.config/master/admin.kubeconfig"
95
+  echo "export KUBECONFIG=${path}" >> "${target}"
96
+}
97
+
98
+os::util::get-network-plugin() {
99
+  local plugin=$1
100
+
101
+  local subnet_plugin="redhat/openshift-ovs-subnet"
102
+  local multitenant_plugin="redhat/openshift-ovs-multitenant"
103
+  local default_plugin="${subnet_plugin}"
104
+
105
+  if [ "${plugin}" != "${subnet_plugin}" ] && \
106
+     [ "${plugin}" != "${multitenant_plugin}" ]; then
107
+    if [ "${plugin}" != "" ]; then
108
+        >&2 echo "Invalid network plugin: ${plugin}"
109
+    fi
110
+    >&2 echo "Using default network plugin: ${default_plugin}"
111
+    plugin="${default_plugin}"
112
+  fi
113
+  echo "${plugin}"
114
+}
115
+
116
+os::util::install-sdn() {
117
+  local deployed_root=$1
118
+
119
+  # Source scripts from an openshift-sdn repo if present to support
120
+  # openshift-sdn development.
121
+  local sdn_root="${deployed_root}/third-party/openshift-sdn"
122
+  if [ -d "${sdn_root}" ]; then
123
+    pushd "${sdn_root}"
124
+      make
125
+      make "install-dev"
126
+    popd
127
+  else
128
+    local osdn_base_path="${deployed_root}/Godeps/_workspace/src/github.com/openshift/openshift-sdn"
129
+    local osdn_controller_path="${osdn_base_path}/ovssubnet/controller"
130
+    pushd "${osdn_controller_path}"
131
+      # The subnet plugin is discovered via the kube network plugin path.
132
+      local kube_osdn_path="/usr/libexec/kubernetes/kubelet-plugins/net/exec/redhat~openshift-ovs-subnet"
133
+      mkdir -p "${kube_osdn_path}"
134
+      cp -f kube/bin/openshift-ovs-subnet "${kube_osdn_path}/"
135
+      cp -f kube/bin/openshift-sdn-kube-subnet-setup.sh /usr/bin/
136
+
137
+      # The multitenant plugin only needs to be in PATH because the
138
+      # origin multitenant plugin knows how to discover it.
139
+      cp -f multitenant/bin/openshift-ovs-multitenant /usr/bin/
140
+      cp -f multitenant/bin/openshift-sdn-multitenant-setup.sh /usr/bin/
141
+    popd
142
+  fi
143
+
144
+}