adding inital packages for bootstrap cluster
[icn.git] / deploy / metal3 / scripts / metal3.sh
1 #!/bin/bash
2 set -ex
3
4 LIBDIR="$(dirname "$(dirname "$(dirname "$PWD")")")"
5
6 eval "$(go env)"
7
8 BM_OPERATOR="${BM_OPERATOR:-https://github.com/metal3-io/baremetal-operator.git}"
9
10 source $LIBDIR/env/lib/common.sh
11
12 function get_default_inteface_ipaddress() {
13     local _ip=$1
14     local _default_interface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
15     local _ipv4address=$(ip addr show dev $_default_interface | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }')
16     eval $_ip="'$_ipv4address'"
17 }
18
19 create_ssh_key() {
20         #ssh key for compute node to communicate back to bootstrap server
21         mkdir -p $BUILD_DIR/ssh_key
22         ssh-keygen -C "compute.icn.akraino.lfedge.org" -f $BUILD_DIR/ssh_key/id_rsa
23         cat $BUILD_DIR/ssh_key/id_rsa.pub >> $HOME/.ssh/authorized_keys
24 }
25
26 set_compute_key() {
27 _SSH_LOCAL_KEY=$(cat $BUILD_DIR/ssh_key/id_rsa)
28 cat << EOF
29 write_files:
30 - path: /opt/ssh_id_rsa
31   owner: root:root
32   permissions: '0600'
33   content: |
34     $_SSH_LOCAL_KEY
35 EOF
36 }
37
38 provision_compute_node() {
39         IMAGE_URL=http://172.22.0.1/images/${BM_IMAGE}
40         IMAGE_CHECKSUM=http://172.22.0.1/images/${BM_IMAGE}.md5sum
41
42         if [ ! -d $GOPATH/src/github.com/metal3-io/baremetal-operator ]; then
43                 go get github.com/metal3-io/baremetal-operator
44         fi
45
46         go run $GOPATH/src/github.com/metal3-io/baremetal-operator/cmd/make-bm-worker/main.go \
47            -address "ipmi://$COMPUTE_IPMI_ADDRESS" \
48                    -user "$COMPUTE_IPMI_USER" \
49            -password "$COMPUTE_IPMI_PASSWORD" \
50            "$COMPUTE_NODE_NAME" > $COMPUTE_NODE_NAME-bm-node.yaml
51
52         printf "  image:" >> $COMPUTE_NODE_NAME-bm-node.yaml
53         printf "\n    url: ""%s" "$IMAGE_URL" >> $COMPUTE_NODE_NAME-bm-node.yaml
54         printf "\n    checksum: ""%s" "$IMAGE_CHECKSUM" >> $COMPUTE_NODE_NAME-bm-node.yaml
55         printf "\n  userData:" >> $COMPUTE_NODE_NAME-bm-node.yaml
56         printf "\n    name: ""%s" "$COMPUTE_NODE_NAME""-user-data" >> $COMPUTE_NODE_NAME-bm-node.yaml
57         printf "\n    namespace: metal3\n" >> $COMPUTE_NODE_NAME-bm-node.yaml
58         kubectl apply -f $COMPUTE_NODE_NAME-bm-node.yaml
59 }
60
61 deprovision_compute_node() {
62         kubectl patch baremetalhost $COMPUTE_NODE_NAME -n metal3 --type merge \
63     -p '{"spec":{"image":{"url":"","checksum":""}}}'
64 }
65
66 set_compute_ssh_config() {
67 get_default_inteface_ipaddress default_addr
68 cat << EOF
69 - path: /root/.ssh/config
70   owner: root:root
71   permissions: '0600'
72   content: |
73     Host bootstrapmachine $default_addr
74     HostName $default_addr
75     IdentityFile /opt/ssh_id_rsa
76     User $USER
77 - path: /etc/apt/sources.list
78   owner: root:root
79   permissions: '0665'
80   content: |
81         deb [trusted=yes] ssh://$USER@$default_addr:$LOCAL_APT_REPO ./
82 EOF
83 }
84
85 create_userdata() {
86         printf "#cloud-config\n" > userdata.yaml
87         if [ -n "$COMPUTE_NODE_PASSWORD" ]; then
88                 printf "password: ""%s" "$COMPUTE_NODE_PASSWORD" >> userdata.yaml
89                 printf "\nchpasswd: {expire: False}\n" >> userdata.yaml
90                 printf "ssh_pwauth: True\n" >> userdata.yaml
91         fi
92
93         if [ -n "$COMPUTE_NODE_FQDN" ]; then
94                 printf "fqdn: ""%s" "$COMPUTE_NODE_FQDN" >> userdata.yaml
95                 printf "\n" >> userdata.yaml
96         fi
97
98         printf "ssh_authorized_keys:\n  - " >> userdata.yaml
99
100         if [ -f $HOME/.ssh/id_rsa.pub ]; then
101                 yes y | ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa
102         fi
103
104         cat $HOME/.ssh/id_rsa.pub >> userdata.yaml
105         printf "\n" >> userdata.yaml
106 }
107
108 apply_userdata_credential() {
109         cat <<EOF > ./$COMPUTE_NODE_NAME-user-data.yaml
110 apiVersion: v1
111 data:
112   userData: $(base64 -w 0 userdata.yaml)
113 kind: Secret
114 metadata:
115   name: $COMPUTE_NODE_NAME-user-data
116   namespace: metal3
117 type: Opaque
118 EOF
119         kubectl apply -n metal3 -f $COMPUTE_NODE_NAME-user-data.yaml
120 }
121
122 launch_baremetal_operator() {
123         if [ ! -d $GOPATH/src/github.com/metal3-io/baremetal-operator ]; then
124         go get github.com/metal3-io/baremetal-operator
125     fi
126
127         pushd $GOPATH/src/github.com/metal3-io/baremetal-operator
128                 make deploy
129         popd
130                 
131 }
132
133 if [ "$1" == "launch" ]; then
134     launch_baremetal_operator
135     exit 0
136 fi
137
138 if [ "$1" == "deprovision" ]; then
139     deprovision_compute_node
140     exit 0
141 fi
142
143 if [ "$1" == "provision" ]; then
144     create_userdata
145         apply_userdata_credential
146         provision_compute_node
147     exit 0
148 fi
149
150
151 echo "Usage: metal3.sh"
152 echo "launch      - Launch the metal3 operator"
153 echo "provision   - provision baremetal node as specified in common.sh"
154 echo "deprovision - deprovision baremetal node as specified in common.sh"
155 exit 1
156
157 #Following code is tested for the offline mode
158 #Will be intergrated for the offline mode for ICNi v.0.1.0 beta
159 #create_ssh_key
160 #create_userdata
161 #set_compute_key
162 #set_compute_ssh_config