Add Docker building scripts and update swagger 81/33281/5
authorShashank Kumar Shankar <shashank.kumar.shankar@intel.com>
Tue, 27 Feb 2018 23:41:46 +0000 (15:41 -0800)
committerShashank Kumar Shankar <shashank.kumar.shankar@intel.com>
Wed, 7 Mar 2018 21:40:18 +0000 (13:40 -0800)
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 <shashank.kumar.shankar@intel.com>
deployment/Dockerfile [new file with mode: 0644]
deployment/docker-build.sh [new file with mode: 0644]
deployment/docker-entrypoint.sh [new file with mode: 0644]
deployment/run.sh [new file with mode: 0644]
deployment/setup-dependency.sh [new file with mode: 0644]
src/dkv/api/backendFilesystemConnection.go
src/dkv/api/initialise.go
swagger.json [deleted file]
swagger.yaml [new file with mode: 0644]

diff --git a/deployment/Dockerfile b/deployment/Dockerfile
new file mode 100644 (file)
index 0000000..7f6c6d5
--- /dev/null
@@ -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 (file)
index 0000000..767554f
--- /dev/null
@@ -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 (file)
index 0000000..9b29e3e
--- /dev/null
@@ -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 (file)
index 0000000..1aae1f6
--- /dev/null
@@ -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 (file)
index 0000000..fcb2d51
--- /dev/null
@@ -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
index f09e74f..e6c37ab 100644 (file)
@@ -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) {
index 824ca81..dfbcbde 100644 (file)
@@ -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 (file)
index 4430574..0000000
+++ /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 (file)
index 0000000..3cdbc4d
--- /dev/null
@@ -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"