Add yaml load and key delete to consul-loader-container 57/117557/3
authorJack Lucas <jflos@sonoris.net>
Fri, 5 Feb 2021 17:10:28 +0000 (12:10 -0500)
committerJack Lucas <jflos@sonoris.net>
Fri, 5 Feb 2021 17:17:08 +0000 (12:17 -0500)
Enhance Consul loader to:
   -- Convert YAML configuration files to JSON before storing the configuration into Consul
   -- Provide an option to delete a Consul key so that a component's configuration can be
      removed from Consul when the component is undeployed.
Use the ONAP integration team's Python image (integration-python:8.0.0) as base image.

Issue-ID: DCAEGEN2-2616
Issue-ID: DCAEGEN2-2488
Signed-off-by: Jack Lucas <jflos@sonoris.net>
Change-Id: Iaa45a03e805f64e12881f142de2fa206fb816175

consul-loader-container/Changelog.md [new file with mode: 0644]
consul-loader-container/Dockerfile
consul-loader-container/consul_store.sh
consul-loader-container/pom.xml
consul-loader-container/yaml2json.py [new file with mode: 0755]

diff --git a/consul-loader-container/Changelog.md b/consul-loader-container/Changelog.md
new file mode 100644 (file)
index 0000000..88d4818
--- /dev/null
@@ -0,0 +1,15 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## [1.1.0] - 2021-02-05:
+In support of deploying DCAE service components using Helm, the Consul loader
+has been enhanced to:
+   -- Convert YAML configuration files to JSON before storing the configuration into Consul
+   -- Provide an option to delete a Consul key so that a component's configuration can be
+      removed from Consul when the component is undeployed.
+
+This version also changes the base image for the container to the ONAP integration team's
+Python image (integration-python:8.0.0).
\ No newline at end of file
index 868b41f..741d5f3 100644 (file)
@@ -2,6 +2,7 @@
 # org.onap.dcae
 # ================================================================================
 # Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2021 J. F. Lucas.  All rights reserved.
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # limitations under the License.
 # ============LICENSE_END=========================================================
 #
-FROM ubuntu:16.04
-RUN apt-get update && apt-get install -y curl && mkdir -p /opt/app
-COPY *.sh /opt/app/
+FROM nexus3.onap.org:10001/onap/integration-python:8.0.0
+USER root
+RUN apk update \
+    && apk add bash \
+    && apk add curl \
+    && pip install --upgrade pip \
+    && pip install pyyaml
+COPY *.sh *.py /opt/app/
 WORKDIR /opt/app
 ENTRYPOINT ["/opt/app/consul_store.sh"]
+USER $user
\ No newline at end of file
index 4e64fc3..e60dbc4 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/bash
 # ================================================================================
 # Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2021 J. F. Lucas. All rights reserved.
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # Command line options
 # --service name|address|port :  Register a service with name 'name', address 'address', and port 'port'.
 # --key keyname|filepath:  Register a key-value pair with key 'keyname' and the contents of a file at 'filepath' as its value
+# --key-yaml keyname|filepath: Register a key-value pair with name 'keyname', converting the YAML content of the file at 'filepath'
+#   to JSON, and storing the JSON result as the value.  This is used for Helm deployment of DCAE microservices, where the initial
+#   application configuration is stored in a Helm values.yaml file in YAML form.  --key-yaml converts the YAML configuration into
+#   JSON, which is the format that microservices expect.
+# -- delete-key
 # A command can include multiple instances of each option.
 
 CONSUL_ADDR=${CONSUL_PROTO:-http}://${CONSUL_HOST:-consul}:${CONSUL_PORT:-8500}
@@ -48,6 +54,12 @@ function put_key {
   curl -v -X PUT --data-binary @$2 -H 'Content-Type: application/json' ${KV_URL}/$1
 }
 
+# Delete a key from the Consul KV store
+# $1: Key to be deleted
+function delete_key {
+  curl -v -X DELETE ${KV_URL}/$1
+}
+
 set -x
 
 # Check Consul readiness
@@ -86,6 +98,16 @@ do
     put_key ${kv[@]}
     shift 2;
     ;;
+  "--key-yaml")
+    # See above for explanation of (${2//|/ })
+    kv=(${2//|/ })
+    cat ${kv[1]} | /opt/app/yaml2json.py | put_key ${kv[0]} -
+    shift 2;
+    ;;
+  "--delete-key")
+    delete_key $2
+    shift 2;
+    ;;
   *)
     echo "ignoring $1"
     shift
index dd68443..f347ef9 100644 (file)
@@ -2,6 +2,7 @@
 <!--
 ================================================================================
 Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2021 J. F. Lucas.  All rights reserved.
 ================================================================================
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -27,7 +28,7 @@ limitations under the License.
   <groupId>org.onap.dcaegen2.deployments</groupId>
   <artifactId>consul-loader-container</artifactId>
   <name>dcaegen2-deployments-consul-loader-container</name>
-  <version>1.0.0</version>
+  <version>1.1.0</version>
   <url>http://maven.apache.org</url>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/consul-loader-container/yaml2json.py b/consul-loader-container/yaml2json.py
new file mode 100755 (executable)
index 0000000..d1ef2da
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+# ================================================================================
+# Copyright (c) 2021 J. F. Lucas. All 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.
+# ============LICENSE_END=========================================================
+#
+import yaml
+import json
+import sys
+
+def _yaml_to_json (y):
+    return json.dumps(yaml.safe_load(y), indent=2)
+
+def main():
+    try:
+        print (_yaml_to_json(sys.stdin.read()))
+    except Exception as e:
+        print(e, file=sys.stderr)
+        sys.exit(1)
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file