Check for errors by default in scripts
[icn.git] / env / metal3 / 02_configure.sh
1 #!/usr/bin/env bash
2 set -eux -o pipefail
3
4 LIBDIR="$(dirname "$PWD")"
5
6 source $LIBDIR/lib/logging.sh
7 source $LIBDIR/lib/common.sh
8
9 if [[ $EUID -ne 0 ]]; then
10     echo "confgiure script must be run as root"
11     exit 1
12 fi
13
14 function check_interface_ip {
15     local interface=$1
16     local ipaddr=$2
17
18     if [ ! $(ip addr show dev $interface) ]; then
19         exit 1
20     fi
21
22     local ipv4address=$(ip addr show dev $interface | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }')
23     if [ "$ipv4address" != "$ipaddr" ]; then
24         exit 1
25     fi
26 }
27
28 function configure_dhcp_bridge {
29     brctl addbr dhcp0
30     ip link set dhcp0 up
31     brctl addif dhcp0 $BS_DHCP_INTERFACE
32     ip addr add dev dhcp0 $BS_DHCP_INTERFACE_IP
33 }
34
35 function configure_ironic_bridge {
36     brctl addbr provisioning
37     ip link set provisioning up
38     brctl addif provisioning $IRONIC_INTERFACE
39     ip addr add dev provisioning 172.22.0.1/24
40 }
41
42 function configure_kubelet {
43     swapoff -a
44     #Todo addition kubelet configuration
45 }
46
47 function configure_kubeadm {
48     #Todo error handing
49     if [ "$1" == "offline" ]; then
50         for images in kube-apiserver kube-controller-manager kube-scheduler kube-proxy; do
51             docker load --input $CONTAINER_IMAGES_DIR/$images.tar;
52         done
53
54         docker load --input $CONTAINER_IMAGES_DIR/pause.tar
55         docker load --input $CONTAINER_IMAGES_DIR/etcd.tar
56         docker load --input $CONTAINER_IMAGES_DIR/coredns.tar
57         return
58     fi
59     kubeadm config images pull --kubernetes-version=$KUBE_VERSION
60 }
61
62 function configure_ironic_interfaces {
63     #Todo later to change the CNI networking for podman networking
64     # Add firewall rules to ensure the IPA ramdisk can reach httpd, Ironic and the Inspector API on the host
65     if [ "$IRONIC_PROVISIONING_INTERFACE" ]; then
66         check_interface_ip $IRONIC_PROVISIONING_INTERFACE $IRONIC_PROVISIONING_INTERFACE_IP
67     else
68         exit 1
69     fi
70
71     if [ "$IRONIC_IPMI_INTERFACE" ]; then
72         check_interface_ip $IRONIC_IPMI_INTERFACE $IRONIC_IPMI_INTERFACE_IP
73     else
74         exit 1
75     fi
76
77     for port in 80 5050 6385 ; do
78         if ! sudo iptables -C INPUT -i $IRONIC_PROVISIONING_INTERFACE -p tcp -m tcp --dport $port -j ACCEPT > /dev/null 2>&1; then
79             sudo iptables -I INPUT -i $IRONIC_PROVISIONING_INTERFACE -p tcp -m tcp --dport $port -j ACCEPT
80         fi
81     done
82
83     # Allow ipmi to the bmc processes
84     if ! sudo iptables -C INPUT -i $IRONIC_IPMI_INTERFACE -p udp -m udp --dport 6230:6235 -j ACCEPT 2>/dev/null ; then
85         sudo iptables -I INPUT -i $IRONIC_IPMI_INTERFACE -p udp -m udp --dport 6230:6235 -j ACCEPT
86     fi
87
88     #Allow access to dhcp and tftp server for pxeboot
89     for port in 67 69 ; do
90         if ! sudo iptables -C INPUT -i $IRONIC_PROVISIONING_INTERFACE -p udp --dport $port -j ACCEPT 2>/dev/null ; then
91             sudo iptables -I INPUT -i $IRONIC_PROVISIONING_INTERFACE -p udp --dport $port -j ACCEPT
92         fi
93     done
94 }
95
96 function configure_ironic_offline {
97     if [ ! -d $CONTAINER_IMAGES_DIR ] && [ ! -d $BUILD_DIR ]; then
98         exit 1
99     fi
100
101     for image in ironic-inspector-image ironic-image podman-pause \
102         baremetal-operator socat; do
103         if [ ! -f "$CONTAINER_IMAGES_DIR/$image" ]; then
104             exit 1
105         fi
106     done
107
108     if [ ! -f "$BUILD_DIR/ironic-python-agent.initramfs"] && [ ! -f \
109         "$BUILD_DIR/ironic-python-agent.kernel" ] && [ ! -f
110         "$BUILD_DIR/$BM_IMAGE" ]; then
111         exit 1
112     fi
113
114     podman load --input $CONTAINER_IMAGES_DIR/ironic-inspector-image.tar
115     podman load --input $CONTAINER_IMAGES_DIR/ironic-image.tar
116     podman load --input $CONTAINER_IMAGES_DIR/podman-pause.tar
117
118     docker load --input $CONTAINER_IMAGES_DIR/baremetal-operator.tar
119     docker load --input $CONTAINER_IMAGES_DIR/socat.tar
120
121     mkdir -p "$IRONIC_DATA_DIR/html/images"
122
123     cp $BUILD_DIR/ironic-python-agent.initramfs $IRONIC_DATA_DIR/html/images/
124     cp $BUILD_DIR/ironic-python-agent.kernel $IRONIC_DATA_DIR/html/images/
125     cp $BUILD_DIR/$BM_IMAGE $IRONIC_DATA_DIR/html/images/
126     md5sum $BUILD_DIR/$BM_IMAGE | awk '{print $1}' > $BUILD_DIR/${BM_IMAGE}.md5sum
127 }
128
129 function configure_ironic {
130     if [ "$1" == "offline" ]; then
131         configure_ironic_offline
132         return
133     fi
134
135     for name in ironic ironic-inspector dnsmasq httpd mariadb ipa-downloader; do
136         sudo docker ps | \
137             grep -w "$name$" && sudo docker kill "$name"
138         sudo docker ps --all | \
139             grep -w "$name$" && sudo docker rm "$name" -f
140     done
141     rm -rf "$IRONIC_DATA_DIR"
142
143     docker pull $IRONIC_IMAGE
144     docker pull $IRONIC_INSPECTOR_IMAGE
145     docker pull $IPA_DOWNLOADER_IMAGE
146
147     mkdir -p "$IRONIC_DATA_DIR/html/images"
148     pushd $IRONIC_DATA_DIR/html/images
149
150     if [[ "$BM_IMAGE_URL" && "$BM_IMAGE" ]]; then
151         curl -o ${BM_IMAGE} --insecure --compressed -O -L ${BM_IMAGE_URL}
152         md5sum ${BM_IMAGE} | awk '{print $1}' > ${BM_IMAGE}.md5sum
153     fi
154     popd
155 }
156
157 function configure {
158     #Kubeadm usage deprecated for v1.0.0 release
159     #configure_kubeadm $1
160     #configure_kubelet
161     configure_ironic $1
162     configure_dhcp_bridge
163     configure_ironic_bridge
164     configure_ironic_interfaces
165 }
166
167 if [ "$#" -eq 0 ]; then
168     configure online
169 elif [ "$1" == "-o" ]; then
170     configure offline
171 else
172     exit 1
173 fi