From 5031a4e20a281b7a94f8c3743b1572314c574ec4 Mon Sep 17 00:00:00 2001 From: Shashank Kumar Shankar Date: Tue, 27 Feb 2018 15:41:46 -0800 Subject: Add Docker building scripts and update swagger This patch adds scripts to build Docker container and updates swagger API doc. Change-Id: Ifb10d483946112e38d716c9ae07995ffeb14d2d3 Issue-ID: MUSIC-41 Signed-off-by: Shashank Kumar Shankar --- deployment/Dockerfile | 43 +++ deployment/docker-build.sh | 11 + deployment/docker-entrypoint.sh | 33 +++ deployment/run.sh | 6 + deployment/setup-dependency.sh | 30 ++ src/dkv/api/backendFilesystemConnection.go | 5 +- src/dkv/api/initialise.go | 8 + swagger.json | 122 -------- swagger.yaml | 442 +++++++++++++++++++++++++++++ 9 files changed, 576 insertions(+), 124 deletions(-) create mode 100644 deployment/Dockerfile create mode 100644 deployment/docker-build.sh create mode 100644 deployment/docker-entrypoint.sh create mode 100644 deployment/run.sh create mode 100644 deployment/setup-dependency.sh delete mode 100644 swagger.json create mode 100644 swagger.yaml diff --git a/deployment/Dockerfile b/deployment/Dockerfile new file mode 100644 index 0000000..7f6c6d5 --- /dev/null +++ b/deployment/Dockerfile @@ -0,0 +1,43 @@ +FROM ubuntu:14.04 + +ARG HTTP_PROXY=${HTTP_PROXY} +ARG HTTPS_PROXY=${HTTPS_PROXY} + +ENV http_proxy $HTTP_PROXY +ENV https_proxy $HTTPS_PROXY +ENV CONSUL_IP $CONSUL_IP +ENV CONSUL_VERSION 1.0.6 + +# Run Docker build from dkv directory. +WORKDIR /distributed-kv-store + +RUN apt-get update && \ + apt-get install -y build-essential && \ + apt-get install -y realpath && \ + apt-get install -y unzip && \ + apt-get install -y git && \ + apt-get install -y curl && \ + apt-get install -y wget && \ + git clone https://git.onap.org/music/distributed-kv-store + + +RUN wget -qO /tmp/consul.zip "https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip" && \ + unzip -d /bin /tmp/consul.zip && \ + chmod 755 /bin/consul && \ + rm /tmp/consul.zip + +EXPOSE 8200 +EXPOSE 8080 + +# Change this when deployment gets merged. +WORKDIR /distributed-kv-store/distributed-kv-store/deployment/ +ADD ./setup-dependency.sh /distributed-kv-store/distributed-kv-store/deployment/ +ADD ./docker-entrypoint.sh /distributed-kv-store/distributed-kv-store/deployment/ + +WORKDIR /distributed-kv-store/distributed-kv-store +RUN deployment/setup-dependency.sh + +VOLUME /configs + +ENTRYPOINT deployment/docker-entrypoint.sh +#ENTRYPOINT /bin/bash \ No newline at end of file diff --git a/deployment/docker-build.sh b/deployment/docker-build.sh new file mode 100644 index 0000000..767554f --- /dev/null +++ b/deployment/docker-build.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +if [ $HTTP_PROXY ]; then + BUILD_ARGS+=" --build-arg HTTP_PROXY=${HTTP_PROXY}" +fi +if [ $HTTPS_PROXY ]; then + BUILD_ARGS+=" --build-arg HTTPS_PROXY=${HTTPS_PROXY}" +fi + +echo "Start build docker image" +docker build ${BUILD_ARGS} -t dkv . diff --git a/deployment/docker-entrypoint.sh b/deployment/docker-entrypoint.sh new file mode 100644 index 0000000..9b29e3e --- /dev/null +++ b/deployment/docker-entrypoint.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +function verify_consul_run { + consul --version +} + +function start_consul_server { + # Running consul in server mode since we are doing a single node. If we need to add more, + # We need to run multiple consul agents in client mode without providing the -server arguements. + + # CHANGE THIS TO SERVER MODE! + # consul agent -dev > /dev/null 2>&1 & + consul agent -bootstrap -server -bind=127.0.0.1 -data-dir=/dkv/consul & +} + +function start_api_server { + # Uncomment the following after the mountpath is setup in the code base and the docker file. + # Until then, go run is used. + #cd target + #./dkv + cd src/dkv/ + go run main.go +} + +function set_paths { + export GOPATH=$PWD + source /etc/environment +} + +set_paths +start_consul_server +sleep 5 +start_api_server diff --git a/deployment/run.sh b/deployment/run.sh new file mode 100644 index 0000000..1aae1f6 --- /dev/null +++ b/deployment/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +CONSUL_IP="localhost" +MOUNTPATH="/configs" + +docker run -e CONSUL_IP=$CONSUL_IP -e MOUNTPATH=$MOUNTPATH -it --name dkv -p 8200:8200 -p 8080:8080 dkv diff --git a/deployment/setup-dependency.sh b/deployment/setup-dependency.sh new file mode 100644 index 0000000..fcb2d51 --- /dev/null +++ b/deployment/setup-dependency.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +function install_go { + local golang_version=go1.10.linux-amd64 + if [ ! -d /opt/go ]; then + mkdir /opt/go + pushd /opt/go + curl -O https://dl.google.com/go/$golang_version.tar.gz + tar -zxf $golang_version.tar.gz + echo GOROOT=$PWD/go >> /etc/environment + echo PATH=$PATH:$PWD/go/bin >> /etc/environment + rm -rf tar -zxf $golang_version.tar.gz + popd + fi + source /etc/environment +} + +function install_dependencies { + pushd src/dkv/ + make all + popd +} + +function create_mountpath { + cp -r mountpath/ /configs +} + +install_go +install_dependencies +create_mountpath diff --git a/src/dkv/api/backendFilesystemConnection.go b/src/dkv/api/backendFilesystemConnection.go index f09e74f..e6c37ab 100644 --- a/src/dkv/api/backendFilesystemConnection.go +++ b/src/dkv/api/backendFilesystemConnection.go @@ -44,10 +44,11 @@ type DirectoryStruct struct { } const ( - MOUNTPATH = "../../mountpath/" - JSONPATH = "api/token_service_map.json" + JSONPATH = "api/token_service_map.json" ) +var MOUNTPATH = "" + var Directory DirectoryOperationer func (d *DirectoryStruct) CreateService(body CreateRegisterServiceBody) (string, error) { diff --git a/src/dkv/api/initialise.go b/src/dkv/api/initialise.go index 824ca81..dfbcbde 100644 --- a/src/dkv/api/initialise.go +++ b/src/dkv/api/initialise.go @@ -16,6 +16,8 @@ package api +import "os" + func Initialise() error { Consul = &ConsulStruct{} KeyValues = &KeyValuesStruct{kvs: make(map[string]string)} @@ -31,5 +33,11 @@ func Initialise() error { return err } + if os.Getenv("MOUNTPATH") != "" { + MOUNTPATH = os.Getenv("MOUNTPATH") + } else { + MOUNTPATH = "../../mountpath/" + } + return nil } diff --git a/swagger.json b/swagger.json deleted file mode 100644 index 4430574..0000000 --- a/swagger.json +++ /dev/null @@ -1,122 +0,0 @@ -swagger: "2.0" -info: - description: "API reference for Distributed Key Value store." - version: "1.0.0" - title: "API reference for Distributed Key Value store" - contact: - email: "shashank.kumar.shankar@intel.com" - url: "https://wiki.onap.org/display/DW/Distributed+KV+Store" - license: - name: "Apache 2.0" - url: "http://www.apache.org/licenses/LICENSE-2.0.html" -basePath: "/v1" -schemes: -- "http" -paths: - /loadconfigs: - post: - tags: - - "load configuration" - summary: "Load Key Values by reading configs into Consul" - description: "" - consumes: - - "application/json" - produces: - - "application/json" - parameters: - - in: "body" - name: "body" - description: "Load configuration from file system to be added into Consul" - required: true - schema: - $ref: "#/definitions/LoadRequest" - responses: - 200: - description: "successful operation" - schema: - $ref: "#/definitions/LoadResponse" - /getconfigs: - get: - tags: - - "get all keys" - summary: "Get all keys present in Consul." - description: "Returns a list of keys present in Consul." - produces: - - "application/json" - responses: - 200: - description: "successful operation" - schema: - $ref: "#/definitions/Gets" - /getconfig/{key}: - get: - tags: - - "get single key" - summary: "Get value for specific key present in Consul." - description: "Returns a key and value present in Consul." - produces: - - "application/json" - parameters: - - name: "key" - in: "path" - description: "Key used to query" - required: true - type: "string" - responses: - 200: - description: "successful operation" - schema: - $ref: "#/definitions/Get" - /deleteconfig/{key}: - delete: - tags: - - "delete single key" - summary: "Delete value for specific key present in Consul." - description: "Deletes a specific key." - produces: - - "application/json" - parameters: - - name: "key" - in: "path" - description: "Key used to delete" - required: true - type: "string" - responses: - 200: - description: "successful operation" - schema: - $ref: "#/definitions/Delete" -definitions: - LoadRequest: - type: "object" - properties: - domain: - type: "string" - type: - $ref: "#/definitions/Type" - Type: - type: "object" - properties: - file_path: - type: "string" - LoadResponse: - type: "object" - properties: - response: - type: "string" - Gets: - type: "object" - properties: - response: - items: - type: "string" - Get: - type: "object" - properties: - response: - type: "string" - Delete: - type: "object" - properties: - response: - type: "string" diff --git a/swagger.yaml b/swagger.yaml new file mode 100644 index 0000000..3cdbc4d --- /dev/null +++ b/swagger.yaml @@ -0,0 +1,442 @@ +swagger: "2.0" +info: + description: "API reference for Distributed Key Value store." + version: "1.0.0" + title: "API reference for Distributed Key Value store" + contact: + email: "shashank.kumar.shankar@intel.com" + url: "https://wiki.onap.org/pages/viewpage.action?pageId=16010913" + license: + name: "Apache 2.0" + url: "http://www.apache.org/licenses/LICENSE-2.0.html" +basePath: "/v1" +schemes: +- "http" +paths: + /register: + post: + tags: + - "Domain" + summary: "Endpoint to Register new domain" + description: "" + consumes: + - "application/json" + produces: + - "application/json" + parameters: + - in: "body" + name: "body" + description: "Register new domain." + required: true + schema: + $ref: "#/definitions/RegisterDomainPOSTRequest" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/RegisterDomainPOSTResponse" + /register/{token}: + get: + tags: + - "Domain" + summary: "Check if domain is registered." + description: "Check if domain is registered identified by token." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to query" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/RegisterDomainGETResponse" + delete: + tags: + - "Domain" + summary: "Delete registered domain." + description: "Deletes a registered domain identified by token." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to delete" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/RegisterDomainDELETEResponse" + /register/{token}/subdomain: + post: + tags: + - "Subdomain" + summary: "Endpoint to Register new subdomain" + description: "" + consumes: + - "application/json" + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to identify domain." + required: true + type: "string" + - in: "body" + name: "body" + description: "Register new subdomain." + required: true + schema: + $ref: "#/definitions/RegisterSubdomainPOSTRequest" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/RegisterSubdomainPOSTResponse" + /register/{token}/subdomain/{subdomain}: + delete: + tags: + - "Subdomain" + summary: "Delete registered subdomain." + description: "Deletes a registered subdomain identified by token and subdomain." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to delete" + required: true + type: "string" + - name: "subdomain" + in: "path" + description: "Subdomain used to delete" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/RegisterSubDomainDELETEResponse" + /config: + post: + tags: + - "Config" + summary: "Endpoint to upload configuration." + description: "Endpoint to upload configuration." + consumes: + - "multipart/form-data" + produces: + - "application/json" + parameters: + - name: "configFile" + in: "formData" + description: "Config file to be uploaded." + required: true + type: "file" + - name: "token" + in: "formData" + description: "Token to identify domain to upload config file to." + required: true + type: "string" + - name: "subdomain" + in: "formData" + description: "Subdomain to identify subdomain to upload config file to." + required: false + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigUploadResponse" + /config/{token}/{filename}: + get: + tags: + - "Config" + summary: "Get config file." + description: "Get config file identified by token and filename." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to get config file." + required: true + type: "string" + - name: "filename" + in: "path" + description: "Filename used to get config file." + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigDomainDOWNLOADResponse" + delete: + tags: + - "Config" + summary: "Delete config file." + description: "Deletes a config file identified by token and filename." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to delete" + required: true + type: "string" + - name: "filename" + in: "path" + description: "Filename used to delete" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigDomainDELETEResponse" + /config/{token}/{subdomain}/{filename}: + get: + tags: + - "Config" + summary: "Get config file from subdomain." + description: "Get config file identified by token, filename and subdomain." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to get config file." + required: true + type: "string" + - name: "subdomain" + in: "path" + description: "Subdomain used to get config file." + required: true + type: "string" + - name: "filename" + in: "path" + description: "Filename used to get config file." + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigSubDomainDOWNLOADResponse" + delete: + tags: + - "Config" + summary: "Delete config file from subdomain." + description: "Deletes a config file identified by token, filename and subdomain." + produces: + - "application/json" + parameters: + - name: "token" + in: "path" + description: "Token used to delete config file." + required: true + type: "string" + - name: "subdomain" + in: "path" + description: "Subdomain used to delete config file." + required: true + type: "string" + - name: "filename" + in: "path" + description: "Filename used to delete config file." + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigSubDomainDELETEResponse" + /config/load: + post: + tags: + - "Config" + summary: "Load config into Consul." + description: "Load config into Consul upon hitting the endpoint." + consumes: + - "application/json" + produces: + - "application/json" + parameters: + - in: "body" + name: "body" + description: "Load configuration from file system to be added into Consul" + required: true + schema: + $ref: "#/definitions/ConfigLoadPOSTRequest" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigLoadPOSTResponse" + /config/load-default: + get: + tags: + - "Config" + summary: "Load default config into Consul." + description: "Load default config into Consul upon hitting the endpoint." + produces: + - "application/json" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConfigDefaultGETResponse" + /getconfigs: + get: + tags: + - "Consul operation" + summary: "Get all keys present in Consul." + description: "Returns a list of keys present in Consul." + produces: + - "application/json" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConsulGETAllResponse" + /getconfig/{key}: + get: + tags: + - "Consul operation" + summary: "Get value for specific key present in Consul." + description: "Returns a key and value present in Consul." + produces: + - "application/json" + parameters: + - name: "key" + in: "path" + description: "Key used to query Consul." + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConsulGETResponse" + /deleteconfig/{key}: + delete: + tags: + - "Consul operation" + summary: "Delete value for specific key present in Consul." + description: "Deletes a specific key." + produces: + - "application/json" + parameters: + - name: "key" + in: "path" + description: "Key used to delete" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/ConsulDELETEResponse" +definitions: + RegisterDomainPOSTRequest: + type: "object" + properties: + domain: + type: "string" + RegisterDomainPOSTResponse: + type: "object" + properties: + response: + type: "string" + RegisterDomainGETResponse: + type: "object" + properties: + response: + type: "string" + RegisterDomainDELETEResponse: + type: "object" + properties: + response: + type: "string" + RegisterSubdomainPOSTRequest: + type: "object" + properties: + subdomain: + type: "string" + RegisterSubdomainPOSTResponse: + type: "object" + properties: + response: + type: "string" + RegisterSubDomainDELETEResponse: + type: "object" + properties: + response: + type: "string" + ConfigUploadResponse: + type: "object" + properties: + response: + type: "string" + ConfigDomainDOWNLOADResponse: + type: "object" + properties: + response: + type: "string" + ConfigDomainDELETEResponse: + type: "object" + properties: + response: + type: "string" + ConfigSubDomainDOWNLOADResponse: + type: "object" + properties: + response: + type: "string" + ConfigSubDomainDELETEResponse: + type: "object" + properties: + response: + type: "string" + ConfigLoadPOSTRequest: + type: "object" + properties: + token: + type: "string" + filename: + type: "string" + subdomain: + type: "string" + ConfigLoadPOSTResponse: + type: "object" + properties: + response: + type: "string" + ConfigDefaultGETResponse: + type: "object" + properties: + response: + type: "string" + ConsulGETAllResponse: + type: "object" + properties: + response: + items: + type: "string" + ConsulGETResponse: + type: "object" + properties: + response: + type: "string" + ConsulDELETEResponse: + type: "object" + properties: + response: + type: "string" -- cgit 1.2.3-korg