#!/bin/bash set -Eeuo pipefail trap "exit" INT function assert_cluster_name () { local cluster_name="${1:-}" if [ ! -d ".clusters/$cluster_name" ]; then echo "Cluster '$cluster_name' does not exist!" exit 1 fi if [ -f ".clusters/$cluster_name/local.env" ]; then source ".clusters/$cluster_name/local.env" fi } function init () { local cluster_name="${1:-}" if [ -d ".clusters/$cluster_name" ]; then echo "Cluster '$cluster_name' already initialized !" exit 1 fi mkdir -p ".clusters/$cluster_name" sed "s/__CLUSTER_NAME__/$cluster_name/" install-config.yaml > ".clusters/$cluster_name/install-config.yaml" sed "s/__CLUSTER_NAME__/$cluster_name/" terraform.tfvars > ".clusters/$cluster_name/terraform.tfvars" grep LIBVIRT_DEFAULT_URI local.env > ".clusters/$cluster_name/local.env" echo "Cluster $cluster_name initialized successfully!" echo echo "Review and adjust the following files to your needs:" echo "- .clusters/$cluster_name/install-config.yaml" echo "- .clusters/$cluster_name/terraform.tfvars" echo "- .clusters/$cluster_name/local.env" echo exit 0 } function destroy () { assert_cluster_name "$@" local cluster_name="${1:-}" terraform destroy -var-file=".clusters/$cluster_name/terraform.tfvars" -state=".clusters/$cluster_name/terraform.tfstate" sed -i.bak 's/^\s*bootstrap_nodes\s*=\s*.*$/bootstrap_nodes = 1/' ".clusters/$cluster_name/terraform.tfvars" if [ -f ".clusters/$cluster_name/install-config.yaml.bak" ]; then cp ".clusters/$cluster_name/install-config.yaml.bak" ".clusters/$cluster_name/install-config.yaml" fi rm -rf .clusters/$cluster_name/{*.ign,metadata.json,auth,.openshift*,manifests} } function prepare () { assert_cluster_name "$@" local cluster_name="${1:-}" # Make a backup since the openshift-install command will consume it if [ -f ".clusters/$cluster_name/install-config.yaml" ]; then cp ".clusters/$cluster_name/install-config.yaml" ".clusters/$cluster_name/install-config.yaml.bak" fi # Include the cluster dir in the path for disconnected installations export PATH="$PWD/.clusters/$cluster_name:$PATH" openshift-install version # Create installation files openshift-install create manifests --dir=".clusters/$cluster_name" } function apply () { assert_cluster_name "$@" local cluster_name="${1:-}" prepare "$cluster_name" # Create installation files openshift-install create ignition-configs --dir=".clusters/$cluster_name" # Provision the infrastructure and wait for bootstrap to complete terraform apply -var-file=".clusters/$cluster_name/terraform.tfvars" -state=".clusters/$cluster_name/terraform.tfstate" -auto-approve openshift-install --dir=".clusters/$cluster_name" wait-for bootstrap-complete --log-level=info # Destroy the bootstrap node sed -i.bak 's/^\s*bootstrap_nodes\s*=\s*.*$/bootstrap_nodes = 0/' ".clusters/$cluster_name/terraform.tfvars" terraform apply -var-file=".clusters/$cluster_name/terraform.tfvars" -state=".clusters/$cluster_name/terraform.tfstate" -auto-approve # Auto-approve all pending CSRs for i in {0..240}; do approve_csr "$cluster_name" sleep 15 done & # Wait for the installation to complete openshift-install --dir=".clusters/$cluster_name" wait-for install-complete } function ping () { assert_cluster_name "$@" local cluster_name="${1:-}" oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" whoami } function approve_csr () { assert_cluster_name "$@" local cluster_name="${1:-}" oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" get csr --no-headers \ | awk '/Pending/ {print $1}' \ | xargs --no-run-if-empty oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" adm certificate approve } function start () { assert_cluster_name "$@" local cluster_name="${1:-}" ansible-playbook -i ".clusters/$cluster_name/inventory" ansible/start.yaml } function stop () { assert_cluster_name "$@" local cluster_name="${1:-}" ansible-playbook -i ".clusters/$cluster_name/inventory" ansible/stop.yaml } function post_install_nfs () { local cluster_name="${1:-}" oc apply --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" -f ".clusters/$cluster_name/registry-pv.yaml" oc patch --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" configs.imageregistry.operator.openshift.io cluster --type=json --patch-file=/dev/fd/0 < ".clusters/$cluster_name/router-certs.yaml" oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" apply -f ".clusters/$cluster_name/router-certs.yaml" -n openshift-ingress oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" patch ingresscontroller default -n openshift-ingress-operator --type=merge --patch-file=/dev/fd/0 < ".clusters/$cluster_name/api-certs.yaml" oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" apply -f ".clusters/$cluster_name/api-certs.yaml" -n openshift-config oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" patch apiserver cluster --type=merge --patch-file=/dev/fd/0 < ".clusters/$cluster_name/sso-secret.yaml" oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" apply -f ".clusters/$cluster_name/sso-secret.yaml" oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" apply -f - </dev/null; do echo "Waiting for the MultiClusterHub CRD to appear..." sleep 5 done oc --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" apply -f - <