adding icn version fixes in metal3 vm
[icn.git] / deploy / metal3-vm / 03_launch_mgmt_cluster.sh
1 #!/bin/bash
2 set -xe
3
4 # shellcheck disable=SC1091
5 source lib/logging.sh
6 # shellcheck disable=SC1091
7 source lib/common.sh
8
9 eval "$(go env)"
10 export GOPATH
11
12 # Environment variables
13 # M3PATH : Path to clone the metal3 dev env repo
14 # BMOPATH : Path to clone the baremetal operator repo
15 #
16 # BMOREPO : Baremetal operator repository URL
17 # BMOBRANCH : Baremetal operator repository branch to checkout
18 # FORCE_REPO_UPDATE : discard existing directories
19 #
20 # BMO_RUN_LOCAL : run the baremetal operator locally (not in Kubernetes cluster)
21
22 M3PATH="${GOPATH}/src/github.com/metal3-io"
23 BMOPATH="${M3PATH}/baremetal-operator"
24
25 BMOREPO="${BMOREPO:-https://github.com/metal3-io/baremetal-operator.git}"
26 BMOBRANCH="${BMOBRANCH:-10eb5aa3e614d0fdc6315026ebab061cbae6b929}"
27 FORCE_REPO_UPDATE="${FORCE_REPO_UPDATE:-true}"
28
29 BMO_RUN_LOCAL="${BMO_RUN_LOCAL:-false}"
30 COMPUTE_NODE_PASSWORD="${COMPUTE_NODE_PASSWORD:-mypasswd}"
31 BM_IMAGE=${BM_IMAGE:-"bionic-server-cloudimg-amd64.img"}
32 IMAGE_URL=http://172.22.0.1/images/${BM_IMAGE}
33 IMAGE_CHECKSUM=http://172.22.0.1/images/${BM_IMAGE}.md5sum
34
35 function clone_repos {
36     mkdir -p "${M3PATH}"
37     if [[ -d ${BMOPATH} && "${FORCE_REPO_UPDATE}" == "true" ]]; then
38       rm -rf "${BMOPATH}"
39     fi
40     if [ ! -d "${BMOPATH}" ] ; then
41         pushd "${M3PATH}"
42         git clone "${BMOREPO}"
43         popd
44     fi
45     pushd "${BMOPATH}"
46     git checkout "${BMOBRANCH}"
47     git pull -r || true
48     popd
49 }
50
51 function launch_baremetal_operator {
52     docker pull integratedcloudnative/baremetal-operator:v1.0-icn
53     docker tag integratedcloudnative/baremetal-operator:v1.0-icn \
54         quay.io/metal3-io/baremetal-operator:master
55
56     pushd "${BMOPATH}"
57     if [ "${BMO_RUN_LOCAL}" = true ]; then
58         touch bmo.out.log
59         touch bmo.err.log
60         kubectl apply -f deploy/namespace/namespace.yaml
61         kubectl apply -f deploy/rbac/service_account.yaml -n metal3
62         kubectl apply -f deploy/rbac/role.yaml -n metal3
63         kubectl apply -f deploy/rbac/role_binding.yaml
64         kubectl apply -f deploy/crds/metal3.io_baremetalhosts_crd.yaml
65         kubectl apply -f deploy/operator/no_ironic/operator.yaml -n metal3
66         kubectl scale deployment metal3-baremetal-operator -n metal3 --replicas=0
67         nohup make run >> bmo.out.log 2>>bmo.err.log &
68     else
69         kubectl apply -f deploy/namespace/namespace.yaml
70         kubectl apply -f deploy/rbac/service_account.yaml -n metal3
71         kubectl apply -f deploy/rbac/role.yaml -n metal3
72         kubectl apply -f deploy/rbac/role_binding.yaml
73         kubectl apply -f deploy/crds/metal3.io_baremetalhosts_crd.yaml
74         kubectl apply -f deploy/operator/no_ironic/operator.yaml -n metal3
75     fi
76     popd
77 }
78
79 network_config_files() {
80 cat << 'EOF'
81 write_files:
82 - path: /opt/ironic_net.sh
83   owner: root:root
84   permissions: '0777'
85   content: |
86     #!/usr/bin/env bash
87     set -xe
88     for intf in /sys/class/net/*; do
89         sudo ifconfig `basename $intf` up
90         sudo dhclient -nw `basename $intf`
91     done
92 runcmd:
93  - [ /opt/ironic_net.sh ]
94 EOF
95 }
96
97 create_userdata() {
98     name="$1"
99     COMPUTE_NODE_FQDN="$name.akraino.icn.org"
100     printf "#cloud-config\n" > $name-userdata.yaml
101     if [ -n "$COMPUTE_NODE_PASSWORD" ]; then
102         printf "password: ""%s" "$COMPUTE_NODE_PASSWORD" >>  $name-userdata.yaml
103         printf "\nchpasswd: {expire: False}\n" >>  $name-userdata.yaml
104         printf "ssh_pwauth: True\n" >>  $name-userdata.yaml
105     fi
106
107     if [ -n "$COMPUTE_NODE_FQDN" ]; then
108         printf "fqdn: ""%s" "$COMPUTE_NODE_FQDN" >>  $name-userdata.yaml
109         printf "\n" >>  $name-userdata.yaml
110     fi
111     printf "disable_root: false\n" >> $name-userdata.yaml
112     printf "ssh_authorized_keys:\n  - " >> $name-userdata.yaml
113
114     if [ ! -f $HOME/.ssh/id_rsa.pub ]; then
115         yes y | ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa
116     fi
117
118     cat $HOME/.ssh/id_rsa.pub >> $name-userdata.yaml
119     network_config_files >> $name-userdata.yaml
120     printf "\n" >> $name-userdata.yaml
121 }
122
123 apply_userdata_credential() {
124     name="$1"
125     cat <<EOF > ./$name-user-data-credential.yaml
126 apiVersion: v1
127 data:
128   userData: $(base64 -w 0 $name-userdata.yaml)
129 kind: Secret
130 metadata:
131   name: $name-user-data
132   namespace: metal3
133 type: Opaque
134 EOF
135     kubectl apply -n metal3 -f $name-user-data-credential.yaml
136 }
137
138 function make_bm_hosts {
139     while read -r name address user password mac; do
140         create_userdata $name
141         apply_userdata_credential $name
142         go run "${BMOPATH}"/cmd/make-bm-worker/main.go \
143            -address "$address" \
144            -password "$password" \
145            -user "$user" \
146            -boot-mac "$mac" \
147            "$name" > $name-bm-node.yaml
148         printf "  image:" >> $name-bm-node.yaml
149         printf "\n    url: ""%s" "${IMAGE_URL}" >> $name-bm-node.yaml
150         printf "\n    checksum: ""%s" "${IMAGE_CHECKSUM}" >> $name-bm-node.yaml
151         printf "\n  userData:" >> $name-bm-node.yaml
152         printf "\n    name: ""%s" "$name""-user-data" >> $name-bm-node.yaml
153         printf "\n    namespace: metal3\n" >> $name-bm-node.yaml
154         kubectl apply -f $name-bm-node.yaml -n metal3
155     done
156 }
157
158 function apply_bm_hosts {
159     list_nodes | make_bm_hosts
160 }
161
162
163 clone_repos
164 launch_baremetal_operator
165 apply_bm_hosts