Use Vagrantfile to build virtual site
[icn.git] / deploy / metal3-vm / lib / common.sh
1 #!/usr/bin/env bash
2 set -eu -o pipefail
3
4 eval "$(go env)"
5
6 SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7 USER=`whoami`
8
9 # Get variables from the config file
10 if [ -z "${CONFIG:-}" ]; then
11     # See if there's a config_$USER.sh in the SCRIPTDIR
12     if [ ! -f ${SCRIPTDIR}/../config_${USER}.sh ]; then
13         cp ${SCRIPTDIR}/../config_example.sh ${SCRIPTDIR}/../config_${USER}.sh
14         echo "Automatically created config_${USER}.sh with default contents."
15     fi
16     CONFIG="${SCRIPTDIR}/../config_${USER}.sh"
17 fi
18 source $CONFIG
19
20 # Set variables
21 # Additional DNS
22 ADDN_DNS=${ADDN_DNS:-}
23 # External interface for routing traffic through the host
24 EXT_IF=${EXT_IF:-}
25 # Provisioning interface
26 PRO_IF=${PRO_IF:-}
27 # Does libvirt manage the baremetal bridge (including DNS and DHCP)
28 MANAGE_BR_BRIDGE=${MANAGE_BR_BRIDGE:-y}
29 # Only manage bridges if is set
30 MANAGE_PRO_BRIDGE=${MANAGE_PRO_BRIDGE:-y}
31 MANAGE_INT_BRIDGE=${MANAGE_INT_BRIDGE:-y}
32 # Internal interface, to bridge virbr0
33 INT_IF=${INT_IF:-}
34 #Container runtime
35 CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-"docker"}
36
37 export EXTERNAL_SUBNET="192.168.111.0/24"
38 #Ironic data directory
39 IRONIC_DATA_DIR=${IRONIC_DATA_DIR:-"/opt/ironic"}
40 export SSH_PUB_KEY=~/.ssh/id_rsa.pub
41
42 FILESYSTEM=${FILESYSTEM:="/"}
43
44 WORKING_DIR=${WORKING_DIR:-"/opt/metal3-vm"}
45 NODES_FILE=${NODES_FILE:-"${WORKING_DIR}/ironic_nodes.json"}
46 NODES_PLATFORM=${NODES_PLATFORM:-"libvirt"}
47
48 export NUM_MASTERS=${NUM_MASTERS:-"1"}
49 export NUM_WORKERS=${NUM_WORKERS:-"1"}
50 export VM_EXTRADISKS=${VM_EXTRADISKS:-"false"}
51
52 # Ironic vars
53 export IRONIC_IMAGE=${IRONIC_IMAGE:-"integratedcloudnative/ironic:v1.0-icn"}
54 export IRONIC_INSPECTOR_IMAGE=${IRONIC_INSPECTOR_IMAGE:-"integratedcloudnative/ironic-inspector:v1.0-icn"}
55 export IRONIC_BAREMETAL_IMAGE=${IRONIC_BAREMETAL_IMAGE:-"integratedcloudnative/baremetal-operator:v2.0-icn"}
56 export IPA_DOWNLOADER_IMAGE=${IPA_DOWNLOADER_IMAGE:-"integratedcloudnative/ironic-ipa-downloader:v1.0-icn"}
57
58 # Verify requisites/permissions
59 # Connect to system libvirt
60 export LIBVIRT_DEFAULT_URI=qemu:///system
61 if [ "$USER" != "root" -a "${XDG_RUNTIME_DIR:-}" == "/run/user/0" ] ; then
62     echo "Please use a non-root user, WITH a login shell (e.g. su - USER)"
63     exit 1
64 fi
65
66 # Check if sudo privileges without password
67 if ! sudo -n uptime &> /dev/null ; then
68   echo "sudo without password is required"
69   exit 1
70 fi
71
72 # Check OS
73 OS=$(awk -F= '/^ID=/ { print $2 }' /etc/os-release | tr -d '"')
74 if [[ ! $OS =~ ^(centos|rhel|ubuntu)$ ]]; then
75   echo "Unsupported OS"
76   exit 1
77 fi
78
79 # Check CentOS version
80 os_version=$(awk -F= '/^VERSION_ID=/ { print $2 }' /etc/os-release | tr -d '"' | cut -f1 -d'.')
81 if [[ ${os_version} -ne 7 ]] && [[ ${os_version} -ne 18 ]]; then
82   echo "Required CentOS 7 or RHEL 7 or Ubuntu 18.04"
83   exit 1
84 fi
85
86 # Check d_type support
87 FSTYPE=$(df ${FILESYSTEM} --output=fstype | grep -v Type)
88
89 case ${FSTYPE} in
90   'ext4'|'btrfs')
91   ;;
92   'xfs')
93     if [[ $(xfs_info ${FILESYSTEM} | grep -q "ftype=1") ]]; then
94       echo "Filesystem not supported"
95       exit 1
96     fi
97   ;;
98   *)
99     echo "Filesystem not supported"
100     exit 1
101   ;;
102 esac
103
104 if [ ! -d "$WORKING_DIR" ]; then
105   echo "Creating Working Dir"
106   sudo mkdir "$WORKING_DIR"
107   sudo chown "${USER}:${USER}" "$WORKING_DIR"
108   chmod 755 "$WORKING_DIR"
109 fi
110
111 function list_nodes {
112     # Includes -machine and -machine-namespace
113     cat $NODES_FILE | \
114         jq -r '.nodes[] | [
115            .name,
116            .driver + "://" + .driver_info.ipmi_address + (if .driver_info.ipmi_port then ":" + .driver_info.ipmi_port else "" end),
117            .driver_info.ipmi_username,
118            .driver_info.ipmi_password,
119            .ports[0].address
120            ] | @csv' | \
121         sed 's/"//g'
122 }
123
124 function node_networkdata {
125     name=$1
126     cat $NODES_FILE  | jq -r --arg name "$name" '.nodes[] | select(.name==$name) | .net'
127 }