swarm-gitops/variable-handler.sh
Peter Surda 10b5cbec99
All checks were successful
buildbot/travis_bionic Build done.
buildbot/multibuild_parent Build done.
Initial commit
2025-02-06 19:56:37 +08:00

134 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
PROJECT_NAME=${1:?Project name missing}
shift
SERVICE_NAME=${1:?Service name missing}
shift
FILE_NAME=${1:?File name missing}
shift
VARIABLE_TYPE=${1:?Variable type missing (config or secret)}
shift
ITERATOR_TYPE=${1:?Iterator missing (version or hash)}
shift
case "$VARIABLE_TYPE" in
"config"|"secret")
;;
*)
echo "Invalid variable type"
exit 1
esac
LOCAL_FNAME=${PROJECT_NAME}/files/${SERVICE_NAME}/${FILE_NAME}
function get_variable {
# find latest
if [ "$ITERATOR_TYPE" = "version" ]; then
RETVAL=$(docker $VARIABLE_TYPE ls \
--filter label=org.sysdeploy.project=${PROJECT_NAME} \
--filter label=org.sysdeploy.service=${SERVICE_NAME} \
--filter label=org.sysdeploy.file=${FILE_NAME} \
--format '{{.Label "org.sysdeploy.version"}} {{.Name}}' \
| sort -rn | head -1)
ITERATOR=$(echo "$RETVAL" | cut -d\ -f1)
OBJECT_NAME=$(echo "$RETVAL" | cut -d\ -f2-)
elif [ "$ITERATOR_TYPE" = "hash" ]; then
if [ ! -f "$LOCAL_FNAME" ]; then
echo "Can't find $LOCAL_FNAME"
exit 1
fi
NEW_HASH=$(git log -n 1 --format='format:%H' -- "$LOCAL_FNAME")
ITERATOR="$NEW_HASH"
OBJECT_NAME=$(docker $VARIABLE_TYPE ls \
--filter label=org.sysdeploy.project=${PROJECT_NAME} \
--filter label=org.sysdeploy.service=${SERVICE_NAME} \
--filter label=org.sysdeploy.file=${FILE_NAME} \
--filter label=org.sysdeploy.hash=${ITERATOR} \
--format '{{.Name}}' \
| head -1)
fi
}
function get_content {
local OBJECT_NAME="$1"
shift
docker config inspect "$OBJECT_NAME" |jq -r \
'.[0].Spec.Data'|base64 --decode
}
function set_variable {
NEW_NAME=$(uuidgen)
if [ "$ITERATOR_TYPE" = "version" ]; then
((ITERATOR++))
docker $VARIABLE_TYPE create \
--label=org.sysdeploy.project=${PROJECT_NAME} \
--label=org.sysdeploy.service=${SERVICE_NAME} \
--label=org.sysdeploy.file=${FILE_NAME} \
--label=org.sysdeploy.version=${ITERATOR} \
"$NEW_NAME" "$LOCAL_FNAME"
elif [ "$ITERATOR_TYPE" = "hash" ]; then
docker $VARIABLE_TYPE create \
--label=org.sysdeploy.project=${PROJECT_NAME} \
--label=org.sysdeploy.service=${SERVICE_NAME} \
--label=org.sysdeploy.file=${FILE_NAME} \
--label=org.sysdeploy.hash=${ITERATOR} \
"$NEW_NAME" "$LOCAL_FNAME"
fi
}
get_variable
if [ -n "$OBJECT_NAME" ]; then
echo "Name: $OBJECT_NAME"
echo "Version/hash: $ITERATOR"
else
echo "Can't find any such $VARIABLE_TYPE"
fi
# set
if [ -n "$1" ]; then
set_variable
echo "New name: $NEW_NAME, $ITERATOR_TYPE: $ITERATOR"
fi
# docker config ls \
# --filter label=org.sysdeploy.file=/etc/collectd/collectd.conf.d/thresholds.conf \
# --format '{{.Label "org.sysdeploy.version"}} {{.ID}}'|sort -rn
# Create or rotate
#
# get current
# optional compare
# create a new one
# update references if needed
#
# create a config:
# docker config create \
# --label org.sysdeploy.project=monitoring \
# --label org.sysdeploy.file=/etc/collectd/collectd.conf.d/thresholds.conf \
# --label org.sysdeploy.service=collectd \
# --label org.sysdeploy.version=11 \
# $(uuidgen) thresholds.conf
#
# retrieving config label:
# docker config inspect \
# -f '{{index .Spec.Labels "org.sysdeploy.file"}}' \
# 6fe6qfmjjg606h138nxkbzjyw
#
# finding configs by label matching and reverse order by version
# docker config ls \
# --filter label=org.sysdeploy.file=/etc/collectd/collectd.conf.d/thresholds.conf \
# --format '{{.Label "org.sysdeploy.version"}} {{.ID}}'|sort -rn
#
# labels:
# org.sysdeploy.file = filename inside the container
# org.sysdeploy.version = if versioning incrementally, version is stored
# here
# org.sysdeploy.commit = if versioning by commit, commit is stored here
# org.sysdeploy.service = compose/stack service, not sure this is needed
# org.sysdeploy.project = $COMPOSE_PROJECT_NAME
#
# find the last commit a file was changed:
# git log -n 1 --format='format:%H' -- monitoring/docker-compose.yml