treasuremap/tools/airship

281 lines
7.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright 2019 AT&T Intellectual Property. All other rights reserved.
#
# 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.
DEFAULT_TERM_OPTS=' '
# Set an interactive mode only if there is a TTY available.
test -t 1 && test -t 0 && DEFAULT_TERM_OPTS='-it'
: ${TERM_OPTS:=${DEFAULT_TERM_OPTS}}
# Python YAML module required to read versions.yaml
if grep -iq suse /etc/os-release; then
sudo rpm -q python3-pyaml --quiet || sudo zypper --non-interactive install python3-pyaml
else
sudo dpkg -s python3-yaml &> /dev/null || sudo apt -y install python3-yaml
fi
TMP_DIR=$(mktemp -d)
trap "{ rm -rf $TMP_DIR; }" EXIT
ENV_FILE=${TMP_DIR}/ENV
export OS_PASSWORD=${OS_PASSWORD:-password123}
# If shipyard password is defined, provide it to shipyard component
if [ "$1" = "shipyard" ] && [ -n "$OS_SHIPYARD_PASSWORD" ]; then
export OS_PASSWORD=${OS_SHIPYARD_PASSWORD}
fi
# prepare docker environment file
cat > $ENV_FILE << EOF
PEGLEG_PASSPHRASE=${PEGLEG_PASSPHRASE:-password12345678901234567890}
PEGLEG_SALT=${PEGLEG_SALT:-password12345678901234567890}
OS_AUTH_URL=${OS_AUTH_URL:-http://keystone.ucp.svc.cluster.local:80/v3}
OS_PASSWORD=${OS_PASSWORD}
OS_PROJECT_DOMAIN_NAME=${OS_PROJECT_DOMAIN_NAME:-default}
OS_PROJECT_NAME=${OS_PROJECT_NAME:-service}
OS_USERNAME=${OS_USERNAME:-shipyard}
OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME:-default}
OS_IDENTITY_API_VERSION=${OS_IDENTITY_API_VERSION:-3}
EOF
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../ >/dev/null 2>&1 && pwd )"
USER=$(id -u)
GROUP=$(id -g)
# Key/value lookups from manifests
manifests_lookup(){
local file="$1"
local schema="$2"
local mdata_name="$3"
local key_path="$4"
local oper="$5"
local allow_fail="$6"
FAIL=false
RESULT=$(python3 -c "
import yaml,sys
from packaging import version
if version.Version(yaml.__version__) < version.Version('5.1'):
y = yaml.load_all(open('$file'))
else:
y = yaml.load_all(open('$file'), Loader=yaml.FullLoader)
for x in y:
if x.get('schema') == '$schema':
if x['metadata']['name'] == '$mdata_name':
if isinstance(x$key_path,list):
if '$oper' == 'get_size':
print(len(x$key_path))
break
else:
for i in x$key_path:
print(i)
break
else:
if '$oper' == 'dict_keys':
print(' '.join(x$key_path.keys()))
break
else:
print(x$key_path)
break
else:
sys.exit(1)" 2>&1) || FAIL=true
if [[ $FAIL = true ]] && [[ $allow_fail != true ]]; then
echo "error: Lookup failed for schema '$schema', \
metadata.name '$mdata_name', key path '$key_path'" >&2
exit 1
fi
}
versions_lookup() {
manifests_lookup "${REPO_DIR}/global/software/config/versions.yaml" \
'pegleg/SoftwareVersions/v1' \
'software-versions' "$1"
IMAGE_URL=$RESULT
}
help() {
echo -n "Usage: airship <pegleg|promenade|shipyard> [OPTION]...
Examples:
tools/airship pegleg site -r /target collect airsloop -s collect
tools/airship promenade generate-certs -o /target/certs /target/collect/*.yaml
tools/airship promenade build-all -o /target/bundle /target/collect/*.yaml /target/certs/*.yaml
tools/airship shipyard get actions
tools/airship armada apply actions
"
}
pegleg() {
versions_lookup "['data']['images']['ucp']['pegleg']['pegleg']"
cat >> $ENV_FILE << EOF
USER=pegleg
EOF
docker run --rm --net=host $TERM_OPTS \
-u "${USER}:${GROUP}" \
-w /target \
-v $(pwd):/target \
-v ${HOME}/.ssh:/target/.ssh \
--env-file $ENV_FILE \
$IMAGE_URL $@
}
promenade() {
versions_lookup "['data']['images']['ucp']['promenade']['promenade']"
IMAGE_PROMENADE=$IMAGE_URL
versions_lookup "['data']['images']['kubernetes']['hyperkube']"
IMAGE_HYPERKUBE=$IMAGE_URL
# 'cache' is hardcoded in Promenade source code
# it's a shared directory between init and main containers in Promenade pod
# the purpose for it is to transfer Hyperkube binary and store file cache
PROMENADE_TMP_LOCAL="cache"
PROMENADE_TMP=${TMP_DIR}/promenade
mkdir $PROMENADE_TMP
# support proxy for pulling k8s binary
cat >> $ENV_FILE << EOF
http_proxy=${http_proxy:-}
https_proxy=${https_proxy:-}
no_proxy=${no_proxy:-}
HTTP_PROXY=${HTTP_PROXY:-}
HTTPS_PROXY=${HTTPS_PROXY:-}
NO_PROXY=${NO_PROXY:-}
# Promenade specific variables for downloading hyperkube image to generate genesis.sh
PROMENADE_TMP=${PROMENADE_TMP:-}
PROMENADE_TMP_LOCAL=${PROMENADE_TMP_LOCAL:-}
EOF
# extract Hyperkube binary before running Promenade container
# this is replacing internal extraction step in Promenade
# no need to share Docker socket
docker run --rm $TERM_OPTS \
-v "${PROMENADE_TMP}:/tmp/${PROMENADE_TMP_LOCAL}" \
--env-file $ENV_FILE \
--entrypoint /bin/cp \
"${IMAGE_HYPERKUBE}" \
/hyperkube "/tmp/${PROMENADE_TMP_LOCAL}"
docker run --rm --net=host $TERM_OPTS \
-u "${USER}:${GROUP}" \
-w /target \
-v $(pwd):/target \
-v "${PROMENADE_TMP}:/tmp/${PROMENADE_TMP_LOCAL}" \
--env-file $ENV_FILE \
$IMAGE_PROMENADE $@
}
shipyard() {
versions_lookup "['data']['images']['ucp']['shipyard']['shipyard']"
IMAGE_SHIPYARD=$IMAGE_URL
docker run --rm --net=host $TERM_OPTS \
-u "${USER}:${GROUP}" \
-w /target \
-v $(pwd):/target \
--env-file $ENV_FILE \
$IMAGE_SHIPYARD $@
}
armada() {
versions_lookup "['data']['images']['ucp']['armada']['api']"
IMAGE_ARMADA=$IMAGE_URL
docker run --rm --net host $TERM_OPTS \
-u "${USER}:${GROUP}" \
-v ${HOME}/.kube/config:/armada/.kube/config \
-v "$(pwd)"/airskiff.yaml:/airskiff.yaml \
--env-file $ENV_FILE \
$IMAGE_ARMADA $@
}
armada-operator() {
# create CRDs
kubectl apply -f ../armada-operator/config/crd/bases/
versions_lookup "['data']['images']['ucp']['armada-operator']['operator']"
IMAGE_ARMADA_OPERATOR=$IMAGE_URL
docker run -d --net host $TERM_OPTS \
-u "${USER}:${GROUP}" \
-v ${HOME}/.kube/config:/armada/.kube/config \
-e KUBECONFIG=/armada/.kube/config \
--env-file $ENV_FILE \
--name armada-operator \
$IMAGE_ARMADA_OPERATOR /manager
# Wait for the container to start running
while true; do
if [[ "$(docker inspect -f '{{.State.Running}}' "armada-operator" )" == "true" ]]; then
break
fi
sleep 10
done
versions_lookup "['data']['images']['ucp']['armada-operator']['go']"
IMAGE_ARMADA_GO=$IMAGE_URL
docker run --rm --net host $TERM_OPTS \
-u "${USER}:${GROUP}" \
-v ${HOME}/.kube/config:/armada/.kube/config \
-e KUBECONFIG=/armada/.kube/config \
-v "$(pwd)"/airskiff.yaml:/airskiff.yaml \
--env-file $ENV_FILE \
$IMAGE_ARMADA_GO $@
docker logs armada-operator
docker rm --force armada-operator || true
}
case "$1" in
'pegleg')
pegleg $@
;;
'promenade')
promenade $@
;;
'shipyard')
shift;
shipyard $@
;;
'armada')
shift;
armada $@
;;
'armada-operator')
shift;
armada-operator $@
;;
*) help
exit 1
;;
esac