From abf2b548af9deb592d79ee1e6268719baa38a562 Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Sat, 26 Sep 2020 08:33:51 +0200 Subject: [PATCH] new: [cyclos] new charm Signed-off-by: Valentin Lab --- cyclos/hooks/init | 47 +++++++++++++++++++ .../hooks/postgres_database-relation-joined | 19 ++++++++ cyclos/lib/common | 14 ++++++ cyclos/metadata.yml | 41 ++++++++++++++++ postgres/lib/common | 14 +++++- 5 files changed, 134 insertions(+), 1 deletion(-) create mode 100755 cyclos/hooks/init create mode 100755 cyclos/hooks/postgres_database-relation-joined create mode 100644 cyclos/lib/common create mode 100644 cyclos/metadata.yml diff --git a/cyclos/hooks/init b/cyclos/hooks/init new file mode 100755 index 00000000..2947a5ee --- /dev/null +++ b/cyclos/hooks/init @@ -0,0 +1,47 @@ +#!/bin/bash + +## Init is run on host +## For now it is run every time the script is launched, but +## it should be launched only once after build. + +## Accessible variables are: +## - SERVICE_NAME Name of current service +## - DOCKER_BASE_IMAGE Base image from which this service might be built if any +## - SERVICE_DATASTORE Location on host of the DATASTORE of this service +## - SERVICE_CONFIGSTORE Location on host of the CONFIGSTORE of this service + + +# Please note that postgres detect on its own if its datadir needs to be populated + + +. lib/common + + +if ! [ -f "$HOST_CYCLOS_CONFIG" ]; then + ## create cyclos.properties + cyclos:build || exit 1 +fi + +if ! [ -f "$HOST_CYCLOS_CONFIG" ]; then + err "No file '$HOST_CYCLOS_CONFIG'." + return 1 +fi + +PROPS=( + cyclos.header.remoteAddress X-Forwarded-For + cyclos.header.protocol X-Forwarded-Proto +) + +while read-0 label value; do + sed -ri "s/^($label\s+=)\s*.*/\1 $value/g" "$HOST_CYCLOS_CONFIG" >&2 +done < <(array_values_to_stdin PROPS) + + +init-config-add " +$SERVICE_NAME: + environment: + JAVA_OPTS: | + -Dcyclos.cors.origin=* + -Dcyclos.header.remoteAddress=X-Forwarded-For + -Dcyclos.header.protocol=X-Forwarded-Proto +" diff --git a/cyclos/hooks/postgres_database-relation-joined b/cyclos/hooks/postgres_database-relation-joined new file mode 100755 index 00000000..f5441704 --- /dev/null +++ b/cyclos/hooks/postgres_database-relation-joined @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e + +PASSWORD="$(relation-get password)" +USER="$(relation-get user)" +DBNAME="$(relation-get dbname)" + +config-add "\ +services: + $MASTER_BASE_SERVICE_NAME: + environment: + DB_HOST: \"$MASTER_TARGET_SERVICE_NAME\" + DB_NAME: \"$DBNAME\" + DB_USER: \"$USER\" + DB_PASSWORD: \"$PASSWORD\" +" + +info "Configured $SERVICE_NAME code for $TARGET_SERVICE_NAME access." diff --git a/cyclos/lib/common b/cyclos/lib/common new file mode 100644 index 00000000..c127b1da --- /dev/null +++ b/cyclos/lib/common @@ -0,0 +1,14 @@ +# -*- mode: bash -*- + + +CYCLOS_CONFIG="/usr/local/cyclos/WEB-INF/classes/cyclos.properties" +HOST_CYCLOS_CONFIG="$SERVICE_CONFIGSTORE$CYCLOS_CONFIG" + +cyclos:build() { + docker pull "$DOCKER_BASE_IMAGE" || return 1 + mkdir -p "$(dirname "$HOST_CYCLOS_CONFIG")" + container_id=$(docker run -d --entrypoint true "$DOCKER_BASE_IMAGE") || return 1 + mkdir -p "$(dirname "$HOST_CYCLOS_CODE")" && + docker cp "$container_id":"$CYCLOS_CONFIG" "$HOST_CYCLOS_CONFIG" && + docker rm "$container_id" +} diff --git a/cyclos/metadata.yml b/cyclos/metadata.yml new file mode 100644 index 00000000..499fde46 --- /dev/null +++ b/cyclos/metadata.yml @@ -0,0 +1,41 @@ +## Based on cyclos/cyclos:4.13.2 +docker-image: docker.0k.io/cyclos:4.13.2 +config-resources: + - /usr/local/cyclos/WEB-INF/classes/cyclos.properties +data-resources: + - /var/log/cyclos + +default-options: + +uses: + postgres-database: + #constraint: required | recommended | optional + #auto: pair | summon | none ## default: pair + constraint: required + auto: summon + solves: + database: "main storage" + default-options: + extensions: + - cube + - earthdistance + - postgis + - unaccent + log-rotate: + #constraint: required | recommended | optional + #auto: pair | summon | none ## default: pair + constraint: recommended + auto: pair + solves: + unmanaged-logs: "in docker logs" + #default-options: + web-proxy: + #constraint: required | recommended | optional + #auto: pair | summon | none ## default: pair + constraint: recommended + auto: pair + solves: + proxy: "Public access" + default-options: + target: !var-expand ${MASTER_BASE_SERVICE_NAME}:8080 + diff --git a/postgres/lib/common b/postgres/lib/common index 75716f74..a6feb29e 100644 --- a/postgres/lib/common +++ b/postgres/lib/common @@ -73,7 +73,19 @@ db_install_extensions() { while [ "$#" != 0 ]; do case "$1" in postgis) - ddb -d "$dbname" < <(echo "CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology;") || return 1 + if out=$(ddb -d "$dbname" < <(echo "SELECT extname + FROM pg_extension + WHERE extname = 'postgis';")); then + if [ "$out" ]; then + info "PostGIS already installed." + shift + continue + fi + fi + + ddb -d "$dbname" < <(echo "CREATE EXTENSION IF NOT EXISTS postgis; + CREATE EXTENSION IF NOT EXISTS postgis_topology;") || return 1 + dcmd /bin/bash -c "psql -d '$dbname' -v ON_ERROR_STOP=1 -f /usr/local/share/postgresql/contrib/postgis-*/legacy.sql" || return 1 info "Installed postgis extensions on database '$dbname'." ;;