summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShashank Kumar Shankar <shashank.kumar.shankar@intel.com>2018-02-27 15:41:46 -0800
committerShashank Kumar Shankar <shashank.kumar.shankar@intel.com>2018-03-07 13:40:18 -0800
commit5031a4e20a281b7a94f8c3743b1572314c574ec4 (patch)
tree7072a5d16dc948b35b8a6a76764056c6e4bab003
parent67dd59385cf983ef1307e3b3e410a8f773d8a5c3 (diff)
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 <shashank.kumar.shankar@intel.com>
-rw-r--r--deployment/Dockerfile43
-rw-r--r--deployment/docker-build.sh11
-rw-r--r--deployment/docker-entrypoint.sh33
-rw-r--r--deployment/run.sh6
-rw-r--r--deployment/setup-dependency.sh30
-rw-r--r--src/dkv/api/backendFilesystemConnection.go5
-rw-r--r--src/dkv/api/initialise.go8
-rw-r--r--swagger.json122
-rw-r--r--swagger.yaml442
9 files changed, 576 insertions, 124 deletions
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"