Add explicit network configuration to nodes.json
[icn.git] / deploy / metal3-vm / 03_launch_mgmt_cluster.sh
1 #!/usr/bin/env bash
2 set -eux -o pipefail
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 DEPLOYDIR="$(dirname "$PWD")"
12 BMODIR=$DEPLOYDIR/metal3/scripts/bmo
13
14 # Environment variables
15 # M3PATH : Path to clone the metal3 dev env repo
16 # BMOPATH : Path to clone the baremetal operator repo
17 #
18 # BMOREPO : Baremetal operator repository URL
19 # BMOBRANCH : Baremetal operator repository branch to checkout
20 # FORCE_REPO_UPDATE : discard existing directories
21 #
22 # BMO_RUN_LOCAL : run the baremetal operator locally (not in Kubernetes cluster)
23
24 M3PATH="${GOPATH}/src/github.com/metal3-io"
25 BMOPATH="${M3PATH}/baremetal-operator"
26
27 BMOREPO="${BMOREPO:-https://github.com/metal3-io/baremetal-operator.git}"
28 BMOBRANCH="${BMOBRANCH:-10eb5aa3e614d0fdc6315026ebab061cbae6b929}"
29 FORCE_REPO_UPDATE="${FORCE_REPO_UPDATE:-true}"
30
31 BMO_RUN_LOCAL="${BMO_RUN_LOCAL:-false}"
32 COMPUTE_NODE_PASSWORD="${COMPUTE_NODE_PASSWORD:-mypasswd}"
33 BM_IMAGE=${BM_IMAGE:-"bionic-server-cloudimg-amd64.img"}
34 IMAGE_URL=http://172.22.0.1/images/${BM_IMAGE}
35 IMAGE_CHECKSUM=http://172.22.0.1/images/${BM_IMAGE}.md5sum
36
37 function clone_repos {
38     mkdir -p "${M3PATH}"
39     if [[ -d ${BMOPATH} && "${FORCE_REPO_UPDATE}" == "true" ]]; then
40       rm -rf "${BMOPATH}"
41     fi
42     if [ ! -d "${BMOPATH}" ] ; then
43         pushd "${M3PATH}"
44         git clone "${BMOREPO}"
45         popd
46     fi
47     pushd "${BMOPATH}"
48     git checkout "${BMOBRANCH}"
49     git pull -r || true
50     popd
51 }
52
53 function launch_baremetal_operator {
54     docker pull $IRONIC_BAREMETAL_IMAGE
55     kubectl apply -f $BMODIR/namespace/namespace.yaml
56     kubectl apply -f $BMODIR/rbac/service_account.yaml -n metal3
57     kubectl apply -f $BMODIR/rbac/role.yaml -n metal3
58     kubectl apply -f $BMODIR/rbac/role_binding.yaml
59     kubectl apply -f $BMODIR/crds/metal3.io_baremetalhosts_crd.yaml
60     kubectl apply -f $BMODIR/operator/no_ironic/operator.yaml -n metal3
61 }
62
63 # documentation for the values below may be found at
64 # https://cloudinit.readthedocs.io/en/latest/topics/modules.html
65 create_userdata() {
66     name="$1"
67     COMPUTE_NODE_FQDN="$name.akraino.icn.org"
68     printf "#cloud-config\n" > $name-userdata.yaml
69     if [ -n "$COMPUTE_NODE_PASSWORD" ]; then
70         printf "password: ""%s" "$COMPUTE_NODE_PASSWORD" >>  $name-userdata.yaml
71         printf "\nchpasswd: {expire: False}\n" >>  $name-userdata.yaml
72         printf "ssh_pwauth: True\n" >>  $name-userdata.yaml
73     fi
74
75     if [ -n "$COMPUTE_NODE_FQDN" ]; then
76         printf "fqdn: ""%s" "$COMPUTE_NODE_FQDN" >>  $name-userdata.yaml
77         printf "\n" >>  $name-userdata.yaml
78     fi
79     printf "disable_root: false\n" >> $name-userdata.yaml
80     printf "ssh_authorized_keys:\n  - " >> $name-userdata.yaml
81
82     if [ ! -f $HOME/.ssh/id_rsa.pub ]; then
83         yes y | ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa
84     fi
85
86     cat $HOME/.ssh/id_rsa.pub >> $name-userdata.yaml
87     printf "\n" >> $name-userdata.yaml
88 }
89
90 apply_userdata_credential() {
91     name="$1"
92     cat <<EOF > ./$name-user-data-credential.yaml
93 apiVersion: v1
94 data:
95   userData: $(base64 -w 0 $name-userdata.yaml)
96 kind: Secret
97 metadata:
98   name: $name-user-data
99   namespace: metal3
100 type: Opaque
101 EOF
102     kubectl apply -n metal3 -f $name-user-data-credential.yaml
103 }
104
105 create_networkdata() {
106     name="$1"
107     node_networkdata $name > $name-networkdata.json
108 }
109
110 apply_networkdata_credential() {
111     name="$1"
112     cat <<EOF > ./$name-network-data-credential.yaml
113 apiVersion: v1
114 data:
115   networkData: $(base64 -w 0 $name-networkdata.json)
116 kind: Secret
117 metadata:
118   name: $name-network-data
119   namespace: metal3
120 type: Opaque
121 EOF
122     kubectl apply -n metal3 -f $name-network-data-credential.yaml
123 }
124
125 function make_bm_hosts {
126     while IFS=',' read -r name address user password mac; do
127         create_userdata $name
128         apply_userdata_credential $name
129         create_networkdata $name
130         apply_networkdata_credential $name
131         GO111MODULE=auto go run "${BMOPATH}"/cmd/make-bm-worker/main.go \
132            -address "$address" \
133            -password "$password" \
134            -user "$user" \
135            -boot-mac "$mac" \
136            "$name" > $name-bm-node.yaml
137         printf "  image:" >> $name-bm-node.yaml
138         printf "\n    url: ""%s" "${IMAGE_URL}" >> $name-bm-node.yaml
139         printf "\n    checksum: ""%s" "${IMAGE_CHECKSUM}" >> $name-bm-node.yaml
140         printf "\n  userData:" >> $name-bm-node.yaml
141         printf "\n    name: ""%s" "$name""-user-data" >> $name-bm-node.yaml
142         printf "\n    namespace: metal3" >> $name-bm-node.yaml
143         printf "\n  networkData:" >> $name-bm-node.yaml
144         printf "\n    name: ""%s" "$name""-network-data" >> $name-bm-node.yaml
145         printf "\n    namespace: metal3" >> $name-bm-node.yaml
146         printf "\n  rootDeviceHints:" >> $name-bm-node.yaml
147         printf "\n    minSizeGigabytes: 48\n" >> $name-bm-node.yaml
148         kubectl apply -f $name-bm-node.yaml -n metal3
149     done
150 }
151
152 function apply_bm_hosts {
153     list_nodes | make_bm_hosts
154 }
155
156 clone_repos
157 launch_baremetal_operator
158 apply_bm_hosts