Install pip requirements as user
[osm/devops.git] / installers / full_install_osm.sh
index f69d4c1..11723fe 100755 (executable)
@@ -54,6 +54,7 @@ function usage(){
     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 "     -T <docker tag> specify docker tag for the modules specified with option -m"
+    echo -e "     --nocachelxdimages:  do not cache local lxd images, do not create cronjob for that cache (will save installation time, might affect instantiation time)"
     echo -e "     --nolxd:        do not install and configure LXD, allowing unattended installations (assumes LXD is already installed and confifured)"
     echo -e "     --nodocker:     do not install docker, do not initialize a swarm (assumes docker is already installed and a swarm has been initialized)"
     echo -e "     --nojuju:       do not juju, assumes already installed"
@@ -137,7 +138,7 @@ function remove_iptables() {
 
     if [ -z "$DEFAULT_IP" ]; then
         DEFAULT_IF=$(ip route list|awk '$1=="default" {print $5; exit}')
-        [ -z "$DEFAULT_IF" ] && DEFAULT_IF=$(route -n |awk '$1~/^0.0.0.0/ {print $8; exit}')
+        [ -z "$DEFAULT_IF" ] && DEFAULT_IF=$(ip route list|awk '$1=="default" {print $5; exit}')
         [ -z "$DEFAULT_IF" ] && FATAL "Not possible to determine the interface with the default route 0.0.0.0"
         DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
         [ -z "$DEFAULT_IP" ] && FATAL "Not possible to determine the IP address of the interface with the default route"
@@ -220,7 +221,7 @@ function uninstall_lightweight() {
             remove_stack osm_elk
         fi
         echo "Now osm docker images and volumes will be deleted"
-       # TODO: clean-up of images should take into account if other tags were used for specific modules
+        # TODO: clean-up of images should take into account if other tags were used for specific modules
         newgrp docker << EONG
 for module in ro lcm keystone nbi mon pol pla osmclient; do
     docker image rm ${DOCKER_REGISTRY_URL}${DOCKER_USER}/${module}:${OSM_DOCKER_TAG}
@@ -339,6 +340,13 @@ function install_osmclient(){
     sudo -H LC_ALL=C python3 -m pip install -U pip
     sudo -H LC_ALL=C python3 -m pip install -U python-magic pyangbind verboselogs
     sudo apt-get install -y python3-osm-im python3-osmclient
+    if [ -f /usr/lib/python3/dist-packages/osm_im/requirements.txt ]; then
+        python3 -m pip install -r /usr/lib/python3/dist-packages/osm_im/requirements.txt
+    fi
+    if [ -f /usr/lib/python3/dist-packages/osmclient/requirements.txt ]; then
+        sudo apt-get install -y libcurl4-openssl-dev libssl-dev
+        python3 -m pip install -r /usr/lib/python3/dist-packages/osmclient/requirements.txt
+    fi
     #sed 's,OSM_SOL005=[^$]*,OSM_SOL005=True,' -i ${HOME}/.bashrc
     #echo 'export OSM_HOSTNAME=localhost' >> ${HOME}/.bashrc
     #echo 'export OSM_SOL005=True' >> ${HOME}/.bashrc
@@ -412,18 +420,18 @@ function install_docker_ce() {
         echo "Configuring docker proxy ..."
         if [ -f /etc/docker/daemon.json ]; then
             if grep -q registry-mirrors /etc/docker/daemon.json; then
-                sudo sed -Ei 's/("registry-mirrors".*\[)(.*)\]/\1\2, \"'"${DOCKER_PROXY_URL}"'\"\]/' /etc/docker/daemon.json
+                sudo sed -i "s|registry-mirrors.*|registry-mirrors\": [\"${DOCKER_PROXY_URL}\"] |" /etc/docker/daemon.json
             else
-                sudo sed -i 's/{/{\n  "registry-mirrors": [\"'"${DOCKER_PROXY_URL}"'\"]",/' /etc/docker/daemon.json
+                sudo sed -i "s|{|{\n  \"registry-mirrors\": [\"${DOCKER_PROXY_URL}\"],|" /etc/docker/daemon.json
             fi
         else
-            sudo cat << EOF > /etc/docker/daemon.json
+            sudo bash -c "cat << EOF > /etc/docker/daemon.json
 {
-  "registry-mirrors": ["${DOCKER_PROXY_URL}"]
+  \"registry-mirrors\": [\"${DOCKER_PROXY_URL}\"]
 }
-EOF
+EOF"
         fi
-       sudo systemctl daemon-reload
+        sudo systemctl daemon-reload
         sudo service docker restart
         echo "... restarted Docker service again"
     fi
@@ -444,7 +452,7 @@ function install_juju() {
     echo "Installing juju"
     sudo snap install juju --classic --channel=2.8/stable
     [[ ":$PATH": != *":/snap/bin:"* ]] && PATH="/snap/bin:${PATH}"
-    update_juju_images
+    [ -n "$INSTALL_NOCACHELXDIMAGES" ] || update_juju_images
     echo "Finished installation of juju"
     return 0
 }
@@ -578,11 +586,11 @@ function generate_docker_images() {
             if [ $module == "PLA" -a ! -n "$INSTALL_PLA" ]; then
                 continue
             fi
-           module_tag="${OSM_DOCKER_TAG}"
+            module_tag="${OSM_DOCKER_TAG}"
             if [ -n "${MODULE_DOCKER_TAG}" ] && echo $TO_REBUILD | grep -q $module ; then
                 module_tag="${MODULE_DOCKER_TAG}"
             fi
-           echo "Pulling ${DOCKER_REGISTRY_URL}${DOCKER_USER}/${module_lower}:${module_tag} docker image"
+            echo "Pulling ${DOCKER_REGISTRY_URL}${DOCKER_USER}/${module_lower}:${module_tag} docker image"
             sg docker -c "docker pull ${DOCKER_REGISTRY_URL}${DOCKER_USER}/${module_lower}:${module_tag}" || FATAL "cannot pull $module docker image"
         done
     else
@@ -781,6 +789,7 @@ function generate_docker_env_files() {
 
     # MON
     if [ ! -f $OSM_DOCKER_WORK_DIR/mon.env ]; then
+        echo "OSMMON_KEYSTONE_SERVICE_PASSWORD=${SERVICE_PASSWORD}" | $WORKDIR_SUDO tee -a $OSM_DOCKER_WORK_DIR/mon.env
         echo "OSMMON_DATABASE_COMMONKEY=${OSM_DATABASE_COMMONKEY}" | $WORKDIR_SUDO tee -a $OSM_DOCKER_WORK_DIR/mon.env
         echo "OSMMON_SQL_DATABASE_URI=mysql://root:${MYSQL_ROOT_PASSWORD}@mysql:3306/mon" | $WORKDIR_SUDO tee -a $OSM_DOCKER_WORK_DIR/mon.env
     fi
@@ -837,11 +846,13 @@ function install_kube() {
     sudo apt-get update
     echo "Installing Kubernetes Packages ..."
     sudo apt-get install -y kubelet=1.15.0-00 kubeadm=1.15.0-00 kubectl=1.15.0-00
+    sudo apt-mark hold kubelet kubeadm kubectl
 }
 
 #initializes kubernetes control plane
 function init_kubeadm() {
     sudo swapoff -a
+    sudo sed -i.bak '/.*none.*swap/s/^\(.*\)$/#\1/g' /etc/fstab
     sudo kubeadm init --config $1
     sleep 5
 }
@@ -854,9 +865,13 @@ function kube_config_dir() {
 }
 
 function install_k8s_storageclass() {
-    kubectl apply -f https://openebs.github.io/charts/openebs-operator-1.6.0.yaml
-    local storageclass_timeout=300
+    OPENEBS_DIR="$(mktemp -d -q --tmpdir "openebs.XXXXXX")"
+    trap 'rm -rf "${OPENEBS_DIR}"' EXIT
+    wget -q https://openebs.github.io/charts/openebs-operator-1.6.0.yaml -P $OPENEBS_DIR
+    kubectl apply -f $OPENEBS_DIR
+    local storageclass_timeout=400
     local counter=0
+    local storageclass_ready=""
     echo "Waiting for storageclass"
     while (( counter < storageclass_timeout ))
     do
@@ -864,12 +879,14 @@ function install_k8s_storageclass() {
 
         if [ $? -eq 0 ] ; then
             echo "Storageclass available"
+            storageclass_ready="y"
             break
         else
             counter=$((counter + 15))
             sleep 15
         fi
     done
+    [ -n "$storageclass_ready" ] || FATAL "Storageclass not ready after $storageclass_timeout seconds. Cannot install openebs"
     kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
 }
 
@@ -1197,7 +1214,7 @@ function install_lightweight() {
     DEFAULT_IF=$(ip route list|awk '$1=="default" {print $5; exit}')
     [ -z "$DEFAULT_IF" ] && DEFAULT_IF=$(route -n |awk '$1~/^0.0.0.0/ {print $8; exit}')
     [ -z "$DEFAULT_IF" ] && FATAL "Not possible to determine the interface with the default route 0.0.0.0"
-    DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF} |awk '{split($4,a,"/"); print a[1]}'`
+    DEFAULT_IP=`ip -o -4 a s ${DEFAULT_IF} |awk '{split($4,a,"/"); print a[1]}'`
     [ -z "$DEFAULT_IP" ] && FATAL "Not possible to determine the IP address of the interface with the default route"
     DEFAULT_MTU=$(ip addr show ${DEFAULT_IF} | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
 
@@ -1422,7 +1439,7 @@ function install_to_openstack() {
     fi
 
     # Install Pip for Python3
-    $WORKDIR_SUDO apt install -y python3-pip
+    $WORKDIR_SUDO apt install -y python3-pip python3-venv
     $WORKDIR_SUDO -H LC_ALL=C python3 -m pip install -U pip
 
     # Create a venv to avoid conflicts with the host installation
@@ -1430,9 +1447,9 @@ function install_to_openstack() {
 
     source $OPENSTACK_PYTHON_VENV/bin/activate
 
-    # Install Ansible, OpenStack client and SDK
+    # Install Ansible, OpenStack client and SDK, latest openstack version supported is Train
     python -m pip install -U wheel
-    python -m pip install -U python-openstackclient "openstacksdk>=0.12.0,<1" "ansible>=2.10,<2.11"
+    python -m pip install -U "python-openstackclient<=4.0.2" "openstacksdk>=0.12.0,<=0.36.2" "ansible>=2.10,<2.11"
 
     # Install the Openstack cloud module (ansible>=2.10)
     ansible-galaxy collection install openstack.cloud
@@ -1524,6 +1541,7 @@ function dump_vars(){
     echo "INSTALL_LIGHTWEIGHT=$INSTALL_LIGHTWEIGHT"
     echo "INSTALL_ONLY=$INSTALL_ONLY"
     echo "INSTALL_ELK=$INSTALL_ELK"
+    echo "INSTALL_NOCACHELXDIMAGES=$INSTALL_NOCACHELXDIMAGES"
     #echo "INSTALL_PERFMON=$INSTALL_PERFMON"
     echo "INSTALL_TO_OPENSTACK=$INSTALL_TO_OPENSTACK"
     echo "OPENSTACK_PUBLIC_NET_NAME=$OPENSTACK_PUBLIC_NET_NAME"
@@ -1617,6 +1635,7 @@ KUBERNETES="y"
 NGUI="y"
 INSTALL_K8S_MONITOR=""
 INSTALL_NOHOSTCLIENT=""
+INSTALL_NOCACHELXDIMAGES=""
 SESSION_ID=`date +%s`
 OSM_DEVOPS=
 OSM_VCA_HOST=
@@ -1811,6 +1830,7 @@ while getopts ":b:r:c:n:k:u:R:D:o:O:m:N:H:S:s:w:t:U:P:A:l:L:K:d:p:T:f:F:-: hy" o
             [ "${OPTARG}" == "registry" ] && continue
             [ "${OPTARG}" == "pla" ] && INSTALL_PLA="y" && continue
             [ "${OPTARG}" == "volume" ] && OPENSTACK_ATTACH_VOLUME="true" && continue
+            [ "${OPTARG}" == "nocachelxdimages" ] && INSTALL_NOCACHELXDIMAGES="y" && continue
             echo -e "Invalid option: '--$OPTARG'\n" >&2
             usage && exit 1
             ;;
@@ -1931,5 +1951,3 @@ export OSM_USE_LOCAL_DEVOPS=true
 wget -q -O- https://osm-download.etsi.org/ftp/osm-9.0-nine/README2.txt &> /dev/null
 track end
 echo -e "\nDONE"
-
-