aboutsummaryrefslogtreecommitdiff
path: root/brep/handler/ci/ci-load.in
diff options
context:
space:
mode:
Diffstat (limited to 'brep/handler/ci/ci-load.in')
-rw-r--r--brep/handler/ci/ci-load.in95
1 files changed, 65 insertions, 30 deletions
diff --git a/brep/handler/ci/ci-load.in b/brep/handler/ci/ci-load.in
index f62bb76..3f04ea8 100644
--- a/brep/handler/ci/ci-load.in
+++ b/brep/handler/ci/ci-load.in
@@ -25,7 +25,10 @@ verbose= #true
fetch_timeout=60
trap "{ exit 1; }" ERR
-set -o errtrace # Trap ERR in functions.
+set -o errtrace # Trap ERR in functions.
+set -o pipefail # Fail if any pipeline command fails.
+shopt -s lastpipe # Execute last pipeline command in the current shell.
+shopt -s nullglob # Expand no-match globs to nothing rather than themselves.
@import brep/handler/handler@
@import brep/handler/ci/ci@
@@ -33,7 +36,7 @@ set -o errtrace # Trap ERR in functions.
# The handler's own options.
#
result_url=
-while [ $# -gt 0 ]; do
+while [[ "$#" -gt 0 ]]; do
case $1 in
--result-url)
shift
@@ -50,7 +53,7 @@ done
#
loader="$1"
-if [ -z "$loader" ]; then
+if [[ -z "$loader" ]]; then
error "$usage"
fi
@@ -60,7 +63,7 @@ shift
# options.
#
loader_options=()
-while [ $# -gt 1 ]; do
+while [[ "$#" -gt 1 ]]; do
loader_options+=("$1")
shift
done
@@ -69,11 +72,11 @@ done
#
data_dir="${1%/}"
-if [ -z "$data_dir" ]; then
+if [[ -z "$data_dir" ]]; then
error "$usage"
fi
-if [ ! -d "$data_dir" ]; then
+if [[ ! -d "$data_dir" ]]; then
error "'$data_dir' does not exist or is not a directory"
fi
@@ -84,8 +87,9 @@ reference="$(basename "$data_dir")"
#
manifest_parser_start "$data_dir/request.manifest"
-simulate=
repository=
+interactive=
+simulate=
# Package map. We first enter packages from the request manifest as keys and
# setting the values to true. Then we go through the repository package list
@@ -104,40 +108,58 @@ declare -A packages
#
spec=
+# Third party service information which, if specified, needs to be associated
+# with the being created tenant.
+#
+service_id=
+service_type=
+service_data=
+
while IFS=: read -ru "$manifest_parser_ofd" -d '' n v; do
case "$n" in
- simulate) simulate="$v" ;;
- repository) repository="$v" ;;
+ repository) repository="$v" ;;
+ interactive) interactive="$v" ;;
+ simulate) simulate="$v" ;;
package)
packages["$v"]=true
- if [ -n "$spec" ]; then
+ if [[ -n "$spec" ]]; then
spec="$spec,"
fi
spec="$spec$v"
;;
+
+ service-id) service_id="$v" ;;
+ service-type) service_type="$v" ;;
+ service-data) service_data="$v" ;;
esac
done
manifest_parser_finish
-if [ -n "$spec" ]; then
+if [[ -n "$spec" ]]; then
spec="$spec@"
fi
spec="$spec$repository"
-if [ -z "$repository" ]; then
+if [[ -z "$repository" ]]; then
error "repository manifest value expected"
fi
-if [ -n "$simulate" -a "$simulate" != "success" ]; then
+if [[ -n "$simulate" && "$simulate" != "success" ]]; then
exit_with_manifest 400 "unrecognized simulation outcome '$simulate'"
fi
+# Use the generated reference if the tenant service id is not specified.
+#
+if [[ -n "$service_type" && -z "$service_id" ]]; then
+ service_id="$reference"
+fi
+
message_suffix=
-if [ -n "$result_url" ]; then
+if [[ -n "$result_url" ]]; then
message_suffix=": $result_url/@$reference" # Append the tenant id.
fi
@@ -146,7 +168,7 @@ fi
# Note that we can't assume a real repository URL is specified if simulating
# so trying to query the repository info is not a good idea.
#
-if [ -n "$simulate" ]; then
+if [[ -n "$simulate" ]]; then
run rm -r "$data_dir"
trace "CI request for '$spec' is simulated$message_suffix"
@@ -188,9 +210,9 @@ manifest_values=()
manifest_version=
more=true
-while [ "$more" ]; do
+while [[ "$more" ]]; do
- if [ -n "$manifest_version" ]; then
+ if [[ -n "$manifest_version" ]]; then
manifest_names=("")
manifest_values=("$manifest_version")
fi
@@ -213,35 +235,32 @@ while [ "$more" ]; do
manifest_names+=("$n")
manifest_values+=("$v")
-
done
# Reduce the first manifest case.
#
- if [ ${#manifest_names[@]} -eq 0 ]; then
+ if [[ "${#manifest_names[@]}" -eq 0 ]]; then
continue
fi
# Add or filter out the manifest, if present.
#
- if [ ${#packages[@]} -ne 0 ]; then
-
- if [[ -v packages["$name"] ]]; then
+ if [[ "${#packages[@]}" -ne 0 ]]; then
+ if [[ -v "packages[$name]" ]]; then
packages["$name"]=
packages["$name/$version"]= # Clear it either, as may also be present.
- elif [[ -v packages["$name/$version"] ]]; then
+ elif [[ -v "packages[$name/$version]" ]]; then
packages["$name/$version"]=
else
continue # Skip.
fi
-
fi
packages_manifest_names+=("${manifest_names[@]}")
packages_manifest_values+=("${manifest_values[@]}")
- if [ -z "$display_name" ]; then
- if [ -n "$project" ]; then
+ if [[ -z "$display_name" ]]; then
+ if [[ -n "$project" ]]; then
display_name="$project"
else
display_name="$name"
@@ -255,7 +274,7 @@ manifest_parser_finish
# the repository.
#
for p in "${!packages[@]}"; do
- if [ "${packages[$p]}" ]; then
+ if [[ "${packages[$p]}" ]]; then
exit_with_manifest 422 "unknown package $p"
fi
done
@@ -263,7 +282,7 @@ done
# Verify that the repository is not empty. Failed that, the repository display
# name wouldn't be set.
#
-if [ -z "$display_name" ]; then
+if [[ -z "$display_name" ]]; then
exit_with_manifest 422 "no packages in repository"
fi
@@ -275,7 +294,7 @@ run mv "$cache_dir/packages.manifest" "$cache_dir/packages.manifest.orig"
#
manifest_serializer_start "$cache_dir/packages.manifest"
-for ((i=0; i <= ${#packages_manifest_names[@]}; ++i)); do
+for ((i=0; i != "${#packages_manifest_names[@]}"; ++i)); do
manifest_serialize "${packages_manifest_names[$i]}" \
"${packages_manifest_values[$i]}"
done
@@ -289,7 +308,7 @@ run echo "$repository $display_name cache:cache" >"$loadtab"
# Apply overrides, if uploaded.
#
-if [ -f "$data_dir/overrides.manifest" ]; then
+if [[ -f "$data_dir/overrides.manifest" ]]; then
loader_options+=(--overrides-file "$data_dir/overrides.manifest")
fi
@@ -298,6 +317,22 @@ fi
#
loader_options+=(--force --shallow --tenant "$reference")
+# Build the packages interactively, if requested.
+#
+if [[ -n "$interactive" ]]; then
+ loader_options+=(--interactive "$interactive")
+fi
+
+# Pass the tenant service information, if specified, to the loader.
+#
+if [[ -n "$service_id" ]]; then
+ loader_options+=(--service-id "$service_id" --service-type "$service_type")
+
+ if [[ -n "$service_data" ]]; then
+ loader_options+=(--service-data "$service_data")
+ fi
+fi
+
run "$loader" "${loader_options[@]}" "$loadtab"
# Remove the no longer needed CI request data directory.