summaryrefslogtreecommitdiffstats
path: root/kubernetes/common
diff options
context:
space:
mode:
Diffstat (limited to 'kubernetes/common')
-rw-r--r--kubernetes/common/Makefile3
-rw-r--r--kubernetes/common/dgbuilder/.helmignore21
-rw-r--r--kubernetes/common/dgbuilder/Chart.yaml4
-rw-r--r--kubernetes/common/dgbuilder/requirements.yaml4
-rw-r--r--kubernetes/common/dgbuilder/resources/config/svclogic.properties5
-rwxr-xr-xkubernetes/common/dgbuilder/resources/scripts/createReleaseDir.sh129
-rw-r--r--kubernetes/common/dgbuilder/resources/scripts/customSettings.js53
-rw-r--r--kubernetes/common/dgbuilder/templates/NOTES.txt19
-rw-r--r--kubernetes/common/dgbuilder/templates/configmap.yaml15
-rw-r--r--kubernetes/common/dgbuilder/templates/deployment.yaml98
-rw-r--r--kubernetes/common/dgbuilder/templates/secrets.yaml13
-rw-r--r--kubernetes/common/dgbuilder/templates/service.yaml26
-rw-r--r--kubernetes/common/dgbuilder/values.yaml93
-rw-r--r--kubernetes/common/mysql/.helmignore21
-rw-r--r--kubernetes/common/mysql/Chart.yaml4
-rw-r--r--kubernetes/common/mysql/requirements.yaml4
-rw-r--r--kubernetes/common/mysql/templates/configmap.yaml18
-rw-r--r--kubernetes/common/mysql/templates/nfs-provisoner.yaml62
-rw-r--r--kubernetes/common/mysql/templates/pv.yaml22
-rw-r--r--kubernetes/common/mysql/templates/pvc.yaml23
-rw-r--r--kubernetes/common/mysql/templates/secrets.yaml13
-rw-r--r--kubernetes/common/mysql/templates/service.yaml90
-rw-r--r--kubernetes/common/mysql/templates/statefulset.yaml238
-rw-r--r--kubernetes/common/mysql/templates/storageclass.yaml6
-rw-r--r--kubernetes/common/mysql/values.yaml111
25 files changed, 1094 insertions, 1 deletions
diff --git a/kubernetes/common/Makefile b/kubernetes/common/Makefile
index b9cc1250d5..d634a8c506 100644
--- a/kubernetes/common/Makefile
+++ b/kubernetes/common/Makefile
@@ -19,7 +19,7 @@ PACKAGE_DIR := $(OUTPUT_DIR)/packages
SECRET_DIR := $(OUTPUT_DIR)/secrets
EXCLUDES :=
-HELM_CHARTS := $(filter-out $(EXCLUDES), $(patsubst %/.,%,$(wildcard */.))) $(PARENT_CHART)
+HELM_CHARTS := $(filter-out $(EXCLUDES), $(patsubst %/.,%,$(wildcard */.)))
.PHONY: $(EXCLUDES) $(HELM_CHARTS)
@@ -41,6 +41,7 @@ lint-%: dep-%
package-%: lint-%
@mkdir -p $(PACKAGE_DIR)
@if [ -f $*/Chart.yaml ]; then helm package -d $(PACKAGE_DIR) $*; fi
+ @helm repo index $(PACKAGE_DIR)
clean:
@rm -f */requirements.lock
diff --git a/kubernetes/common/dgbuilder/.helmignore b/kubernetes/common/dgbuilder/.helmignore
new file mode 100644
index 0000000000..f0c1319444
--- /dev/null
+++ b/kubernetes/common/dgbuilder/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/common/dgbuilder/Chart.yaml b/kubernetes/common/dgbuilder/Chart.yaml
new file mode 100644
index 0000000000..e1955a137c
--- /dev/null
+++ b/kubernetes/common/dgbuilder/Chart.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+description: D.G. Builder application
+name: dgbuilder
+version: 2.0.0 \ No newline at end of file
diff --git a/kubernetes/common/dgbuilder/requirements.yaml b/kubernetes/common/dgbuilder/requirements.yaml
new file mode 100644
index 0000000000..acca8ef7e2
--- /dev/null
+++ b/kubernetes/common/dgbuilder/requirements.yaml
@@ -0,0 +1,4 @@
+dependencies:
+ - name: common
+ version: ~2.0.0
+ repository: '@local' \ No newline at end of file
diff --git a/kubernetes/common/dgbuilder/resources/config/svclogic.properties b/kubernetes/common/dgbuilder/resources/config/svclogic.properties
new file mode 100644
index 0000000000..fdaf5779e2
--- /dev/null
+++ b/kubernetes/common/dgbuilder/resources/config/svclogic.properties
@@ -0,0 +1,5 @@
+org.onap.ccsdk.sli.dbtype=jdbc
+org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://{{.Values.dbServiceName}}.{{ include "common.namespace" . }}:3306/sdnctl
+org.onap.ccsdk.sli.jdbc.database=sdnctl
+org.onap.ccsdk.sli.jdbc.user=sdnctl
+org.onap.ccsdk.sli.jdbc.password=gamma
diff --git a/kubernetes/common/dgbuilder/resources/scripts/createReleaseDir.sh b/kubernetes/common/dgbuilder/resources/scripts/createReleaseDir.sh
new file mode 100755
index 0000000000..38f7fe2720
--- /dev/null
+++ b/kubernetes/common/dgbuilder/resources/scripts/createReleaseDir.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+export PATH=$PATH:.
+appDir=$(pwd)
+if [ "$#" != 3 -a "$#" != 4 ]
+then
+ echo "Usage $0 releaseDir loginId emailAddress [gitLocalRepository]"
+ echo "Note: Specify the gitLocalRepository path if you would want to be able to import flows from your local git repository"
+ exit
+fi
+if [ ! -e "releases" ]
+then
+ mkdir releases
+fi
+releaseDir="$1"
+name="Release $releaseDir"
+loginId="$2"
+emailid="$3"
+dbHost="{{.Values.dbServiceName}}.{{.Release.Namespace}}"
+dbPort="3306"
+dbName="sdnctl"
+dbUser="sdnctl"
+dbPassword="gamma"
+gitLocalRepository="$4"
+
+lastPort=$(find "releases/" -name "customSettings.js" |xargs grep uiPort|cut -d: -f2|sed -e s/,//|sort|tail -1)
+echo $lastPort|grep uiPort >/dev/null 2>&1
+if [ "$?" == "0" ]
+then
+lastPort=$(find "releases/" -name "customSettings.js" |xargs grep uiPort|cut -d: -f3|sed -e s/,//|sort|tail -1)
+fi
+#echo $lastPort
+if [ "${lastPort}" == "" ]
+then
+ lastPort="3099"
+fi
+let nextPort=$(expr $lastPort+1)
+#echo $nextPort
+if [ ! -e "releases/$releaseDir" ]
+then
+mkdir releases/$releaseDir
+cd releases/$releaseDir
+mkdir flows
+mkdir flows/shared
+mkdir flows/shared/backups
+mkdir html
+mkdir xml
+mkdir lib
+mkdir lib/flows
+mkdir logs
+mkdir conf
+mkdir codecloud
+customSettingsFile="customSettings.js"
+if [ ! -e "./$customSettingsFile" ]
+then
+ echo "module.exports = {" >$customSettingsFile
+ echo " 'name' : '$name'," >>$customSettingsFile
+ echo " 'emailAddress' :'$emailid'," >>$customSettingsFile
+ echo " 'uiPort' :$nextPort," >>$customSettingsFile
+ echo " 'mqttReconnectTime': 15000," >>$customSettingsFile
+ echo " 'serialReconnectTime' : 15000," >>$customSettingsFile
+ echo " 'debugMaxLength': 1000," >>$customSettingsFile
+ echo " 'htmlPath': 'releases/$releaseDir/html/'," >>$customSettingsFile
+ echo " 'xmlPath': 'releases/$releaseDir/xml/'," >>$customSettingsFile
+ echo " 'flowFile' : 'releases/$releaseDir/flows/flows.json'," >>$customSettingsFile
+ echo " 'sharedDir': 'releases/$releaseDir/flows/shared'," >>$customSettingsFile
+ echo " 'userDir' : 'releases/$releaseDir'," >>$customSettingsFile
+ echo " 'httpAuth': {user:'$loginId',pass:'cc03e747a6afbbcbf8be7668acfebee5'}," >>$customSettingsFile
+ echo " 'dbHost': '$dbHost'," >>$customSettingsFile
+ echo " 'dbPort': '$dbPort'," >>$customSettingsFile
+ echo " 'dbName': '$dbName'," >>$customSettingsFile
+ echo " 'dbUser': '$dbUser'," >>$customSettingsFile
+ echo " 'dbPassword': '$dbPassword'," >>$customSettingsFile
+ echo " 'gitLocalRepository': '$gitLocalRepository'" >>$customSettingsFile
+ echo " }" >>$customSettingsFile
+fi
+ #echo "Created custom settings file $customSettingsFile"
+ echo "Done ....."
+else
+ echo "ERROR:customSettings file $customSettingsFile already exists for $releaseDir"
+ exit
+fi
+#echo "Content of custom settings file"
+#echo "============================================================================"
+# cat $customSettingsFile
+#echo "============================================================================"
+svclogicPropFile="./conf/svclogic.properties"
+if [ ! -d "${appDir}/yangFiles" ]
+then
+ mkdir -p "${appDir}/yangFiles"
+fi
+if [ ! -d "${appDir}/generatedJS" ]
+then
+ mkdir -p "${appDir}/generatedJS"
+fi
+
+if [ ! -e "./$svclogicPropFile" ]
+then
+ echo "org.onap.ccsdk.sli.dbtype=jdbc" >$svclogicPropFile
+ echo "org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://{{.Values.dbServiceName}}.{{.Release.Namespace}}:3306/sdnctl" >>$svclogicPropFile
+ echo "org.onap.ccsdk.sli.jdbc.database=sdnctl" >>$svclogicPropFile
+ echo "org.onap.ccsdk.sli.jdbc.user=sdnctl" >>$svclogicPropFile
+ echo "org.onap.ccsdk.sli.jdbc.password=gamma" >>$svclogicPropFile
+fi
+if [ ! -e "${appDir}/flowShareUsers.js" ]
+then
+ echo "module.exports = {\"flowShareUsers\":" >${appDir}/flowShareUsers.js
+ echo " [" >>${appDir}/flowShareUsers.js
+ echo " ]" >>${appDir}/flowShareUsers.js
+ echo "}" >>${appDir}/flowShareUsers.js
+fi
+grep "$releaseDir" ${appDir}/flowShareUsers.js >/dev/null 2>&1
+if [ "$?" != "0" ]
+then
+ num_of_lines=$(cat ${appDir}/flowShareUsers.js|wc -l)
+ if [ $num_of_lines -gt 4 ]
+ then
+ content=$(head -n -2 ${appDir}/flowShareUsers.js)
+ echo "${content}," > ${appDir}/flowShareUsers.js
+ else
+ content=$(head -n -2 ${appDir}/flowShareUsers.js)
+ echo "$content" > ${appDir}/flowShareUsers.js
+ fi
+ echo " {" >> ${appDir}/flowShareUsers.js
+ echo " \"name\" : \"$name\"," >> ${appDir}/flowShareUsers.js
+ echo " \"rootDir\" : \"$releaseDir\"" >> ${appDir}/flowShareUsers.js
+ echo " }" >> ${appDir}/flowShareUsers.js
+ echo " ]" >> ${appDir}/flowShareUsers.js
+ echo "}" >> ${appDir}/flowShareUsers.js
+fi
diff --git a/kubernetes/common/dgbuilder/resources/scripts/customSettings.js b/kubernetes/common/dgbuilder/resources/scripts/customSettings.js
new file mode 100644
index 0000000000..01bbcc733d
--- /dev/null
+++ b/kubernetes/common/dgbuilder/resources/scripts/customSettings.js
@@ -0,0 +1,53 @@
+/* Copyright © 2017 AT&T, Amdocs, Bell Canada
+*
+* 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.
+*/
+
+module.exports={
+ "name": "Release sdnc1.0",
+ "emailAddress": "dguser@onap.org",
+ "uiPort": 3100,
+ "mqttReconnectTime": 15000,
+ "serialReconnectTime": 15000,
+ "debugMaxLength": 1000,
+ "htmlPath": "releases/sdnc1.0/html/",
+ "xmlPath": "releases/sdnc1.0/xml/",
+ "flowFile": "releases/sdnc1.0/flows/flows.json",
+ "sharedDir": "releases/sdnc1.0/flows/shared",
+ "userDir": "releases/sdnc1.0",
+ "httpAuth": {
+ "user": "dguser",
+ "pass": "cc03e747a6afbbcbf8be7668acfebee5"
+ },
+ "dbHost": "{{.Values.dbServiceName}}.{{ include "common.namespace" . }}",
+ "dbPort": "3306",
+ "dbName": "sdnctl",
+ "dbUser": "sdnctl",
+ "dbPassword": "gamma",
+ "gitLocalRepository": "",
+ "httpRoot": "/",
+ "disableEditor": false,
+ "httpAdminRoot": "/",
+ "httpAdminAuth": {
+ "user": "dguser",
+ "pass": "cc03e747a6afbbcbf8be7668acfebee5"
+ },
+ "httpNodeRoot": "/",
+ "httpNodeAuth": {
+ "user": "dguser",
+ "pass": "cc03e747a6afbbcbf8be7668acfebee5"
+ },
+ "uiHost": "0.0.0.0",
+ "version": "0.9.1",
+ "performGitPull": "N"
+}
diff --git a/kubernetes/common/dgbuilder/templates/NOTES.txt b/kubernetes/common/dgbuilder/templates/NOTES.txt
new file mode 100644
index 0000000000..2465e03634
--- /dev/null
+++ b/kubernetes/common/dgbuilder/templates/NOTES.txt
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+ http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+ export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.fullname" . }})
+ export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+ echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ You can watch the status of by running 'kubectl get svc -w {{ include "common.fullname" . }}'
+ export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+ echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+ export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+ echo "Visit http://127.0.0.1:8080 to use your application"
+ kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/common/dgbuilder/templates/configmap.yaml b/kubernetes/common/dgbuilder/templates/configmap.yaml
new file mode 100644
index 0000000000..7ef92d09e7
--- /dev/null
+++ b/kubernetes/common/dgbuilder/templates/configmap.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "common.fullname" . }}-config
+ namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/*").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "common.fullname" . }}-scripts
+ namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/scripts/*").AsConfig . | indent 2 }}
diff --git a/kubernetes/common/dgbuilder/templates/deployment.yaml b/kubernetes/common/dgbuilder/templates/deployment.yaml
new file mode 100644
index 0000000000..4e1f1019ee
--- /dev/null
+++ b/kubernetes/common/dgbuilder/templates/deployment.yaml
@@ -0,0 +1,98 @@
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+ name: {{ include "common.fullname" . }}
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.replicaCount }}
+ template:
+ metadata:
+ labels:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }}
+ spec:
+ initContainers:
+ - command:
+ - /root/ready.py
+ args:
+ - --container-name
+ - {{ .Values.dbPodName }}
+ env:
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ apiVersion: v1
+ fieldPath: metadata.namespace
+ image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ name: {{ include "common.name" . }}-readiness
+ containers:
+ - name: {{ include "common.name" . }}
+ image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ command:
+ - /bin/bash
+ - -c
+ - cd /opt/onap/sdnc/dgbuilder/ && ./start.sh sdnc1.0 && wait
+ ports:
+ - containerPort: {{ .Values.service.internalPort }}
+ readinessProbe:
+ tcpSocket:
+ port: {{ .Values.service.internalPort }}
+ initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+ periodSeconds: {{ .Values.readiness.periodSeconds }}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ template "common.fullname" . }}
+ key: db-root-password
+ - name: SDNC_CONFIG_DIR
+ value: /opt/onap/sdnc/data/properties
+ volumeMounts:
+ - mountPath: /etc/localtime
+ name: localtime
+ readOnly: true
+ - name: config
+ mountPath: /opt/app/application.properties
+ subPath: application.properties
+ - name: config
+ mountPath: /opt/onap/sdnc/dgbuilder/releases/sdnc1.0/conf/svclogic.properties
+ subPath: svclogic.properties
+ - name: config
+ mountPath: /opt/onap/sdnc/dgbuilder/svclogic/svclogic.properties
+ subPath: svclogic.properties
+ - name: scripts
+ mountPath: /opt/onap/sdnc/dgbuilder/createReleaseDir.sh
+ subPath: createReleaseDir.sh
+ - name: scripts
+ mountPath: /opt/onap/sdnc/dgbuilder/releases/sdnc1.0/customSettings.js
+ subPath: customSettings.js
+ resources:
+{{ toYaml .Values.resources | indent 12 }}
+ {{- if .Values.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+ {{- end -}}
+ {{- if .Values.affinity }}
+ affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+ {{- end }}
+ volumes:
+ - name: localtime
+ hostPath:
+ path: /etc/localtime
+ - name: config
+ configMap:
+ name: {{ include "common.fullname" . }}-config
+ - name: scripts
+ configMap:
+ name: {{ include "common.fullname" . }}-scripts
+ defaultMode: 0755
+ imagePullSecrets:
+ - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/common/dgbuilder/templates/secrets.yaml b/kubernetes/common/dgbuilder/templates/secrets.yaml
new file mode 100644
index 0000000000..7604be8239
--- /dev/null
+++ b/kubernetes/common/dgbuilder/templates/secrets.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ include "common.fullname" . }}
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.fullname" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+type: Opaque
+data:
+ db-root-password: {{ .Values.config.dbRootPassword | b64enc | quote }} \ No newline at end of file
diff --git a/kubernetes/common/dgbuilder/templates/service.yaml b/kubernetes/common/dgbuilder/templates/service.yaml
new file mode 100644
index 0000000000..c61cdd549b
--- /dev/null
+++ b/kubernetes/common/dgbuilder/templates/service.yaml
@@ -0,0 +1,26 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "common.fullname" . }}
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ {{if eq .Values.service.type "NodePort" -}}
+ - port: {{ .Values.service.externalPort }}
+ targetPort: {{ .Values.service.internalPort }}
+ nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+ name: {{ .Values.service.name }}
+ {{- else -}}
+ - port: {{ .Values.service.externalPort }}
+ targetPort: {{ .Values.service.internalPort }}
+ name: {{ .Values.service.name }}
+ {{- end}}
+ selector:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }} \ No newline at end of file
diff --git a/kubernetes/common/dgbuilder/values.yaml b/kubernetes/common/dgbuilder/values.yaml
new file mode 100644
index 0000000000..23f8eea78e
--- /dev/null
+++ b/kubernetes/common/dgbuilder/values.yaml
@@ -0,0 +1,93 @@
+# Global configuration default values that can be inherited by
+# all subcharts.
+#################################################################
+global:
+ # Change to an unused port prefix range to prevent port conflicts
+ # with other instances running within the same k8s cluster
+ nodePortPrefix: 302
+
+ # image repositories
+ repository: nexus3.onap.org:10001
+ repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+
+ # readiness check
+ readinessRepository: oomk8s
+ readinessImage: readiness-check:1.0.0
+
+ # logging agent
+ loggingRepository: docker.elastic.co
+ loggingImage: beats/filebeat:5.5.0
+
+ # image pull policy
+ pullPolicy: Always
+
+ # default mount path root directory referenced
+ # by persistent volumes and log files
+ persistence:
+ mountPath: /dockerdata-nfs
+
+ # flag to enable debugging - application support required
+ debugEnabled: true
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/ccsdk-dgbuilder-image:v0.1.0
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# application configuration
+config:
+ dbRootPassword: openECOMP1.0
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ # necessary to disable liveness probe when setting breakpoints
+ # in debugger so K8s doesn't restart unresponsive container
+ enabled: true
+
+readiness:
+ initialDelaySeconds: 10
+ periodSeconds: 10
+
+service:
+ type: NodePort
+ name: dgbuilder
+ externalPort: 3000
+ internalPort: 3100
+ nodePort: 28
+
+ingress:
+ enabled: false
+
+resources: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+ #
+ # Example:
+ # Configure resource requests and limits
+ # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+ # Minimum memory for development is 2 CPU cores and 4GB memory
+ # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+# limits:
+# cpu: 2
+# memory: 4Gi
+# requests:
+# cpu: 2
+# memory: 4Gi
diff --git a/kubernetes/common/mysql/.helmignore b/kubernetes/common/mysql/.helmignore
new file mode 100644
index 0000000000..f0c1319444
--- /dev/null
+++ b/kubernetes/common/mysql/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/common/mysql/Chart.yaml b/kubernetes/common/mysql/Chart.yaml
new file mode 100644
index 0000000000..99e7c44fb9
--- /dev/null
+++ b/kubernetes/common/mysql/Chart.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+description: MySQL Server
+name: mysql
+version: 2.0.0
diff --git a/kubernetes/common/mysql/requirements.yaml b/kubernetes/common/mysql/requirements.yaml
new file mode 100644
index 0000000000..acca8ef7e2
--- /dev/null
+++ b/kubernetes/common/mysql/requirements.yaml
@@ -0,0 +1,4 @@
+dependencies:
+ - name: common
+ version: ~2.0.0
+ repository: '@local' \ No newline at end of file
diff --git a/kubernetes/common/mysql/templates/configmap.yaml b/kubernetes/common/mysql/templates/configmap.yaml
new file mode 100644
index 0000000000..dd2b5b7db2
--- /dev/null
+++ b/kubernetes/common/mysql/templates/configmap.yaml
@@ -0,0 +1,18 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "common.fullname" . }}-db-configmap
+ namespace: {{ include "common.namespace" . }}
+data:
+ master.cnf: |
+ # Apply this config only on the master.
+ [mysqld]
+ log-bin
+ [localpathprefix]
+ master
+ slave.cnf: |
+ # Apply this config only on slaves.
+ [mysqld]
+ super-read-only
+ [localpathprefix]
+ slave
diff --git a/kubernetes/common/mysql/templates/nfs-provisoner.yaml b/kubernetes/common/mysql/templates/nfs-provisoner.yaml
new file mode 100644
index 0000000000..478224e1a1
--- /dev/null
+++ b/kubernetes/common/mysql/templates/nfs-provisoner.yaml
@@ -0,0 +1,62 @@
+#{{ if not .Values.disableNfsProvisioner }}
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+ name: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ #replicas: {{ .Values.replicaCount }}
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+ image: "{{ .Values.global.nfsprovisionerRepository | default .Values.nfsprovisionerRepository }}/{{ .Values.nfsprovisionerImage }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ ports:
+ - name: nfs
+ containerPort: {{ .Values.service.nfsPort }}
+ - name: mountd
+ containerPort: {{ .Values.service.mountdPort }}
+ - name: rpcbind
+ containerPort: {{ .Values.service.rpcbindPort }}
+ - name: rpcbind-udp
+ containerPort: {{ .Values.service.rpcbindUdpPort }}
+ protocol: UDP
+ securityContext:
+ capabilities:
+ add:
+ - DAC_READ_SEARCH
+ - SYS_RESOURCE
+ args:
+ - "-provisioner={{ include "common.fullname" . }}/nfs"
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ - name: SERVICE_NAME
+ value: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+ - name: POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ volumeMounts:
+ - name: export-volume
+ mountPath: /export
+ volumes:
+ - name: export-volume
+ hostPath:
+ path: {{ .Values.global.persistence.mountPath | default .Values.persistence.mountPath }}/{{ .Release.Namespace }}/{{ .Values.persistence.mountSubPath }}
+#{{ end }}
diff --git a/kubernetes/common/mysql/templates/pv.yaml b/kubernetes/common/mysql/templates/pv.yaml
new file mode 100644
index 0000000000..ba128b95d0
--- /dev/null
+++ b/kubernetes/common/mysql/templates/pv.yaml
@@ -0,0 +1,22 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: {{ include "common.fullname" . }}-data
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+ chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+ release: "{{ .Release.Name }}"
+ heritage: "{{ .Release.Service }}"
+ name: {{ include "common.fullname" . }}
+spec:
+ capacity:
+ storage: {{ .Values.persistence.size}}
+ accessModes:
+ - {{ .Values.persistence.accessMode }}
+ storageClassName: "{{ include "common.fullname" . }}-data"
+ persistentVolumeReclaimPolicy: {{ .Values.persistence.volumeReclaimPolicy }}
+ hostPath:
+ path: {{ .Values.global.persistence.mountPath | default .Values.persistence.mountPath }}/{{ .Release.Namespace }}/{{ .Values.persistence.mountSubPath }}
+{{- end -}}
diff --git a/kubernetes/common/mysql/templates/pvc.yaml b/kubernetes/common/mysql/templates/pvc.yaml
new file mode 100644
index 0000000000..a2949fef36
--- /dev/null
+++ b/kubernetes/common/mysql/templates/pvc.yaml
@@ -0,0 +1,23 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ include "common.fullname" . }}-data
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.fullname" . }}
+ chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+ release: "{{ .Release.Name }}"
+ heritage: "{{ .Release.Service }}"
+{{- if .Values.persistence.annotations }}
+ annotations:
+{{ toYaml .Values.persistence.annotations | indent 4 }}
+{{- end }}
+spec:
+ accessModes:
+ - {{ .Values.persistence.accessMode }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size }}
+ storageClassName: "{{ include "common.fullname" . }}-data"
+{{- end -}} \ No newline at end of file
diff --git a/kubernetes/common/mysql/templates/secrets.yaml b/kubernetes/common/mysql/templates/secrets.yaml
new file mode 100644
index 0000000000..7604be8239
--- /dev/null
+++ b/kubernetes/common/mysql/templates/secrets.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ include "common.fullname" . }}
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.fullname" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+type: Opaque
+data:
+ db-root-password: {{ .Values.config.dbRootPassword | b64enc | quote }} \ No newline at end of file
diff --git a/kubernetes/common/mysql/templates/service.yaml b/kubernetes/common/mysql/templates/service.yaml
new file mode 100644
index 0000000000..c6a28c4605
--- /dev/null
+++ b/kubernetes/common/mysql/templates/service.yaml
@@ -0,0 +1,90 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.service.name }}
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ ports:
+ - port: {{ .Values.service.internalPort }}
+ name: {{ .Values.service.name }}
+ selector:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }}
+ clusterIP: None
+#{{ if not .Values.disableNfsProvisioner }}
+---
+kind: Service
+apiVersion: v1
+metadata:
+ name: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+spec:
+ ports:
+ - name: nfs
+ port: {{ .Values.service.nfsPort }}
+ - name: mountd
+ port: {{ .Values.service.mountdPort }}
+ - name: rpcbind
+ port: {{ .Values.service.rpcbindPort }}
+ - name: rpcbind-udp
+ port: {{ .Values.service.rpcbindUdpPort }}
+ protocol: UDP
+ selector:
+ app: {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+#{{ end }}
+---
+# Client service for connecting to any MySQL instance for reads.
+# Only master: sdnc-dbhost-0 accepts the write request.
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.service.name }}-read
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+spec:
+ ports:
+ - port: {{ .Values.service.internalPort }}
+ name: {{ .Values.service.name }}
+ selector:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.sdnctlPrefix }}-sdnctldb01
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+spec:
+ ports:
+ - port: {{ .Values.service.internalPort }}
+ name: {{ .Values.service.name }}
+ selector:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }}
+ clusterIP: None
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.sdnctlPrefix }}-sdnctldb02
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+spec:
+ ports:
+ - port: {{ .Values.service.internalPort }}
+ name: {{ .Values.service.name }}
+ selector:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }}
+ clusterIP: None
diff --git a/kubernetes/common/mysql/templates/statefulset.yaml b/kubernetes/common/mysql/templates/statefulset.yaml
new file mode 100644
index 0000000000..7b55bf2be0
--- /dev/null
+++ b/kubernetes/common/mysql/templates/statefulset.yaml
@@ -0,0 +1,238 @@
+apiVersion: apps/v1beta1
+kind: StatefulSet
+metadata:
+ name: {{ include "common.fullname" . }}
+ namespace: {{ include "common.namespace" . }}
+ labels:
+ app: {{ include "common.name" . }}
+ chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ serviceName: {{ .Values.service.name }}
+ replicas: {{ .Values.replicaCount }}
+ template:
+ metadata:
+ labels:
+ app: {{ include "common.name" . }}
+ release: {{ .Release.Name }}
+ spec:
+ initContainers:
+#{{ if not .Values.disableNfsProvisioner }}
+ - name: {{ include "common.name" . }}-readiness
+ command:
+ - /root/ready.py
+ args:
+ - --container-name
+ - {{ .Values.nfsprovisionerPrefix }}-nfs-provisioner
+ env:
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ apiVersion: v1
+ fieldPath: metadata.namespace
+ image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+#{{ end }}
+ - name: init-mysql
+ image: "{{ .Values.repository | default .Values.repository }}/{{ .Values.image }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ command:
+ - bash
+ - "-c"
+ - |
+ set -ex
+ # Generate mysql server-id from pod ordinal index.
+ [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
+ ordinal=${BASH_REMATCH[1]}
+ echo BASH_REMATCH=${BASH_REMATCH}
+ echo [mysqld] > /mnt/conf.d/server-id.cnf
+ # Add an offset to avoid reserved server-id=0 value.
+ echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
+ # Copy appropriate conf.d files from config-map to emptyDir.
+ if [[ $ordinal -eq 0 ]]; then
+ cp /mnt/config-map/master.cnf /mnt/conf.d/
+ else
+ cp /mnt/config-map/slave.cnf /mnt/conf.d/
+ fi
+ volumeMounts:
+ - name: conf
+ mountPath: /mnt/conf.d
+ - name: config-map
+ mountPath: /mnt/config-map
+
+ - name: clone-mysql
+ image: "{{ .Values.global.xtrabackupRepository | default .Values.xtrabackupRepository }}/{{ .Values.xtrabackupImage }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ template "common.fullname" . }}
+ key: db-root-password
+ command:
+ - bash
+ - "-c"
+ - |
+ set -ex
+ # Skip the clone if data already exists.
+ [[ -d /var/lib/mysql/mysql ]] && exit 0
+ # Skip the clone on master (ordinal index 0).
+ [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
+ ordinal=${BASH_REMATCH[1]}
+ echo ${BASH_REMATCH}
+ [[ $ordinal -eq 0 ]] && exit 0
+ # Clone data from previous peer.
+ ncat --recv-only {{ template "common.name" . }}-$(($ordinal-1)).{{ .Values.service.name }}.{{ include "common.namespace" . }} 3307 | xbstream -x -C /var/lib/mysql
+ # Prepare the backup.
+ xtrabackup --user=root --password=$MYSQL_ROOT_PASSWORD --prepare --target-dir=/var/lib/mysql
+ ls -l /var/lib/mysql
+ volumeMounts:
+ - name: {{ include "common.fullname" . }}-data
+ mountPath: /var/lib/mysql
+ subPath: mysql
+ - name: conf
+ mountPath: /etc/mysql/conf.d
+
+ containers:
+ #sdnc-db-container
+ - name: {{ include "common.name" . }}
+ image: "{{ .Values.repository | default .Values.repository }}/{{ .Values.image }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.service.internalPort }}
+ # disable liveness probe when breakpoints set in debugger
+ # so K8s doesn't restart unresponsive container
+ {{- if eq .Values.liveness.enabled true }}
+ livenessProbe:
+ exec:
+ command: ["mysqladmin", "ping"]
+ initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+ periodSeconds: {{ .Values.liveness.periodSeconds }}
+ timeoutSeconds: {{ .Values.liveness.timeoutSeconds }}
+ {{end -}}
+ readinessProbe:
+ tcpSocket:
+ port: {{ .Values.service.internalPort }}
+ initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+ periodSeconds: {{ .Values.readiness.periodSeconds }}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ template "common.fullname" . }}
+ key: db-root-password
+ - name: MYSQL_ROOT_HOST
+ value: '%'
+ - name: MYSQL_ALLOW_EMPTY_PASSWORD
+ value: {{ .Values.config.dbAllowEmptyPassword | default "0" | quote }}
+ volumeMounts:
+ - mountPath: /var/lib/mysql
+ name: {{ include "common.fullname" . }}-data
+ subPath: mysql
+ - mountPath: /etc/mysql/conf.d
+ name: conf
+ resources:
+{{ toYaml .Values.resources | indent 12 }}
+ {{- if .Values.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+ {{- end -}}
+ {{- if .Values.affinity }}
+ affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+ {{- end }}
+
+ - name: xtrabackup
+ image: "{{ .Values.global.xtrabackupRepository | default .Values.xtrabackupRepository }}/{{ .Values.xtrabackupImage }}"
+ imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ template "common.fullname" . }}
+ key: db-root-password
+ ports:
+ - containerPort: {{ .Values.xtrabackup.internalPort }}
+ name: xtrabackup
+ command:
+ - bash
+ - "-c"
+ - |
+ set -ex
+ cd /var/lib/mysql
+ ls -l
+ # Determine binlog position of cloned data, if any.
+ if [[ -f xtrabackup_slave_info ]]; then
+ echo "Inside xtrabackup_slave_info"
+ # XtraBackup already generated a partial "CHANGE MASTER TO" query
+ # because we're cloning from an existing slave.
+ mv xtrabackup_slave_info change_master_to.sql.in
+ # Ignore xtrabackup_binlog_info in this case (it's useless).
+ rm -f xtrabackup_binlog_info
+ elif [[ -f xtrabackup_binlog_info ]]; then
+ echo "Inside xtrabackup_binlog_info"
+ # We're cloning directly from master. Parse binlog position.
+ [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
+ rm xtrabackup_binlog_info
+ echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
+ MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
+ fi
+
+ # Check if we need to complete a clone by starting replication.
+ if [[ -f change_master_to.sql.in ]]; then
+ echo "Waiting for mysqld to be ready (accepting connections)"
+ [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
+ ordinal=${BASH_REMATCH[1]}
+ echo $ordinal
+ until mysql --user=root --password=$MYSQL_ROOT_PASSWORD -h localhost -e "SELECT 1"; do sleep 1; done
+
+ echo "Initializing replication from clone position"
+ # In case of container restart, attempt this at-most-once.
+ mv change_master_to.sql.in change_master_to.sql.orig
+ mysql --user=root --password=$MYSQL_ROOT_PASSWORD -h localhost <<EOF
+ $(<change_master_to.sql.orig),
+ MASTER_HOST="{{ template "common.name" . }}-0.{{ .Values.service.name }}.{{ include "common.namespace" . }}",
+ MASTER_USER="root",
+ MASTER_PASSWORD="$MYSQL_ROOT_PASSWORD",
+ MASTER_CONNECT_RETRY=10;
+ START SLAVE;
+ EOF
+ fi
+
+ # Start a server to send backups when requested by peers.
+ exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
+ "xtrabackup --user=root --password=$MYSQL_ROOT_PASSWORD --backup --slave-info --stream=xbstream --host=localhost"
+ volumeMounts:
+ - name: {{ include "common.fullname" . }}-data
+ mountPath: /var/lib/mysql
+ subPath: mysql
+ - name: conf
+ mountPath: /etc/mysql/conf.d
+ volumes:
+ - name: conf
+ emptyDir: {}
+ - name: config-map
+ configMap:
+ name: {{ include "common.fullname" . }}-db-configmap
+ - name: localtime
+ hostPath:
+ path: /etc/localtime
+ - name: {{ include "common.fullname" . }}-data
+#{{ if not .Values.disableNfsProvisioner }}
+ volumeClaimTemplates:
+ - metadata:
+ name: {{ include "common.fullname" . }}-data
+ annotations:
+ volume.beta.kubernetes.io/storage-class: "{{ include "common.fullname" . }}-data"
+ spec:
+ accessModes: ["ReadWriteMany"]
+ resources:
+ requests:
+ storage: 1Gi
+#{{ else if .Values.persistence.enabled }}
+ persistentVolumeClaim:
+ claimName: {{ include "common.fullname" . }}-data
+#{{ else }}
+ emptyDir: {}
+#{{ end }}
diff --git a/kubernetes/common/mysql/templates/storageclass.yaml b/kubernetes/common/mysql/templates/storageclass.yaml
new file mode 100644
index 0000000000..1a4e6b6bb7
--- /dev/null
+++ b/kubernetes/common/mysql/templates/storageclass.yaml
@@ -0,0 +1,6 @@
+kind: StorageClass
+apiVersion: storage.k8s.io/v1
+metadata:
+ name: "{{ include "common.fullname" . }}-data"
+ namespace: {{ include "common.namespace" . }}
+provisioner: {{ include "common.fullname" . }}/nfs
diff --git a/kubernetes/common/mysql/values.yaml b/kubernetes/common/mysql/values.yaml
new file mode 100644
index 0000000000..c0beb6fd22
--- /dev/null
+++ b/kubernetes/common/mysql/values.yaml
@@ -0,0 +1,111 @@
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+ nodePortPrefix: 302
+ repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+ persistence: {}
+ readinessRepository: oomk8s
+ readinessImage: readiness-check:1.0.0
+
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+
+#repository: mysql
+repository: registry.hub.docker.com
+image: library/mysql:5.7
+pullPolicy: Always
+
+# application configuration
+config:
+ dbRootPassword: openECOMP1.0
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 5
+ # necessary to disable liveness probe when setting breakpoints
+ # in debugger so K8s doesn't restart unresponsive container
+ enabled: true
+
+readiness:
+ initialDelaySeconds: 5
+ periodSeconds: 10
+
+## Persist data to a persitent volume
+persistence:
+ enabled: false
+
+ ## A manually managed Persistent Volume and Claim
+ ## Requires persistence.enabled: true
+ ## If defined, PVC must be created manually before volume will be bound
+ # existingClaim:
+ volumeReclaimPolicy: Retain
+
+ ## database data Persistent Volume Storage Class
+ ## If defined, storageClassName: <storageClass>
+ ## If set to "-", storageClassName: "", which disables dynamic provisioning
+ ## If undefined (the default) or set to null, no storageClassName spec is
+ ## set, choosing the default provisioner. (gp2 on AWS, standard on
+ ## GKE, AWS & OpenStack)
+ accessMode: ReadWriteMany
+ size: 1Gi
+ mountPath: /dockerdata-nfs
+ mountSubPath: mysql/data
+
+service:
+ name: mysql
+ internalPort: 3306
+ # nfs provisioner ports
+ nfsPort: 2049
+ mountdPort: 20048
+ rpcbindPort: 111
+ rpcbindUdpPort: 111
+
+ingress:
+ enabled: false
+
+resources: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+ #
+ # Example:
+ # Configure resource requests and limits
+ # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+ # Minimum memory for development is 2 CPU cores and 4GB memory
+ # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+# limits:
+# cpu: 2
+# memory: 4Gi
+# requests:
+# cpu: 2
+# memory: 4Gi
+
+#################################################################
+# Sidecar Configuration.
+#
+# xtrabackup configuration defaults.
+#################################################################
+xtrabackupRepository: gcr.io/google-samples
+xtrabackupImage: xtrabackup:1.0
+xtrabackup:
+ internalPort: 3307
+
+nfsprovisionerRepository: quay.io
+nfsprovisionerImage: kubernetes_incubator/nfs-provisioner:v1.0.8
+nfsprovisionerPrefix: mysql
+
+sdnctlPrefix: mysql