blob: 9089e4ed36a9e5501888fda41b9ad53567114ec3 [file] [log] [blame]
#!/bin/bash
# ---------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
# ---------------------------------------------------------------------------
####
#
# Execute a preflight test for checking the operator is at the correct version
#
####
set -e
NAMESPACE="preflight"
delns() {
echo "Deleting namespace ${1}"
set +e
kubectl delete ns ${1} &> /dev/null
set -e
}
waitForOperator() {
#
# Wait for the operator to be running
#
local timeout=360
local i=1
local command="kubectl get pods -n ${NAMESPACE} 2> /dev/null | grep camel-k | grep Running &> /dev/null"
until eval "${command}"
do
((i++))
if [ "${i}" -gt "${timeout}" ]; then
echo "kamel operator not successfully installed, aborting due to ${timeout}s timeout"
resources="pods csvs deployments subs"
for resource in ${resources}
do
echo "Dumping resourse: ${resource}"
kubectl get ${resource} -n "${NAMESPACE}" -o yaml
done
delns "${NAMESPACE}"
exit 1
fi
sleep 1
done
}
while getopts ":b:c:i:l:n:s:v:" opt; do
case "${opt}" in
b)
BUILD_CATALOG_SOURCE_NAME=${OPTARG}
;;
c)
BUILD_CATALOG_SOURCE_NAMESPACE=${OPTARG}
;;
i)
IMAGE_NAMESPACE=${OPTARG}
;;
l)
REGISTRY_PULL_HOST=${OPTARG}
;;
n)
IMAGE_NAME=${OPTARG}
;;
s)
REGISTRY_INSECURE=${OPTARG}
;;
v)
IMAGE_VERSION=${OPTARG}
;;
:)
echo "ERROR: Option -$OPTARG requires an argument"
exit 1
;;
\?)
echo "ERROR: Invalid option -$OPTARG"
exit 1
;;
esac
done
shift $((OPTIND-1))
if [ -z "${IMAGE_NAME}" ]; then
echo "Error: local-image-name not defined"
exit 1
fi
if [ -z "${IMAGE_VERSION}" ]; then
echo "Error: local-image-version not defined"
exit 1
fi
if [ -z "${IMAGE_NAMESPACE}" ]; then
echo "Error: image-namespace not defined"
exit 1
fi
if [ -z "${REGISTRY_PULL_HOST}" ]; then
echo "Error: image-registry-pull-host not defined"
exit 1
fi
if [ -z "${REGISTRY_INSECURE}" ]; then
echo "Error: image-registry-insecure not defined"
exit 1
fi
#
# Create the preflight test namespace
#
set +e
if kubectl get ns ${NAMESPACE} &> /dev/null
then
kubectl delete ns ${NAMESPACE}
fi
set -e
kubectl create namespace ${NAMESPACE}
if [ $? != 0 ]; then
echo "Error: failed to create the ${NAMESPACE} namespace"
exit 1
fi
# Cluster environment
export CUSTOM_IMAGE=${IMAGE_NAME}
export CUSTOM_VERSION=${IMAGE_VERSION}
#
# If bundle has been built and installed then use it
#
has_olm="false"
if [ -n "${BUILD_CATALOG_SOURCE_NAMESPACE}" ]; then
#
# Check catalog source is actually available
#
timeout=10
catalog_ready=0
until [ ${catalog_ready} -eq 1 ] || [ ${timeout} -eq 0 ]
do
echo "Info: Awaiting catalog source to become ready"
STATE=$(kubectl get catalogsource ${BUILD_CATALOG_SOURCE_NAME} \
-n ${BUILD_CATALOG_SOURCE_NAMESPACE} \
-o=jsonpath='{.status.connectionState.lastObservedState}')
if [ "${STATE}" == "READY" ]; then
let catalog_ready=1
echo "Info: Catalog source is ready"
continue
else
echo "Warning: catalog source status is not ready."
if [ "${timeout}" -eq 1 ]; then
kubectl get catalogsource ${BUILD_CATALOG_SOURCE_NAME} \
-n ${BUILD_CATALOG_SOURCE_NAMESPACE} -o yaml
echo "Error: timed out while awaiting catalog source to start"
delns "${NAMESPACE}"
exit 1
fi
fi
sleep 1m
let timeout=${timeout}-1
done
if [ -z "${NEW_XY_CHANNEL}" ]; then
echo "Error: OLM Channel cannot be determined"
delns "${NAMESPACE}"
exit 1
fi
export KAMEL_INSTALL_OLM_SOURCE=${BUILD_CATALOG_SOURCE_NAME}
export KAMEL_INSTALL_OLM_SOURCE_NAMESPACE=${BUILD_CATALOG_SOURCE_NAMESPACE}
export KAMEL_INSTALL_OLM_CHANNEL="${NEW_XY_CHANNEL}"
has_olm="true"
fi
export KAMEL_INSTALL_MAVEN_REPOSITORIES=$(make get-staging-repo)
export KAMEL_INSTALL_REGISTRY=${REGISTRY_PULL_HOST}
export KAMEL_INSTALL_REGISTRY_INSECURE=${REGISTRY_INSECURE}
export KAMEL_INSTALL_OPERATOR_IMAGE=${CUSTOM_IMAGE}:${CUSTOM_VERSION}
# Will only have an effect if olm=false
# since, for OLM, the csv determines the policy.
# (see kamel-build-bundle/build-bundle-image.sh)
export KAMEL_INSTALL_OPERATOR_IMAGE_PULL_POLICY="Always"
#
# Install the operator to local namespace
#
kamel install -n ${NAMESPACE} --olm=${has_olm} --operator-id=camel-k-preflight
if [ $? != 0 ]; then
echo "Error: kamel install returned an error."
delns "${NAMESPACE}"
exit 1
fi
sleep 3
echo "Waiting for operator to start ..."
waitForOperator
sleep 5
#
# Confirm the operator has not restarted
#
echo "Checking operator has not restarted ..."
waitForOperator
echo "Finding the operator pod identifier"
for i in {1..5}
do
camel_operator=$(kubectl get pods -n ${NAMESPACE} | grep camel-k | grep Running | awk '{print $1}')
if [ -n "${camel_operator}" ]; then
break
fi
echo "Preflight Test: camel operator no longer running ... waiting on restart"
waitForOperator
done
echo "Camel K operator ${camel_operator} up and running"
camel_op_version=$(kubectl logs ${camel_operator} -n ${NAMESPACE} | sed -n 's/.*"Camel K Operator Version: \(.*\)"}/\1/p')
camel_op_commit=$(kubectl logs ${camel_operator} -n ${NAMESPACE} | sed -n 's/.*"Camel K Git Commit: \(.*\)"}/\1/p')
src_commit=$(git rev-parse HEAD)
if [ -z "${camel_operator}" ]; then
echo "Preflight Test: Failure - No camel operator can be located in ${NAMESPACE}"
delns "${NAMESPACE}"
exit 1
fi
if [ -z "${camel_op_version}" ]; then
echo "Preflight Test: Failure - No camel operator version can be located for ${NAMESPACE} / ${camel_operator}"
delns "${NAMESPACE}"
exit 1
fi
if [ -z "${camel_op_commit}" ]; then
echo "Preflight Test: Failure - No camel operator commit can be located for ${NAMESPACE} / ${camel_operator}"
delns "${NAMESPACE}"
exit 1
fi
#
# Test whether the versions are the same
#
if [ "${camel_op_version}" != "${IMAGE_VERSION}" ]; then
echo "Preflight Test: Failure - Installed operator version ${camel_op_version} does not match expected version (${IMAGE_VERSION})"
delns "${NAMESPACE}"
exit 1
fi
#
# Test whether the commit ids are the same
#
if [ "${camel_op_commit}" != "${src_commit}" ]; then
echo "Preflight Test: Failure - Installed operator commit id (${camel_op_commit}) does not match expected commit id (${src_commit})"
delns "${NAMESPACE}"
exit 1
fi
#
# Tidy-up and remove the operator from preflight
#
kamel uninstall -n ${NAMESPACE}
if [ $? != 0 ]; then
echo "Error: kamel uninstall failed while removing preflight install"
delns "${NAMESPACE}"
exit 1
fi
sleep 3
echo "Preflight Test: Success"
delns "${NAMESPACE}"