[TryMOS] Rename startup scripts and location

* Fix getting storage networks
* Make variables modular
* Drop hardcoded sleep in wait

Related-Prod: PRODX-3456
Change-Id: Ibd7aece3bd6262d2ad579d20e87d8af661cef3d9
diff --git a/trymos/image_build/build_image.sh b/trymos/image_build/build_image.sh
index e935332..e667636 100755
--- a/trymos/image_build/build_image.sh
+++ b/trymos/image_build/build_image.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
-export IMAGE_BASE_URL="https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img"
-export IMAGE_MD5_URL="https://cloud-images.ubuntu.com/bionic/current/MD5SUMS"
+export IMAGE_BASE_URL="http://images.mcp.mirantis.net/bionic-server-cloudimg-amd64-20190612.img"
+export IMAGE_MD5_URL="http://images.mcp.mirantis.net/bionic-server-cloudimg-amd64-20190612.img.md5"
 export VM_NAME="trymos-bionic-amd64.qcow2"
 
 export PACKER_LOG=1
diff --git a/trymos/image_build/files/usr/share/metadata/ceph.yaml b/trymos/image_build/files/usr/share/metadata/ceph.yaml
deleted file mode 100644
index 24f92f2..0000000
--- a/trymos/image_build/files/usr/share/metadata/ceph.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-storageDevices:
-  - name: vdb
-    role: hdd
-    sizeGb: 2
-ramGb: 8
-cores: 2
diff --git a/trymos/image_build/files/usr/share/trymos/environment/amazon b/trymos/image_build/files/usr/share/trymos/environment/amazon
new file mode 100644
index 0000000..67324b4
--- /dev/null
+++ b/trymos/image_build/files/usr/share/trymos/environment/amazon
@@ -0,0 +1,8 @@
+export NTP_SERVERS=169.254.169.123
+export DOCKER_EE_URL=https://storebits.docker.com/ubuntu
+export DOCKER_UCP_VERSION=3.3.6
+export DOCKER_UCP_IMAGE=mirantis.azurecr.io/lcm/docker/ucp:${DOCKER_UCP_VERSION}
+export MIRANTIS_ARTIFACTORY_URL=https://binary.mirantis.com
+export CEPH_STORAGE_OSD_DEVICE="xvdb"
+export CEPH_CLUSTER_FILE="${RELEASE_OPENSTACK_K8S}/examples/miraceph/aio-ceph_local_drives_openstack.yaml"
+export OPENSTACK_CONTEXT_NAME="aio-core-ceph-local-non-dvr"
diff --git a/trymos/image_build/files/usr/share/trymos/environment/openstack b/trymos/image_build/files/usr/share/trymos/environment/openstack
new file mode 100644
index 0000000..373e7c6
--- /dev/null
+++ b/trymos/image_build/files/usr/share/trymos/environment/openstack
@@ -0,0 +1,4 @@
+export CEPH_STORAGE_OSD_DEVICE="vdb"
+export CEPH_CLUSTER_FILE="${RELEASE_OPENSTACK_K8S}/examples/miraceph/aio-ceph_local_drives_openstack.yaml"
+export OPENSTACK_CONTEXT_NAME="aio-core-ceph-local-non-dvr"
+export MIRANTIS_ARTIFACTORY_URL=https://binary.mirantis.com
diff --git a/trymos/image_build/files/srv/bin/bootstrap_trymos_aws.sh b/trymos/image_build/files/usr/share/trymos/launch.sh
similarity index 67%
rename from trymos/image_build/files/srv/bin/bootstrap_trymos_aws.sh
rename to trymos/image_build/files/usr/share/trymos/launch.sh
index 659551e..12eb105 100755
--- a/trymos/image_build/files/srv/bin/bootstrap_trymos_aws.sh
+++ b/trymos/image_build/files/usr/share/trymos/launch.sh
@@ -9,28 +9,41 @@
 export NODE_TYPE='trymos'
 export NODE_METADATA='{"labels": {"local-volume-provisioner": "enabled", "openstack-compute-node": "enabled", "openstack-control-plane": "enabled", "openstack-gateway": "enabled", "openvswitch": "enabled", "role": "ceph-osd-node"}}'
 
+_ENVIRONMENT_FOLDER="/usr/share/trymos/environment"
+_DEPLOY_FINISHED_LOCK="/var/tmp/trymos-deploy-finished.lock"
+_TRYMOS_INFO_FILE="/etc/trymos-info"
+
+
+export RELEASE_OPENSTACK_K8S=/srv/release-openstack-k8s
+export CERT_REPO_DIR=/srv/certs
+export CSR_CONF="${CERT_REPO_DIR}/api-csr.yaml"
+export SSL_BARE_NAME='api'
+
+function get_instance_type {
+    if grep "OpenStack" -i /sys/devices/virtual/dmi/id/product_name  -q; then
+        echo "openstack"
+    elif grep "amazon" -i /sys/devices/virtual/dmi/id/product_version -q; then
+        echo "amazon"
+    else
+        echo "UNKNOWN"
+    fi
+}
+export _INSTANCE_TYPE=$(get_instance_type)
+
+if [[ -f "$_ENVIRONMENT_FOLDER/${_INSTANCE_TYPE}" ]]; then
+    source $_ENVIRONMENT_FOLDER/${_INSTANCE_TYPE}
+else
+    echo "Unknown instance type $_INSTANCE_TYPE"
+    exit 1
+fi
+
+source /usr/share/trymos/functions
 
 export STORAGE_CLUSTER_CIDR=${CONTROL_NETWORK_CIDR}
 export STORAGE_PUBLIC_CIDR=${CONTROL_NETWORK_CIDR}
-export NTP_SERVERS=${NTP_SERVERS:-169.254.169.123}
-
-#TryMOS variables
-export DOCKER_UCP_VERSION=3.3.3
-export DOCKER_UCP_IMAGE=${DOCKER_UCP_IMAGE:-mirantis.azurecr.io/lcm/docker/ucp:${DOCKER_UCP_VERSION}}
-export RELEASE_OPENSTACK_K8S=${RELEASE_OPENSTACK_K8S:-/srv/release-openstack-k8s}
-export CERT_REPO_DIR=${CERT_REPO_DIR:-/srv/certs}
-export CSR_CONF="${CERT_REPO_DIR}/api-csr.yaml"
-export SSL_BARE_NAME='api'
-export MIRANTIS_ARTIFACTORY_URL=${MIRANTIS_ARTIFACTORY_URL:-https://binary.mirantis.com}
-export CEPH_CLUSTER_FILE="${RELEASE_OPENSTACK_K8S}/examples/miraceph/aio-ceph_local_drives_openstack.yaml"
-export OPENSTACK_CONTEXT_NAME=${OPENSTACK_CONTEXT_NAME:-"aio-core-ceph-local-non-dvr"}
 export TUNNEL_INTERFACE=${TUNNEL_INTERFACE:-${DEFAULT_INTERFACE}}
 export LIVE_MIGRATION_INTERFACE=${LIVE_MIGRATION_INTERFACE:-${DEFAULT_INTERFACE}}
 
-_DEPLOY_FINISHED_LOCK="/var/tmp/trymos-deploy-finished.lock"
-
-source /usr/share/trymos/functions
-
 if [[ -f ${_DEPLOY_FINISHED_LOCK} ]]; then
     echo "TryMOS deploy has been performed on this node."
     echo "If you want to redeploy please delete lock file"
@@ -43,6 +56,19 @@
     echo "$msg"
 }
 
+function generate_ceph_metadata {
+    mkdir -p /usr/share/metadata
+    cat << EOF > /usr/share/metadata/ceph.yaml
+storageDevices:
+  - name: ${CEPH_STORAGE_OSD_DEVICE}
+    role: hdd
+    sizeGb: 2
+ramGb: 8
+cores: 2
+EOF
+
+}
+
 
 function configure_virt_public_iface {
 
@@ -139,6 +165,59 @@
     fi
 }
 
+function wait_for_pods {
+    local namespace=$1
+    local component_filter=${2:-""}
+    local timeout=${3:-900}
+    local delay=${4:-30}
+
+
+    end=$(date +%s)
+    end=$((end + timeout))
+    while true; do
+        sleep $delay
+        if kubectl get pods --namespace=${namespace} $component_filter 2>&1 |grep -q 'No resources found'; then
+            continue
+        fi
+
+        kubectl get pods --namespace=${namespace} $component_filter -o json | jq -r \
+            '.items[].status.phase' | grep Pending > /dev/null && \
+            PENDING="True" || PENDING="False"
+
+        query='.items[]|select(.status.phase=="Running")'
+        query="$query|.status.containerStatuses[].ready"
+        kubectl get pods --namespace=${namespace} $component_filter -o json | jq -r "$query" | \
+            grep false > /dev/null && READY="False" || READY="True"
+
+        kubectl get jobs --namespace=${namespace} $component_filter -o json | jq -r \
+            '.items[] | .spec.completions == .status.succeeded' | \
+            grep false > /dev/null && JOBR="False" || JOBR="True"
+        [ $PENDING == "False" -a $READY == "True" -a $JOBR == "True" ] && \
+            break || true
+        sleep 5
+        now=$(date +%s)
+        if [ $now -gt $end ] ; then
+            echo "Containers failed to start after $timeout seconds"
+            echo
+            kubectl get pods --namespace ${namespace} $component_filter -o wide
+            echo
+            if [ $PENDING == "True" ] ; then
+                echo "Some pods are in pending state:"
+                kubectl get pods $component_filter --field-selector=status.phase=Pending -n ${namespace} -o wide
+            fi
+            [ $READY == "False" ] && echo "Some pods are not ready"
+            [ $JOBR == "False" ] && echo "Some jobs have not succeeded"
+            exit -1
+        fi
+    done
+}
+
+function wait_for_os_component {
+    local component=$1
+    echo "Waiting for: $component"
+    wait_for_pods openstack "-l application=$component"
+    echo "All resources for component $component Ready"
+}
 
 function install_release_controllers {
 
@@ -148,7 +227,6 @@
             kubectl apply -f ${release_object}
         }
         retry 3 "Can't apply ${release_object}" apply_retry
-#        sleep 5
     done
 }
 
@@ -160,7 +238,9 @@
     info "Preparing DNS and SSL configuration."
 
     kubectl apply -f ${RELEASE_OPENSTACK_K8S}/release/ci/30-coredns.yaml
-    sleep 300
+
+    wait_for_pods coredns "" 300
+
     EXTERNAL_DNS_IP=$(kubectl -n coredns get services coredns-coredns -o jsonpath='{.status.loadBalancer.ingress[].ip}')
     if [ -z ${EXTERNAL_DNS_IP} ]; then
         EXTERNAL_DNS_IP=$(kubectl -n coredns get services coredns-coredns -o jsonpath='{.spec.clusterIP}')
@@ -227,7 +307,13 @@
     yq w -i ${RELEASE_OPENSTACK_K8S}/examples/osdpl/${OPENSTACK_CONTEXT_NAME}.yaml "spec.services.compute.nova.values.conf.nova.libvirt.virt_type" "qemu"
 
     kubectl apply -f ${RELEASE_OPENSTACK_K8S}/examples/osdpl/${OPENSTACK_CONTEXT_NAME}.yaml
-    sleep 1800
+
+    wait_for_pods openstack "-l app.kubernetes.io/name=cache" 1200
+
+    for component in mariadb rabbitmq memcached keystone glance cinder nova neutron barbican octavia cinder designate heat libvirt openvswitch; do
+        wait_for_os_component $component
+    done
+    wait_for_pods openstack
 
     kubectl -n openstack create job --from=cronjob/nova-cell-setup  nova-cell-setup-pd01-$(cat /dev/urandom | tr -dc '[a-z]' | head -c3)
     info "Openstack was deployed successfully..."
@@ -256,10 +342,58 @@
 }
 
 function deploy_finished {
-    touch ${DEPLOY_FINISHED_LOCK}
+    touch ${_DEPLOY_FINISHED_LOCK}
 }
 
+function write_trymos_info {
+    local distro_info
+    local os_controller_version
+    local ceph_controller_version
+    local os_version
+    local keystone_client_pod
+    local os_admin_username
+    local os_admin_password
 
+    distro_info=$(lsb_release -sd)
+    os_controller_version=$(kubectl -n osh-system get helmbundles openstack-operator -o jsonpath='{.status.releaseStatuses.openstack-operator.version}')
+    ceph_controller_version=$(kubectl -n osh-system get helmbundles ceph-operator -o jsonpath='{.status.releaseStatuses.ceph-operator.version}')
+    os_version=$(kubectl -n openstack get osdpl osh-dev -o jsonpath='{.spec.openstack_version}')
+    keystone_client_pod=$(kubectl -n openstack get pods -l application=keystone,component=client -o jsonpath='{.items[*].metadata.name}')
+    os_admin_username=$(kubectl -n openstack exec -it $keystone_client_pod -- bash -c "echo \$OS_USERNAME")
+    os_admin_password=$(kubectl -n openstack exec -it $keystone_client_pod -- bash -c "echo \$OS_PASSWORD")
+
+    cat << EOF > ${_TRYMOS_INFO_FILE}
+####################################################
+#################### TryMOS ########################
+####################################################
+
+############### Components Vresions ################
+
+OS:                       ${distro_info}
+OpenStack Controller:     ${os_controller_version}
+Ceph Controller:          ${ceph_controller_version}
+OpenStack Version:        ${os_version}
+
+############# UCP access information ###############
+UCP Admin Username:       ${UCP_USERNAME}
+UCP Admin Password:       ${UCP_PASSWORD}
+
+########### OpenStack access information ###########
+OpenStack Admin Username: ${os_admin_username}
+OpenStack Admin Password: ${os_admin_password}
+
+####################################################
+EOF
+
+    cat <<EOF > /etc/update-motd.d/99-trymos-info
+#!/bin/sh
+cat ${_TRYMOS_INFO_FILE}
+EOF
+
+    chmod +x /etc/update-motd.d/99-trymos-info
+
+    cat ${_TRYMOS_INFO_FILE}
+}
 
 case "$NODE_TYPE" in
     # Please keep the "prepare_metadata_files", "disable-rp-filter", "network_config" and "prepare_network" functions
@@ -284,6 +418,7 @@
         install_kubectl
         wait_for_node
         set_node_labels
+        generate_ceph_metadata
         collect_ceph_metadata
         configure_contrack
         disable_iptables_for_bridges
@@ -295,6 +430,7 @@
         install_ceph
         install_openstack
         configure_public_resolve
+        write_trymos_info
         deploy_finished
         ;;
     *)
diff --git a/trymos/image_build/template.json b/trymos/image_build/template.json
index 9af97a3..d889b97 100644
--- a/trymos/image_build/template.json
+++ b/trymos/image_build/template.json
@@ -10,15 +10,6 @@
   },
   "provisioners": [
     {
-      "type": "shell",
-      "inline": ["mkdir -p /usr/share/trymos/"]
-    },
-    {
-      "type": "file",
-      "source": "../../de/heat-templates/scripts/instance_boot.sh",
-      "destination": "/usr/share/trymos/functions"
-    },
-    {
       "type": "file",
       "source": "./certs",
       "destination": "/srv/"
@@ -30,13 +21,13 @@
     },
     {
       "type": "file",
-      "source": "files/srv/",
-      "destination": "/srv"
+      "source": "files/usr/share",
+      "destination": "/usr"
     },
     {
       "type": "file",
-      "source": "files/usr/share",
-      "destination": "/usr"
+      "source": "../../de/heat-templates/scripts/instance_boot.sh",
+      "destination": "/usr/share/trymos/functions"
     },
     {
       "type": "file",