X-Git-Url: https://gerrit.akraino.org/r/gitweb?a=blobdiff_plain;f=env%2Flib%2Fcommon.sh;h=f09ca6f31d053801e2a992d5a4b911d76ff32f60;hb=43dbb5a2353606d1801f08dcf3e2fd06399843fb;hp=9c08025d1c10a229986e5b064d4d94942c490110;hpb=4af76f3aff2833922846f7cbf6fc3490dd72ea93;p=icn.git diff --git a/env/lib/common.sh b/env/lib/common.sh index 9c08025..f09ca6f 100755 --- a/env/lib/common.sh +++ b/env/lib/common.sh @@ -1,59 +1,54 @@ #!/usr/bin/env bash set -eu -o pipefail -#supported OS version -UBUNTU_BIONIC=${UBUNTU_BIONIC:-Ubuntu 18.04.2 LTS} - -#offline mode variable -DOWNLOAD_PATH=${DOWNLOAD_PATH:-/opt/icn} -LOCAL_APT_REPO=${LOCAL_APT_REPO:-$DOWNLOAD_PATH/apt} -PIP_CACHE_DIR=${PIP_CACHE_DIR:-$DOWNLOAD_PATH/pip-cache-dir} -BUILD_DIR=${BUILD_DIR:-$DOWNLOAD_PATH/build-dir} -CONTAINER_IMAGES_DIR=${CONTAINER_IMAGES_DIR:-$DOWNLOAD_PATH/docker-dir} - -#set variables -#Todo include over all variables here -KUBE_VERSION=${KUBE_VERSION:-"v1.15.0"} -POD_NETWORK_CIDR=${POD_NETWORK_CIDR:-"10.244.0.0/16"} -PODMAN_CNI_CONFLIST=${PODMAN_CNI_CONFLIST:-"https://raw.githubusercontent.com/containers/libpod/v1.4.4/cni/87-podman-bridge.conflist"} - -#Bootstrap K8s cluster -BS_DHCP_INTERFACE=${BS_DHCP_INTERFACE:-} -BS_DHCP_INTERFACE_IP=${BS_DHCP_INTERFACE_IP:-} -BS_DHCP_DIR=${BS_DHCP_DIR:-$DOWNLOAD_PATH/dhcp} - -#User Provider Network configuration -PROVIDER_NETWORK_GATEWAY=${PROVIDER_NETWORK_GATEWAY:-} -PROVIDER_NETWORK_DNS=${PROVIDER_NETWORK_DNS:-} - -#Ironic variables -IRONIC_IMAGE=${IRONIC_IMAGE:-"integratedcloudnative/ironic:v1.0-icn"} -IRONIC_INSPECTOR_IMAGE=${IRONIC_INSPECTOR_IMAGE:-"integratedcloudnative/ironic-inspector:v1.0-icn"} -IRONIC_BAREMETAL_IMAGE=${IRONIC_BAREMETAL_IMAGE:-"integratedcloudnative/baremetal-operator:v1.0-icn"} -IPA_DOWNLOADER_IMAGE=${IPA_DOWNLOADER_IMAGE:-"integratedcloudnative/ironic-ipa-downloader:v1.0-icn"} -IRONIC_BAREMETAL_SOCAT_IMAGE=${IRONIC_BAREMETAL_SOCAT_IMAGE:-"alpine/socat:latest"} - IRONIC_DATA_DIR=${IRONIC_DATA_DIR:-"/opt/ironic"} #IRONIC_PROVISIONING_INTERFACE is required to be provisioning, don't change it IRONIC_INTERFACE=${IRONIC_INTERFACE:-} IRONIC_PROVISIONING_INTERFACE=${IRONIC_PROVISIONING_INTERFACE:-"provisioning"} IRONIC_IPMI_INTERFACE=${IRONIC_IPMI_INTERFACE:-} IRONIC_PROVISIONING_INTERFACE_IP=${IRONIC_PROVISIONING_INTERFACE_IP:-"172.22.0.1"} -IRONIC_IPMI_INTERFACE_IP=${IRONIC_IPMI_INTERFACE_IP:-} -BM_IMAGE_URL=${BM_IMAGE_URL:-"https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img"} -BM_IMAGE=${BM_IMAGE:-"bionic-server-cloudimg-amd64.img"} +BM_IMAGE_URL=${BM_IMAGE_URL:-"https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"} +BM_IMAGE=${BM_IMAGE:-"focal-server-cloudimg-amd64.img"} -#Path to clone the metal3 dev env repo -M3PATH="$(go env GOPATH)/src/github.com/metal3-io" -#Path to clone the baremetal operator repo -BMOPATH="${M3PATH}/baremetal-operator" #Baremetal operator repository URL BMOREPO="${BMOREPO:-https://github.com/metal3-io/baremetal-operator.git}" -#Baremetal operator repository branch to checkout -BMOBRANCH="${BMOBRANCH:-10eb5aa3e614d0fdc6315026ebab061cbae6b929}" -#Discard existing baremetal operator repo directory +#Path to clone the baremetal operator repo +BMOPATH="/opt/src/github.com/metal3-io/baremetal-operator" +#Bare Metal Operator version to use +BMO_VERSION="capm3-v0.5.1" + +#KuD repository URL +KUDREPO="${KUDREPO:-https://github.com/onap/multicloud-k8s.git}" +#Path to clone the KuD repo +KUDPATH="/opt/src/github.com/onap/multicloud-k8s" +#KuD version to use +KUD_VERSION="ed96bca7fe415f1636d82c26af15d7474bdfe876" + +#EMCO repository URL +EMCOREPO="${EMCOREPO:-https://github.com/open-ness/EMCO.git}" +#Path to clone the EMCO repo +EMCOPATH="/opt/src/github.com/open-ness/EMCO" +#EMCO version to use +EMCO_VERSION="openness-21.03.06" + +#Discard existing repo directory FORCE_REPO_UPDATE="${FORCE_REPO_UPDATE:-true}" +# The kustomize version to use +KUSTOMIZE_VERSION="v4.3.0" + +#Cluster API version to use +CAPI_VERSION="v0.4.3" + +#Cluster API version to use +CAPM3_VERSION="v0.5.1" + +#The flux version to use +FLUX_VERSION="0.20.0" + +#The sops version to use +SOPS_VERSION="v3.7.1" + #refered from onap function call_api { #Runs curl with passed flags and provides @@ -92,16 +87,190 @@ function list_nodes { exit 1 fi - cat "$NODES_FILE" | \ - jq -r '.nodes[] | [ - .name, - .ipmi_driver_info.username, - .ipmi_driver_info.password, - .ipmi_driver_info.address, - .os.username, - .os.password, - .os.image_name - ] | @csv' | \ - sed 's/"//g' + # The boot MAC address must be specified when a port is included + # in the IPMI driver address (i.e when using the VirtualBMC + # controller). Note that the below is a bit of a hack as it only + # checks the first entry in NODES_FILE for the port. + if cat "$NODES_FILE" | + jq -r '.nodes[0].ipmi_driver_info.address' | grep -c ':[0-9]\+$' >/dev/null; then + BOOT_LINK=$(cat "$NODES_FILE" | + jq -r '.nodes[0].net.links | map(.id=="provisioning_nic") | index(true)') + cat "$NODES_FILE" | + jq -r --argjson BOOT_LINK $BOOT_LINK '.nodes[] | [ + .name, + .ipmi_driver_info.username, + .ipmi_driver_info.password, + .ipmi_driver_info.address, + .net.links[$BOOT_LINK].ethernet_mac_address, + .os.username, + .os.password, + .os.image_name + ] | @csv' | + sed 's/"//g' + else + cat "$NODES_FILE" | + jq -r '.nodes[] | [ + .name, + .ipmi_driver_info.username, + .ipmi_driver_info.password, + .ipmi_driver_info.address, + "", + .os.username, + .os.password, + .os.image_name + ] | @csv' | + sed 's/"//g' + fi } +# Returns "null" when the field is not present +function networkdata_networks_field { + name=$1 + network=$2 + field=$3 + NODES_FILE="${IRONIC_DATA_DIR}/nodes.json" + cat $NODES_FILE | jq -c -r --arg name "$name" --arg network "$network" --arg field "$field" '.nodes[] | select(.name==$name) | .net.networks[] | select(.id==$network).'${field} +} + +# Returns "null" when the field is not present +function networkdata_links_field { + name=$1 + link=$2 + field=$3 + NODES_FILE="${IRONIC_DATA_DIR}/nodes.json" + cat $NODES_FILE | jq -c -r --arg name "$name" --arg link "$link" --arg field "$field" '.nodes[] | select(.name==$name) | .net.links[] | select(.id==$link).'${field} +} + +function node_networkdata { + name=$1 + + NODES_FILE="${IRONIC_DATA_DIR}/nodes.json" + + if [ ! -f "$NODES_FILE" ]; then + exit 1 + fi + + printf "networks:\n" + for network in $(cat $NODES_FILE | jq -r --arg name "$name" '.nodes[] | select(.name==$name) | .net.networks[].id'); do + link=$(networkdata_networks_field $name $network "link") + type=$(networkdata_networks_field $name $network "type") + mac=$(networkdata_links_field $name $link "ethernet_mac_address") + + # Optional values + ip_address=$(networkdata_networks_field $name $network "ip_address") + gateway=$(networkdata_networks_field $name $network "gateway") + dns_nameservers=$(networkdata_networks_field $name $network "dns_nameservers") + + printf " ${network}:\n" + printf " macAddress: ${mac}\n" + printf " type: ${type}\n" + if [[ $ip_address != "null" ]]; then + printf " ipAddress: ${ip_address}\n" + fi + if [[ $gateway != "null" ]]; then + printf " gateway: ${gateway}\n" + fi + if [[ $dns_nameservers != "null" ]]; then + printf " nameservers: ${dns_nameservers}\n" + fi + done +} + +function wait_for { + local -r interval=${WAIT_FOR_INTERVAL:-30s} + local -r max_tries=${WAIT_FOR_TRIES:-20} + local try=0 + until "$@"; do + echo "[${try}/${max_tries}] - Waiting ${interval} for $*" + sleep ${interval} + try=$((try+1)) + if [[ ${try} -ge ${max_tries} ]]; then + return 1 + fi + done +} + +function clone_repository { + local -r path=$1 + local -r repo=$2 + local -r version=$3 + mkdir -p $(dirname ${path}) + if [[ -d ${path} && "${FORCE_REPO_UPDATE}" == "true" ]]; then + rm -rf "${path}" + fi + if [ ! -d "${path}" ] ; then + pushd $(dirname ${path}) + git clone "${repo}" + popd + else + pushd "${path}" + git fetch + popd + fi + pushd "${path}" + git reset --hard "${version}" + popd +} + +function clone_baremetal_operator_repository { + clone_repository ${BMOPATH} ${BMOREPO} ${BMO_VERSION} +} + +function clone_kud_repository { + clone_repository ${KUDPATH} ${KUDREPO} ${KUD_VERSION} +} + +function clone_emco_repository { + clone_repository ${EMCOPATH} ${EMCOREPO} ${EMCO_VERSION} +} + +function install_kustomize { + curl -sL "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2F${KUSTOMIZE_VERSION}/kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz" -o kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz + tar xzf kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz --no-same-owner + sudo install -o root -g root -m 0755 kustomize /usr/local/bin/kustomize + rm kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz kustomize + kustomize version +} + +function install_clusterctl { + curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/${CAPI_VERSION}/clusterctl-linux-amd64 -o clusterctl + sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl + rm clusterctl + clusterctl version +} + +function install_flux_cli { + export FLUX_VERSION + curl -s https://fluxcd.io/install.sh | sudo -E bash + flux --version +} + +function install_emcoctl { + clone_emco_repository + make -C ${EMCOPATH}/src/tools/emcoctl + sudo install -o root -g root -m 0755 ${EMCOPATH}/bin/emcoctl/emcoctl /usr/local/bin/emcoctl +} + +function install_sops { + curl -L https://github.com/mozilla/sops/releases/download/${SOPS_VERSION}/sops-${SOPS_VERSION}.linux -o sops + sudo install -o root -g root -m 0755 sops /usr/local/bin/sops + rm sops + sops --version +} + +function fetch_image { + if [[ "${BM_IMAGE_URL}" && "${BM_IMAGE}" ]]; then + mkdir -p "${IRONIC_DATA_DIR}/html/images" + pushd ${IRONIC_DATA_DIR}/html/images + local_checksum="0" + if [[ -f "${BM_IMAGE}" ]]; then + local_checksum=$(md5sum ${BM_IMAGE} | awk '{print $1}') + fi + remote_checksum=$(curl -sL "$(dirname ${BM_IMAGE_URL})/MD5SUMS" | grep ${BM_IMAGE} | awk '{print $1}') + if [[ ${local_checksum} != ${remote_checksum} ]]; then + curl -o ${BM_IMAGE} --insecure --compressed -O -L ${BM_IMAGE_URL} + md5sum ${BM_IMAGE} | awk '{print $1}' > ${BM_IMAGE}.md5sum + fi + popd + fi +}