Clean up Makefile
[icn.git] / deploy / ironic / ironic.sh
1 #!/usr/bin/env bash
2 set -eEux -o pipefail
3
4 SCRIPTDIR="$(readlink -f $(dirname ${BASH_SOURCE[0]}))"
5 LIBDIR="$(dirname $(dirname ${SCRIPTDIR}))/env/lib"
6
7 source $LIBDIR/logging.sh
8 source $LIBDIR/common.sh
9
10 NAMEPREFIX="capm3"
11
12 trap err_exit ERR
13 function err_exit {
14     kubectl get all -n ${NAMEPREFIX}-system
15 }
16
17 function check_interface_ip {
18     local -r interface=$1
19     local -r ipaddr=$2
20
21     ip addr show dev ${interface}
22     if [[ $? -ne 0 ]]; then
23         exit 1
24     fi
25
26     local -r ipv4address=$(ip addr show dev ${interface} | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }')
27     if [[ "$ipv4address" != "$ipaddr" ]]; then
28         exit 1
29     fi
30 }
31
32 function configure_ironic_bridge {
33     if [[ ! $(ip link show dev provisioning) ]]; then
34         ip link add dev provisioning type bridge
35     fi
36     ip link set provisioning up
37     ip link set dev ${IRONIC_INTERFACE} master provisioning
38     if [[ ! $(ip addr show dev provisioning to 172.22.0.1) ]]; then
39         ip addr add dev provisioning 172.22.0.1/24
40     fi
41 }
42
43 function configure_ironic_interfaces {
44     # Add firewall rules to ensure the IPA ramdisk can reach httpd,
45     # Ironic and the Inspector API on the host
46     if [ "${IRONIC_PROVISIONING_INTERFACE}" ]; then
47         check_interface_ip ${IRONIC_PROVISIONING_INTERFACE} ${IRONIC_PROVISIONING_INTERFACE_IP}
48     else
49         exit 1
50     fi
51
52     for port in 80 5050 6385 ; do
53         if ! sudo iptables -C INPUT -i ${IRONIC_PROVISIONING_INTERFACE} -p tcp -m tcp --dport ${port} -j ACCEPT > /dev/null 2>&1; then
54             sudo iptables -I INPUT -i ${IRONIC_PROVISIONING_INTERFACE} -p tcp -m tcp --dport ${port} -j ACCEPT
55         fi
56     done
57
58     # Allow access to dhcp and tftp server for pxeboot
59     for port in 67 69 ; do
60         if ! sudo iptables -C INPUT -i ${IRONIC_PROVISIONING_INTERFACE} -p udp --dport ${port} -j ACCEPT 2>/dev/null ; then
61             sudo iptables -I INPUT -i ${IRONIC_PROVISIONING_INTERFACE} -p udp --dport ${port} -j ACCEPT
62         fi
63     done
64 }
65
66 function deploy_bridge {
67     configure_ironic_bridge
68     configure_ironic_interfaces
69 }
70
71 function clean_bridge {
72     ip link set provisioning down || true
73     ip link del provisioning type bridge || true
74 }
75
76 # This may be used to update the in-place Ironic YAML files from the
77 # upstream project.  We cannot use the upstream sources directly as
78 # they require an envsubst step before kustomize build.
79 function build_source {
80     clone_baremetal_operator_repository
81     export NAMEPREFIX
82     KUSTOMIZATION_FILES=$(find ${BMOPATH}/ironic-deployment/{default,ironic} -type f)
83     for src in ${KUSTOMIZATION_FILES}; do
84         dst=${src/${BMOPATH}\/ironic-deployment/${SCRIPTDIR}\/base}
85         mkdir -p $(dirname ${dst})
86         envsubst <${src} >${dst}
87     done
88     sed -i -e '/name: quay.io\/metal3-io\/ironic/{n;s/newTag:.*/newTag: '"${BMO_VERSION}"'/;}' ${SCRIPTDIR}/icn/kustomization.yaml
89 }
90
91 function deploy {
92     fetch_image
93     kustomize build ${SCRIPTDIR}/icn | kubectl apply -f -
94     kubectl wait --for=condition=Available --timeout=600s deployment/${NAMEPREFIX}-ironic -n ${NAMEPREFIX}-system
95 }
96
97 function clean {
98     kustomize build ${SCRIPTDIR}/icn | kubectl delete -f -
99     rm -rf ${IRONIC_DATA_DIR}
100 }
101
102 case $1 in
103     "build-source") build_source ;;
104     "clean") clean ;;
105     "clean-bridge") clean_bridge ;;
106     "deploy") deploy ;;
107     "deploy-bridge") deploy_bridge ;;
108     *) cat <<EOF
109 Usage: $(basename $0) COMMAND
110
111 Commands:
112   build-source  - Rebuild the in-tree Ironic YAML files
113   clean         - Remove Ironic
114   clean-bridge  - Uninstall provisioning network bridge
115   deploy        - Deploy Ironic
116   deploy-bridge - Install provisioning network bridge
117 EOF
118        ;;
119 esac