6ae1c608b0fda0f000eddd5217305d3425872afe
[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     ip addr show dev $interface
19     if [ $? -ne 0 ]; then
20         exit 1
21     fi
22
23     local ipv4address=$(ip addr show dev $interface | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }')
24     if [ "$ipv4address" != "$ipaddr" ]; then
25         exit 1
26     fi
27 }
28
29 function configure_ironic_bridge {
30     ip link add dev provisioning type bridge
31     ip link set provisioning up
32     ip link set dev $IRONIC_INTERFACE master provisioning
33     ip addr add dev provisioning 172.22.0.1/24
34 }
35
36 function configure_ironic_interfaces {
37     # Add firewall rules to ensure the IPA ramdisk can reach httpd, Ironic and the Inspector API on the host
38     if [ "$IRONIC_PROVISIONING_INTERFACE" ]; then
39         check_interface_ip $IRONIC_PROVISIONING_INTERFACE $IRONIC_PROVISIONING_INTERFACE_IP
40     else
41         exit 1
42     fi
43
44     if [ "$IRONIC_IPMI_INTERFACE" ]; then
45         check_interface_ip $IRONIC_IPMI_INTERFACE $IRONIC_IPMI_INTERFACE_IP
46     else
47         exit 1
48     fi
49
50     for port in 80 5050 6385 ; do
51         if ! sudo iptables -C INPUT -i $IRONIC_PROVISIONING_INTERFACE -p tcp -m tcp --dport $port -j ACCEPT > /dev/null 2>&1; then
52             sudo iptables -I INPUT -i $IRONIC_PROVISIONING_INTERFACE -p tcp -m tcp --dport $port -j ACCEPT
53         fi
54     done
55
56     # Allow ipmi to the bmc processes
57     if ! sudo iptables -C INPUT -i $IRONIC_IPMI_INTERFACE -p udp -m udp --dport 6230:6235 -j ACCEPT 2>/dev/null ; then
58         sudo iptables -I INPUT -i $IRONIC_IPMI_INTERFACE -p udp -m udp --dport 6230:6235 -j ACCEPT
59     fi
60
61     #Allow access to dhcp and tftp server for pxeboot
62     for port in 67 69 ; do
63         if ! sudo iptables -C INPUT -i $IRONIC_PROVISIONING_INTERFACE -p udp --dport $port -j ACCEPT 2>/dev/null ; then
64             sudo iptables -I INPUT -i $IRONIC_PROVISIONING_INTERFACE -p udp --dport $port -j ACCEPT
65         fi
66     done
67 }
68
69 function configure_ironic_offline {
70     if [ ! -d $CONTAINER_IMAGES_DIR ] && [ ! -d $BUILD_DIR ]; then
71         exit 1
72     fi
73
74     for image in ironic-inspector-image ironic-image \
75         baremetal-operator socat; do
76         if [ ! -f "$CONTAINER_IMAGES_DIR/$image" ]; then
77             exit 1
78         fi
79     done
80
81     if [ ! -f "$BUILD_DIR/ironic-python-agent.initramfs"] && [ ! -f \
82         "$BUILD_DIR/ironic-python-agent.kernel" ] && [ ! -f
83         "$BUILD_DIR/$BM_IMAGE" ]; then
84         exit 1
85     fi
86
87     docker load --input $CONTAINER_IMAGES_DIR/baremetal-operator.tar
88     docker load --input $CONTAINER_IMAGES_DIR/socat.tar
89
90     mkdir -p "$IRONIC_DATA_DIR/html/images"
91
92     cp $BUILD_DIR/ironic-python-agent.initramfs $IRONIC_DATA_DIR/html/images/
93     cp $BUILD_DIR/ironic-python-agent.kernel $IRONIC_DATA_DIR/html/images/
94     cp $BUILD_DIR/$BM_IMAGE $IRONIC_DATA_DIR/html/images/
95     md5sum $BUILD_DIR/$BM_IMAGE | awk '{print $1}' > $BUILD_DIR/${BM_IMAGE}.md5sum
96 }
97
98 function configure_ironic {
99     if [ "$1" == "offline" ]; then
100         configure_ironic_offline
101         return
102     fi
103
104     for name in ironic ironic-inspector dnsmasq httpd mariadb ipa-downloader; do
105         sudo docker ps | \
106             grep -w "$name$" && sudo docker kill "$name"
107         sudo docker ps --all | \
108             grep -w "$name$" && sudo docker rm "$name" -f
109     done
110     rm -rf "$IRONIC_DATA_DIR"
111
112     docker pull $IRONIC_IMAGE
113     docker pull $IRONIC_INSPECTOR_IMAGE
114     docker pull $IPA_DOWNLOADER_IMAGE
115
116     mkdir -p "$IRONIC_DATA_DIR/html/images"
117     pushd $IRONIC_DATA_DIR/html/images
118
119     if [[ "$BM_IMAGE_URL" && "$BM_IMAGE" ]]; then
120         curl -o ${BM_IMAGE} --insecure --compressed -O -L ${BM_IMAGE_URL}
121         md5sum ${BM_IMAGE} | awk '{print $1}' > ${BM_IMAGE}.md5sum
122     fi
123     popd
124 }
125
126 function configure {
127     configure_ironic $1
128     configure_ironic_bridge
129     configure_ironic_interfaces
130 }
131
132 if [ "$#" -eq 0 ]; then
133     configure online
134 elif [ "$1" == "-o" ]; then
135     configure offline
136 else
137     exit 1
138 fi