| #!/bin/bash |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| function usage(){ |
| [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function |
| echo -e "usage: $0 [OPTIONS]" |
| echo -e "Install OSM" |
| echo -e " OPTIONS" |
| echo -e " -h / --help: print this help" |
| echo -e " -y: do not prompt for confirmation, assumes yes" |
| echo -e " -S <gerrit refspec>: use a specific devops gerrit refspec (branch, tag, commit), default is master" |
| echo -e " -a <apt proxy url>: use this apt proxy url when downloading apt packages (air-gapped installation)" |
| echo -e " -c <kubernetes engine>: use a specific kubernetes engine (options: kubeadm, k3s), default is kubeadm" |
| echo -e " -t <docker tag> specify osm docker tag (default is latest)" |
| echo -e " -M <KUBECONFIG_FILE>: Kubeconfig of an existing cluster to be used as mgmt cluster instead of OSM cluster" |
| echo -e " -G <KUBECONFIG_FILE>: Kubeconfig of an existing cluster to be used as auxiliary cluster instead of OSM cluster" |
| echo -e " -O <KUBECONFIG_FILE>: Kubeconfig of an existing cluster to be used as OSM cluster instead of creating a new one from scratch" |
| echo -e " --no-mgmt-cluster: Do not provision a mgmt cluster for cloud-native gitops operations in OSM (NEW in Release SIXTEEN) (by default, it is installed)" |
| echo -e " --no-aux-cluster: Do not provision an auxiliary cluster for cloud-native gitops operations in OSM (NEW in Release SIXTEEN) (by default, it is installed)" |
| echo -e " -s <namespace> namespace where OSM helm chart will be deployed (default is osm)" |
| echo -e " -d <docker registry URL> use docker registry URL instead of dockerhub" |
| echo -e " -p <docker proxy URL> set docker proxy URL as part of docker CE configuration" |
| echo -e " -m <MODULE>: module to test a specific docker image (NG-UI, NBI, LCM, RO, MON) (can be used several times)" |
| echo -e " -T <docker tag> use specific docker tag for the module specified with option -m" |
| echo -e " -U <docker user>: specify docker user to use when pulling images from a private registry" |
| echo -e " -D <devops path>: use particular devops installation path" |
| echo -e " -e <external IP>: set the external IP address of the OSM cluster (default is empty, which means autodetect)" |
| echo -e " --debug: debug mode" |
| [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function |
| } |
| |
| HERE=$(dirname "$(readlink --canonicalize "$BASH_SOURCE")") |
| OSM_DEVOPS="${OSM_DEVOPS:-"${HERE}/.."}" |
| source $OSM_DEVOPS/library/all_funcs |
| |
| echo "Load default options and export user installation options" |
| source $OSM_DEVOPS/installers/00-default-install-options.rc |
| |
| RE_CHECK='^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' |
| while getopts ":a:c:e:S:D:s:t:U:d:p:m:T:M:G:O:-: hy" o; do |
| case "${o}" in |
| S) |
| DEVOPS_GERRIT_REFSPEC="${OPTARG}" |
| ;; |
| a) |
| APT_PROXY_URL=${OPTARG} |
| ;; |
| c) |
| K8S_CLUSTER_ENGINE=${OPTARG} |
| [ "${K8S_CLUSTER_ENGINE}" == "kubeadm" ] && continue |
| [ "${K8S_CLUSTER_ENGINE}" == "k3s" ] && continue |
| echo -e "Invalid argument for -c : ' ${K8S_CLUSTER_ENGINE}'\n" >&2 |
| usage && exit 1 |
| ;; |
| e) |
| OSM_K8S_EXTERNAL_IP="${OPTARG}" |
| ;; |
| D) |
| OSM_DEVOPS="${OPTARG}" |
| ;; |
| s) |
| OSM_NAMESPACE="${OPTARG}" && [[ ! "${OPTARG}" =~ $RE_CHECK ]] && echo "Namespace $OPTARG is invalid. Regex used for validation is $RE_CHECK" && exit 0 |
| ;; |
| t) |
| OSM_DOCKER_TAG="${OPTARG}" |
| REPO_ARGS+=(-t "$OSM_DOCKER_TAG") |
| ;; |
| U) |
| DOCKER_USER="${OPTARG}" |
| ;; |
| d) |
| parse_docker_registry_url "${OPTARG}" |
| ;; |
| p) |
| DOCKER_PROXY_URL="${OPTARG}" |
| ;; |
| m) |
| [ "${OPTARG}" == "NG-UI" ] && MODULES_FOR_TESTING="NGUI $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "NBI" ] && MODULES_FOR_TESTING="NBI $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "LCM" ] && MODULES_FOR_TESTING="LCM $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "RO" ] && MODULES_FOR_TESTING="RO $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "MON" ] && MODULES_FOR_TESTING="MON $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "NG-SA" ] && MODULES_FOR_TESTING="NG-SA $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "osmclient" ] && MODULES_FOR_TESTING="osmclient $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "prometheus" ] && MODULES_FOR_TESTING="prometheus $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "webhookTranslator" ] && MODULES_FOR_TESTING="webhookTranslator $MODULES_FOR_TESTING" && continue |
| [ "${OPTARG}" == "keystone" ] && MODULES_FOR_TESTING="keystone $MODULES_FOR_TESTING" && continue |
| ;; |
| T) |
| MODULE_DOCKER_TAG="${OPTARG}" |
| ;; |
| M) |
| KUBECONFIG_MGMT_CLUSTER="${OPTARG}" |
| ;; |
| G) |
| KUBECONFIG_AUX_CLUSTER="${OPTARG}" |
| ;; |
| O) |
| KUBECONFIG_OSM_CLUSTER="${OPTARG}" |
| ;; |
| -) |
| [ "${OPTARG}" == "help" ] && usage && exit 0 |
| [ "${OPTARG}" == "debug" ] && DEBUG_INSTALL="--debug" && continue |
| [ "${OPTARG}" == "no-mgmt-cluster" ] && INSTALL_MGMT_CLUSTER="" && continue |
| [ "${OPTARG}" == "no-aux-cluster" ] && INSTALL_AUX_CLUSTER="" && continue |
| if [[ "${OPTARG}" == "client-version" ]]; then |
| OSM_CLIENT_VERSION="${!OPTIND}"; OPTIND=$((OPTIND + 1)) |
| continue |
| fi |
| if [[ "${OPTARG}" == "im-version" ]]; then |
| OSM_IM_VERSION="${!OPTIND}"; OPTIND=$((OPTIND + 1)) |
| continue |
| fi |
| echo -e "Invalid option: '--$OPTARG'\n" >&2 |
| usage && exit 1 |
| ;; |
| :) |
| echo "Option -$OPTARG requires an argument" >&2 |
| usage && exit 1 |
| ;; |
| \?) |
| echo -e "Invalid option: '-$OPTARG'\n" >&2 |
| usage && exit 1 |
| ;; |
| h) |
| usage && exit 0 |
| ;; |
| y) |
| ASSUME_YES="y" |
| ;; |
| *) |
| usage && exit 1 |
| ;; |
| esac |
| done |
| |
| |
| [ -z "${DEBUG_INSTALL}" ] || DEBUG Debug is on |
| # Installation starts here |
| |
| # Get README and create OSM_TRACK_INSTALLATION_ID |
| curl -s https://osm-download.etsi.org/ftp/osm-19.0-nineteen/README.txt > /dev/null 2>&1 |
| export OSM_TRACK_INSTALLATION_ID="$(date +%s)-$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16)" |
| |
| # Get OS info to be tracked |
| os_distro=$(lsb_release -i 2>/dev/null | awk '{print $3}') |
| echo $os_distro |
| os_release=$(lsb_release -r 2>/dev/null | awk '{print $2}') |
| echo $os_release |
| os_info="${os_distro}_${os_release}" |
| os_info="${os_info// /_}" |
| |
| # Initial checks: proxy, root user, proceed |
| check_osm_behind_proxy |
| track start release $RELEASE none none docker_tag $OSM_DOCKER_TAG none none installation_type Default none none os_info $os_info none none |
| track checks checkingroot_ok |
| [ "$USER" == "root" ] && FATAL "You are running the installer as root. The installer is prepared to be executed as a normal user with sudo privileges." |
| track checks noroot_ok |
| ask_proceed |
| track checks proceed_ok |
| |
| # Setup prerequisites |
| echo "Setting up external IP address" |
| setup_external_ip |
| [ -n "$APT_PROXY_URL" ] && echo "Configuring APT proxy" && configure_apt_proxy $APT_PROXY_URL |
| track prereq prereqok_ok |
| |
| # Export installation options |
| $OSM_DEVOPS/installers/01-export-osm-install-options.sh || FATAL_TRACK exportinstallopts "01-export-osm-install-options.sh failed" |
| track exportinstallopts exportinstallopts_ok |
| |
| # Setup Client tools |
| echo "Setup CLI tools for mgmt and aux cluster" |
| $OSM_DEVOPS/installers/10-install-client-tools.sh || FATAL_TRACK installclitools "10-install-client-tools.sh failed" |
| track installclitools installclitools_ok |
| |
| # Install K8s cluster where all OSM components will be deployed |
| echo "Installing K8s cluster ..." |
| source "${HERE}/../library/utils.sh" |
| # setup_external_ip |
| export OSM_DEFAULT_IP |
| export OSM_K8S_EXTERNAL_IP |
| $OSM_DEVOPS/installers/15-install-k8s-cluster.sh || FATAL_TRACK k8scluster "15-install-k8s-cluster.sh" |
| track k8scluster k8scluster_ok |
| |
| # Deploy auxiliary services |
| if [ -n "${INSTALL_AUX_CLUSTER}" ]; then |
| echo "Deploy auxiliary services (Gitea, S3)" |
| $OSM_DEVOPS/installers/20-deploy-aux-svc-cluster.sh || FATAL_TRACK deployauxsvc "20-deploy-aux-svc-cluster.sh failed" |
| else |
| echo "Skipping deployment of auxiliary services." |
| echo "Using existing git credentials and repos defined in ${CREDENTIALS_DIR}/git_environment.rc" |
| # cat << EOF > "${CREDENTIALS_DIR}/git_environment.rc" |
| # export GIT_BASE_HTTP_URL="${GITEA_HTTP_URL}" |
| # export FLEET_REPO_HTTP_URL="${FLEET_REPO_HTTP_URL}" |
| # export FLEET_REPO_SSH_URL="${FLEET_REPO_SSH_URL}" |
| # export FLEET_REPO_GIT_USERNAME="${FLEET_REPO_GIT_USERNAME}" |
| # export FLEET_REPO_GIT_USER_PASS='${FLEET_REPO_GIT_USER_PASS}' |
| # export SW_CATALOGS_REPO_HTTP_URL="${SW_CATALOGS_REPO_HTTP_URL}" |
| # export SW_CATALOGS_REPO_SSH_URL="${SW_CATALOGS_REPO_SSH_URL}" |
| # export SW_CATALOGS_REPO_GIT_USERNAME="${SW_CATALOGS_REPO_GIT_USERNAME}" |
| # export SW_CATALOGS_REPO_GIT_USER_PASS='${SW_CATALOGS_REPO_GIT_USER_PASS}' |
| # EOF |
| fi |
| track deployauxsvc deployauxsvc_ok |
| |
| # Deploy mgmt services |
| if [ -n "${INSTALL_MGMT_CLUSTER}" ]; then |
| echo "Deploy mgmt cluster (Flux, etc.)" |
| $OSM_DEVOPS/installers/30-deploy-mgmt-cluster.sh || FATAL_TRACK mgmtcluster "30-deploy-mgmt-cluster.sh failed" |
| else |
| echo "Skipping deployment of mgmt cluster" |
| # TODO: write env variables to files" |
| fi |
| track mgmtcluster mgmtcluster_ok |
| |
| # Deploy OSM (OSM helm chart) |
| echo "Deploy OSM helm chart" |
| export OSM_K8S_EXTERNAL_IP |
| $OSM_DEVOPS/installers/40-deploy-osm.sh || FATAL_TRACK deployosm "40-deploy-osm.sh failed" |
| track deploy_osm deploy_osm_ok |
| |
| # Provision OSM |
| echo -e "Adding local K8s cluster _system-osm-k8s to OSM ..." |
| $OSM_DEVOPS/installers/50-provision-osm.sh || FATAL_TRACK provision-osm "50-provision-osm.sh failed" |
| track provisionosm provisionosm_ok |
| |
| curl -s https://osm-download.etsi.org/ftp/osm-19.0-nineteen/README2.txt > /dev/null 2>&1 |
| track end |
| |
| echo "Credentials stored under ${CREDENTIALS_DIR}" |
| echo "Git repos for OSM declarative framework stored under ${WORK_REPOS_DIR}" |
| echo "Kubeconfigs of the aux-svc cluster, mgmt cluster and OSM cluster stored under ${OSM_HOME_DIR}/clusters" |
| echo -e "\nDONE" |
| exit 0 |