Code refactoring for bpa operator
[icn.git] / env / metal3 / 02_configure.sh
1 #!/usr/bin/env bash
2 set -xe
3 LIBDIR="$(dirname "$PWD")"
4
5 source $LIBDIR/lib/logging.sh
6 source $LIBDIR/lib/common.sh
7
8 if [[ $EUID -ne 0 ]]; then
9     echo "confgiure script must be run as root"
10     exit 1
11 fi
12
13 function check_inteface_ip() {
14         local interface=$1
15         local ipaddr=$2
16
17     if [ ! $(ip addr show dev $interface) ]; then
18         exit 1
19     fi
20
21     local ipv4address=$(ip addr show dev $interface | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }')
22     if [ "$ipv4address" != "$ipaddr" ]; then
23         exit 1
24     fi
25 }
26
27 function configure_dhcp_bridge() {
28         brctl addbr dhcp0
29         ip link set dhcp0 up
30         brctl addif dhcp0 $BS_DHCP_INTERFACE
31         ip addr add dev dhcp0 $BS_DHCP_INTERFACE_IP
32 }
33
34 function configure_ironic_bridge() {
35         brctl addbr provisioning
36         ip link set provisioning up
37         brctl addif provisioning $IRONIC_IPMI_INTERFACE
38         ip addr add dev provisioning 172.22.0.1/24
39 }
40
41 function configure_kubelet() {
42         swapoff -a
43         #Todo addition kubelet configuration
44 }
45
46 function configure_kubeadm() {
47         #Todo error handing
48         if [ "$1" == "offline" ]; then
49                 for images in kube-apiserver kube-controller-manager kube-scheduler kube-proxy; do
50                 docker load --input $CONTAINER_IMAGES_DIR/$images.tar;
51                 done
52
53                 docker load --input $CONTAINER_IMAGES_DIR/pause.tar
54                 docker load --input $CONTAINER_IMAGES_DIR/etcd.tar
55                 docker load --input $CONTAINER_IMAGES_DIR/coredns.tar
56         return
57     fi
58         kubeadm config images pull --kubernetes-version=$KUBE_VERSION
59 }
60
61 function configure_ironic_interfaces() {
62         #Todo later to change the CNI networking for podman networking
63         # Add firewall rules to ensure the IPA ramdisk can reach httpd, Ironic and the Inspector API on the host
64         if [ "$IRONIC_PROVISIONING_INTERFACE" ]; then
65                 check_inteface_ip $IRONIC_PROVISIONING_INTERFACE $IRONIC_PROVISIONING_INTERFACE_IP      
66         else
67                 exit 1
68
69         fi
70
71         if [ "$IRONIC_IPMI_INTERFACE" ]; then
72         check_inteface_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         podman pull $IRONIC_IMAGE
136         podman pull $IRONIC_INSPECTOR_IMAGE
137         
138         mkdir -p "$IRONIC_DATA_DIR/html/images"
139         pushd $IRONIC_DATA_DIR/html/images
140         
141         if [ ! -f ironic-python-agent.initramfs ]; then
142                 curl --insecure --compressed -L https://images.rdoproject.org/master/rdo_trunk/current-tripleo-rdo/ironic-python-agent.tar | tar -xf -
143         fi
144         
145         if [[ "$BM_IMAGE_URL" && "$BM_IMAGE" ]]; then
146         curl -o ${BM_IMAGE} --insecure --compressed -O -L ${BM_IMAGE_URL}
147         md5sum ${BM_IMAGE} | awk '{print $1}' > ${BM_IMAGE}.md5sum
148         fi
149         popd
150 }
151
152 function configure() {
153         configure_kubeadm $1
154         configure_kubelet
155         configure_ironic_interfaces
156         configure_ironic $1
157         configure_dhcp_bridge
158         configure_ironic_bridge
159 }
160
161 if [ "$1" == "-o" ]; then
162     configure offline
163     exit 0
164 fi
165
166 configure