5780858d4b6bc786319c59044ae1b6357d0018e8
[icn.git] / deploy / metal3 / scripts / 01_metal3.sh
1 #!/usr/bin/env bash
2 set -eu -o pipefail
3
4 SCRIPTDIR="$(readlink -f $(dirname ${BASH_SOURCE[0]}))"
5 LIBDIR="$(dirname $(dirname $(dirname ${SCRIPTDIR})))/env/lib"
6
7 eval "$(go env)"
8
9 source $LIBDIR/common.sh
10
11 if [[ $EUID -ne 0 ]]; then
12     echo "This script must be run as root"
13     exit 1
14 fi
15
16 function deprovision_compute_node {
17     name="$1"
18     if kubectl get baremetalhost $name -n metal3 &>/dev/null; then
19         kubectl patch baremetalhost $name -n metal3 --type merge \
20         -p '{"spec":{"image":{"url":"","checksum":""}}}'
21     fi
22 }
23
24 function create_userdata {
25     name="$1"
26     username="$2"
27     password="$3"
28     COMPUTE_NODE_FQDN="$name.akraino.icn.org"
29
30     # validate that the user isn't expecting the deprecated
31     # COMPUTE_NODE_PASSWORD to be used
32     if [ "$password" != "${COMPUTE_NODE_PASSWORD:-$password}" ]; then
33         cat <<EOF
34 COMPUTE_NODE_PASSWORD "$COMPUTE_NODE_PASSWORD" not equal to nodes.json $name password "$password".
35 Unset COMPUTE_NODE_PASSWORD and retry.
36 EOF
37         exit 1
38     fi
39
40     printf "userData:\n" >>${SCRIPTDIR}/${name}-values.yaml
41     if [ -n "$username" ]; then
42         printf "  name: ${username}\n" >>${SCRIPTDIR}/${name}-values.yaml
43     fi
44     if [ -n "$password" ]; then
45         passwd=$(mkpasswd --method=SHA-512 --rounds 4096 "$password")
46         printf "  hashedPassword: ${passwd}\n" >>${SCRIPTDIR}/${name}-values.yaml
47     fi
48
49     if [ -n "$COMPUTE_NODE_FQDN" ]; then
50         printf "  fqdn: ${COMPUTE_NODE_FQDN}\n" >>${SCRIPTDIR}/${name}-values.yaml
51     fi
52
53     if [ ! -f $HOME/.ssh/id_rsa.pub ]; then
54         yes y | ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa
55     fi
56
57     printf "  sshAuthorizedKey: $(cat $HOME/.ssh/id_rsa.pub)\n" >>${SCRIPTDIR}/${name}-values.yaml
58 }
59
60 create_networkdata() {
61     name="$1"
62     node_networkdata $name >>${SCRIPTDIR}/${name}-values.yaml
63 }
64
65 function make_bm_hosts {
66     while IFS=',' read -r name ipmi_username ipmi_password ipmi_address boot_mac os_username os_password os_image_name; do
67         printf "machineName: ${name}\n" >${SCRIPTDIR}/${name}-values.yaml
68         printf "bmcUsername: ${ipmi_username}\n" >>${SCRIPTDIR}/${name}-values.yaml
69         printf "bmcPassword: ${ipmi_password}\n" >>${SCRIPTDIR}/${name}-values.yaml
70         printf "bmcAddress: ipmi://${ipmi_address}\n" >>${SCRIPTDIR}/${name}-values.yaml
71         if [[ ! -z ${boot_mac} ]]; then
72             printf "bootMACAddress: ${boot_mac}\n" >>${SCRIPTDIR}/${name}-values.yaml
73         fi
74         printf "imageName: ${BM_IMAGE}\n" >>${SCRIPTDIR}/${name}-values.yaml
75         create_userdata $name $os_username $os_password
76         create_networkdata $name
77
78         helm -n metal3 install ${name} ${SCRIPTDIR}/../../machine --create-namespace -f ${SCRIPTDIR}/${name}-values.yaml
79
80     done
81 }
82
83 function configure_nodes {
84     if [ ! -d $IRONIC_DATA_DIR ]; then
85         mkdir -p $IRONIC_DATA_DIR
86     fi
87
88     #make sure nodes.json file in /opt/ironic/ are configured
89     if [ ! -f $NODES_FILE ]; then
90         cp ${SCRIPTDIR}/nodes.json.sample $NODES_FILE
91     fi
92 }
93
94 function deprovision_bm_hosts {
95     while IFS=',' read -r name ipmi_username ipmi_password ipmi_address boot_mac os_username os_password os_image_name; do
96         deprovision_compute_node $name
97     done
98 }
99
100 function clean_bm_hosts {
101     while IFS=',' read -r name ipmi_username ipmi_password ipmi_address boot_mac os_username os_password os_image_name; do
102         helm -n metal3 uninstall ${name}
103         rm -rf ${SCRIPTDIR}/${name}-values.yaml
104     done
105 }
106
107 function clean_all {
108     list_nodes | clean_bm_hosts
109     if [ -f $NODES_FILE ]; then
110         rm -rf $NODES_FILE
111     fi
112 }
113
114 function apply_bm_hosts {
115     list_nodes | make_bm_hosts
116 }
117
118 function deprovision_all_hosts {
119     list_nodes | deprovision_bm_hosts
120 }
121
122 if [ "$1" == "deprovision" ]; then
123     configure_nodes
124     deprovision_all_hosts
125     exit 0
126 fi
127
128 if [ "$1" == "provision" ]; then
129     configure_nodes
130     apply_bm_hosts
131     exit 0
132 fi
133
134 if [ "$1" == "clean" ]; then
135     configure_nodes
136     clean_all
137     exit 0
138 fi
139
140 echo "Usage: metal3.sh"
141 echo "provision   - provision baremetal node as specified in common.sh"
142 echo "deprovision - deprovision baremetal node as specified in common.sh"
143 echo "clean       - clean all the bmh resources"
144 exit 1