From 2e9180647cf816722458409365d4dbe598189758 Mon Sep 17 00:00:00 2001 From: David Garcia Date: Fri, 6 May 2022 13:17:42 +0200 Subject: [PATCH] Use juju version 2.9.29 - Fix bug 2018 Change-Id: I122eaa9c2c82ddbe00ee529ac3944cc666dc4a52 Signed-off-by: David Garcia --- installers/charmed_install.sh | 2 +- installers/full_install_osm.sh | 2 +- installers/install_juju.sh | 257 +++++++++++++++++++++++++++++++++ 3 files changed, 259 insertions(+), 2 deletions(-) create mode 100755 installers/install_juju.sh diff --git a/installers/charmed_install.sh b/installers/charmed_install.sh index 58184104..e61bbddb 100755 --- a/installers/charmed_install.sh +++ b/installers/charmed_install.sh @@ -17,7 +17,7 @@ LXD_VERSION=4.0 JUJU_VERSION=2.9 -JUJU_AGENT_VERSION=2.9.25 +JUJU_AGENT_VERSION=2.9.29 K8S_CLOUD_NAME="k8s-cloud" KUBECTL="microk8s.kubectl" MICROK8S_VERSION=1.23 diff --git a/installers/full_install_osm.sh b/installers/full_install_osm.sh index c7e91197..3b0465f2 100755 --- a/installers/full_install_osm.sh +++ b/installers/full_install_osm.sh @@ -1635,7 +1635,7 @@ function parse_docker_registry_url() { LXD_VERSION=4.0 JUJU_VERSION=2.9 -JUJU_AGENT_VERSION=2.9.25 +JUJU_AGENT_VERSION=2.9.29 UNINSTALL="" DEVELOP="" UPDATE="" diff --git a/installers/install_juju.sh b/installers/install_juju.sh new file mode 100755 index 00000000..25bd2389 --- /dev/null +++ b/installers/install_juju.sh @@ -0,0 +1,257 @@ +#!/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 Juju for OSM" + echo -e " OPTIONS" + echo -e " -h / --help: print this help" + echo -e " -D use local devops installation path" + echo -e " -s or user defined stack name when installed using swarm or namespace when installed using k8s, default is osm" + echo -e " -H use specific juju host controller IP" + echo -e " -S use VCA/juju secret key" + echo -e " -P use VCA/juju public key file" + echo -e " -l: LXD cloud yaml file" + echo -e " -L: LXD credentials yaml file" + echo -e " -K: Specifies the name of the controller to use - The controller must be already bootstrapped" + echo -e " --debug: debug mode" + echo -e " --cachelxdimages: cache local lxd images, create cronjob for that cache (will make installation longer)" + echo -e " --nojuju: do not juju, assumes already installed" + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function +} + +function update_juju_images(){ + [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function + crontab -l | grep update-juju-lxc-images || (crontab -l 2>/dev/null; echo "0 4 * * 6 $USER ${OSM_DEVOPS}/installers/update-juju-lxc-images --xenial --bionic") | crontab - + ${OSM_DEVOPS}/installers/update-juju-lxc-images --xenial --bionic + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function +} + +function install_juju() { + [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function + echo "Installing juju" + sudo snap install juju --classic --channel=$JUJU_VERSION/stable + [[ ":$PATH": != *":/snap/bin:"* ]] && PATH="/snap/bin:${PATH}" + [ -n "$INSTALL_CACHELXDIMAGES" ] && update_juju_images + echo "Finished installation of juju" + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function + return 0 +} + +function juju_createcontroller_k8s(){ + [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function + cat $HOME/.kube/config | juju add-k8s $OSM_VCA_K8S_CLOUDNAME --client \ + || FATAL "Failed to add K8s endpoint and credential for client in cloud $OSM_VCA_K8S_CLOUDNAME" + juju bootstrap -v --debug $OSM_VCA_K8S_CLOUDNAME $OSM_STACK_NAME \ + --config controller-service-type=loadbalancer \ + --agent-version=$JUJU_AGENT_VERSION \ + || FATAL "Failed to bootstrap controller $OSM_STACK_NAME in cloud $OSM_VCA_K8S_CLOUDNAME" + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function +} + +function juju_addlxd_cloud(){ + [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function + mkdir -p /tmp/.osm + OSM_VCA_CLOUDNAME="lxd-cloud" + LXDENDPOINT=$DEFAULT_IP + LXD_CLOUD=/tmp/.osm/lxd-cloud.yaml + LXD_CREDENTIALS=/tmp/.osm/lxd-credentials.yaml + + cat << EOF > $LXD_CLOUD +clouds: + $OSM_VCA_CLOUDNAME: + type: lxd + auth-types: [certificate] + endpoint: "https://$LXDENDPOINT:8443" + config: + ssl-hostname-verification: false +EOF + openssl req -nodes -new -x509 -keyout /tmp/.osm/client.key -out /tmp/.osm/client.crt -days 365 -subj "/C=FR/ST=Nice/L=Nice/O=ETSI/OU=OSM/CN=osm.etsi.org" + local server_cert=`cat /var/snap/lxd/common/lxd/server.crt | sed 's/^/ /'` + local client_cert=`cat /tmp/.osm/client.crt | sed 's/^/ /'` + local client_key=`cat /tmp/.osm/client.key | sed 's/^/ /'` + + cat << EOF > $LXD_CREDENTIALS +credentials: + $OSM_VCA_CLOUDNAME: + lxd-cloud: + auth-type: certificate + server-cert: | +$server_cert + client-cert: | +$client_cert + client-key: | +$client_key +EOF + lxc config trust add local: /tmp/.osm/client.crt + juju add-cloud -c $OSM_STACK_NAME $OSM_VCA_CLOUDNAME $LXD_CLOUD --force + juju add-credential -c $OSM_STACK_NAME $OSM_VCA_CLOUDNAME -f $LXD_CREDENTIALS + sg lxd -c "lxd waitready" + juju controller-config features=[k8s-operators] + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function +} + +#Safe unattended install of iptables-persistent +function check_install_iptables_persistent(){ + [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function + echo -e "\nChecking required packages: iptables-persistent" + if ! dpkg -l iptables-persistent &>/dev/null; then + echo -e " Not installed.\nInstalling iptables-persistent requires root privileges" + echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections + echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections + sudo apt-get -yq install iptables-persistent + fi + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function +} + +function juju_createproxy() { + [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function + check_install_iptables_persistent + + if ! sudo iptables -t nat -C PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST; then + sudo iptables -t nat -A PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST + sudo netfilter-persistent save + fi + [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function +} + +DEBUG_INSTALL="" +INSTALL_CACHELXDIMAGES="" +INSTALL_NOJUJU="" +JUJU_AGENT_VERSION=2.9.29 +JUJU_VERSION=2.9 +OSM_DEVOPS= +OSM_STACK_NAME=osm +OSM_VCA_HOST= +OSM_VCA_CLOUDNAME="localhost" +OSM_VCA_K8S_CLOUDNAME="k8scloud" +RE_CHECK='^[a-z0-9]([-a-z0-9]*[a-z0-9])?$' + +while getopts ":D:i:s:H:l:L:K:-: h" o; do + case "${o}" in + D) + OSM_DEVOPS="${OPTARG}" + ;; + i) + DEFAULT_IP="${OPTARG}" + ;; + s) + OSM_STACK_NAME="${OPTARG}" && [[ ! "${OPTARG}" =~ $RE_CHECK ]] && echo "Namespace $OPTARG is invalid. Regex used for validation is $RE_CHECK" && exit 0 + ;; + H) + OSM_VCA_HOST="${OPTARG}" + ;; + l) + LXD_CLOUD_FILE="${OPTARG}" + ;; + L) + LXD_CRED_FILE="${OPTARG}" + ;; + K) + CONTROLLER_NAME="${OPTARG}" + ;; + -) + [ "${OPTARG}" == "help" ] && usage && exit 0 + [ "${OPTARG}" == "debug" ] && DEBUG_INSTALL="--debug" && continue + [ "${OPTARG}" == "nojuju" ] && INSTALL_NOJUJU="y" && continue + [ "${OPTARG}" == "cachelxdimages" ] && INSTALL_CACHELXDIMAGES="y" && continue + 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 + ;; + *) + usage && exit 1 + ;; + esac +done + +source $OSM_DEVOPS/common/logging +source $OSM_DEVOPS/common/track + +echo "DEBUG_INSTALL=$DEBUG_INSTALL" +echo "DEFAULT_IP=$DEFAULT_IP" +echo "OSM_DEVOPS=$OSM_DEVOPS" +echo "HOME=$HOME" + +[ -z "$INSTALL_NOJUJU" ] && install_juju +track juju juju_install_ok + +if [ -z "$OSM_VCA_HOST" ]; then + if [ -z "$CONTROLLER_NAME" ]; then + juju_createcontroller_k8s + juju_addlxd_cloud + if [ -n "$LXD_CLOUD_FILE" ]; then + [ -z "$LXD_CRED_FILE" ] && FATAL "The installer needs the LXD credential yaml if the LXD is external" + OSM_VCA_CLOUDNAME="lxd-cloud" + juju add-cloud $OSM_VCA_CLOUDNAME $LXD_CLOUD_FILE --force || juju update-cloud $OSM_VCA_CLOUDNAME --client -f $LXD_CLOUD_FILE + juju add-credential $OSM_VCA_CLOUDNAME -f $LXD_CRED_FILE || juju update-credential $OSM_VCA_CLOUDNAME lxd-cloud-creds -f $LXD_CRED_FILE + fi + juju_createproxy + else + OSM_VCA_CLOUDNAME="lxd-cloud" + if [ -n "$LXD_CLOUD_FILE" ]; then + [ -z "$LXD_CRED_FILE" ] && FATAL "The installer needs the LXD credential yaml if the LXD is external" + juju add-cloud -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME $LXD_CLOUD_FILE --force || juju update-cloud lxd-cloud -c $CONTROLLER_NAME -f $LXD_CLOUD_FILE + juju add-credential -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME -f $LXD_CRED_FILE || juju update-credential lxd-cloud -c $CONTROLLER_NAME -f $LXD_CRED_FILE + else + mkdir -p ~/.osm + cat << EOF > ~/.osm/lxd-cloud.yaml +clouds: + lxd-cloud: + type: lxd + auth-types: [certificate] + endpoint: "https://$DEFAULT_IP:8443" + config: + ssl-hostname-verification: false +EOF + openssl req -nodes -new -x509 -keyout ~/.osm/client.key -out ~/.osm/client.crt -days 365 -subj "/C=FR/ST=Nice/L=Nice/O=ETSI/OU=OSM/CN=osm.etsi.org" + local server_cert=`cat /var/snap/lxd/common/lxd/server.crt | sed 's/^/ /'` + local client_cert=`cat ~/.osm/client.crt | sed 's/^/ /'` + local client_key=`cat ~/.osm/client.key | sed 's/^/ /'` + cat << EOF > ~/.osm/lxd-credentials.yaml +credentials: + lxd-cloud: + lxd-cloud: + auth-type: certificate + server-cert: | +$server_cert + client-cert: | +$client_cert + client-key: | +$client_key +EOF + lxc config trust add local: ~/.osm/client.crt + juju add-cloud -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME ~/.osm/lxd-cloud.yaml --force || juju update-cloud lxd-cloud -c $CONTROLLER_NAME -f ~/.osm/lxd-cloud.yaml + juju add-credential -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME -f ~/.osm/lxd-credentials.yaml || juju update-credential lxd-cloud -c $CONTROLLER_NAME -f ~/.osm/lxd-credentials.yaml + fi + fi + [ -z "$CONTROLLER_NAME" ] && OSM_VCA_HOST=`sg lxd -c "juju show-controller $OSM_STACK_NAME"|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'` + [ -n "$CONTROLLER_NAME" ] && OSM_VCA_HOST=`juju show-controller $CONTROLLER_NAME |grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'` + [ -z "$OSM_VCA_HOST" ] && FATAL "Cannot obtain juju controller IP address" +fi +track juju juju_controller_ok + + -- 2.25.1