Merge "Convert TOSCA loader from a Deployment to a Job"
diff --git a/.gitignore b/.gitignore
index 2545b5a..61195a5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,11 @@
-xos-profiles/rcord-lite/charts/*
-xos-profiles/rcord-lite/requirements.lock
\ No newline at end of file
+# local chart repo
+chart_repo
+
+# lockfiles for requirements.yaml for dependent charts
+requirements.lock
+
+# ignore dependent chart dirs
+xos-core/charts
+voltha/charts
+xos-core/charts
+xos-profiles/rcord-lite/charts
diff --git a/configs/onos-cord.yaml b/configs/onos-cord.yaml
index 764f143..e4d4fb9 100644
--- a/configs/onos-cord.yaml
+++ b/configs/onos-cord.yaml
@@ -16,8 +16,7 @@
 
 # Parameters for running ONOS with VTN
 #
-# helm install -f configs/onos-cord.yaml onos
+# helm install onos -f configs/onos-cord.yaml -n onos-cord
 
 # VTN is not working with 1.13 at present
-image:
-  tag: 1.12.0
+onosImage: 'onosproject/onos:1.12.0'
diff --git a/configs/onos-fabric.yaml b/configs/onos-fabric.yaml
index 8115b1d..ac25a5d 100644
--- a/configs/onos-fabric.yaml
+++ b/configs/onos-fabric.yaml
@@ -16,7 +16,7 @@
 
 # Expose ONOS services using NodePorts, for onos-fabric configuration
 #
-# helm install -f configs/onos-fabric.yaml onos
+# helm install onos -f configs/onos-fabric.yaml -n onos-fabric
 
 services:
   openflowServiceType: NodePort
diff --git a/configs/onos-voltha.yaml b/configs/onos-voltha.yaml
index 2bce674..3f7b95c 100644
--- a/configs/onos-voltha.yaml
+++ b/configs/onos-voltha.yaml
@@ -16,17 +16,15 @@
 
 # Expose ONOS services using NodePorts, for onos-voltha configuration
 #
-# helm install -f configs/onos-voltha.yaml onos
+# helm install onos -f configs/onos-voltha.yaml -n onos-voltha
+
 nameOverride: "onosv"
 fullnameOverride: "onos-voltha"
 
 namespace: voltha
 serviceAccountName: voltha-serviceaccount
 
-image:
-  repository: voltha/voltha-onos
-  tag: 'latest'
-  pullPolicy: IfNotPresent
+onosImage: 'voltha/voltha-onos:latest'
 
 services:
   openflowServiceType: ClusterIP
diff --git a/dhcp-server/templates/deployment.yaml b/dhcp-server/templates/deployment.yaml
index 9409a41..95a3b03 100644
--- a/dhcp-server/templates/deployment.yaml
+++ b/dhcp-server/templates/deployment.yaml
@@ -27,8 +27,8 @@
     spec:
       containers:
         - name: dhcp-server
-          image: {{ .Values.pull_docker_registry }}{{ .Values.images.dhcp_server.repository }}:{{ .Values.images.dhcp_server.tag }}
-          imagePullPolicy: {{ .Values.images.dhcp_server.pullPolicy }}
+          image: {{ .Values.dhcpServerImage }}
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           #command: ["/bin/bash", "-", "sleep 86400"]
           ports:
             - containerPort: 67
diff --git a/dhcp-server/values.yaml b/dhcp-server/values.yaml
index 2984f39..cc46338 100644
--- a/dhcp-server/values.yaml
+++ b/dhcp-server/values.yaml
@@ -12,13 +12,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-pull_docker_registry:
+# helm install dhcp-server -n dhcp-server
 
-images:
-  dhcp_server:
-    repository: networkboot/dhcpd
-    tag: 'latest'
-    pullPolicy: 'IfNotPresent'
+dhcpServerImage: 'networkboot/dhcpd:latest'
+imagePullPolicy: IfNotPresent
 
 config: |
 
diff --git a/examples/candidate-tag-values.yaml b/examples/candidate-tag-values.yaml
index aa11d0c..e2c0106 100644
--- a/examples/candidate-tag-values.yaml
+++ b/examples/candidate-tag-values.yaml
@@ -1,5 +1,4 @@
 ---
-
 # Copyright 2018-present Open Networking Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,11 +18,14 @@
 # in xos-core chart
 xos_coreImage: 'xosproject/xos-core:candidate'
 xos_chameleonImage: 'xosproject/chameleon:candidate'
-xos_guiImage: 'xosproject/xos-gui:candidate'
 xos_toscaImage: 'xosproject/xos-tosca:candidate'
-xos_wsImage: 'xosproject/xos-ws:candidate'
 xos_api_testerImage: 'xosproject/xos-api-tester:candidate'
 
+# in xos-gui sub-chart required by xos-core chart
+xos-gui:
+  xos_guiImage: 'xosproject/xos-gui:candidate'
+  xos_wsImage: 'xosproject/xos-ws:candidate'
+
 # in rcord-lite chart
 rcord_synchronizerImage: "xosproject/rcord-synchronizer:candidate"
 
@@ -38,5 +40,7 @@
   volt_synchronizerImage: "xosproject/volt-synchronizer:candidate"
 vsg-hw:
   vsg_hw_synchronizerImage: "xosproject/vsg-hw-synchronizer:candidate"
+vrouter:
+  vrouter_synchronizerImage: "xosproject/vrouter-synchronizer:candidate"
 kubernetes:
   kubernetes_synchronizerImage: "xosproject/kubernetes-synchronizer:candidate"
diff --git a/examples/filter-images.yaml b/examples/filter-images.yaml
index e9f5e38..b2e661b 100644
--- a/examples/filter-images.yaml
+++ b/examples/filter-images.yaml
@@ -28,6 +28,7 @@
 - xosproject/xos-synchronizer-base
 - xosproject/rcord-synchronizer
 - xosproject/volt-synchronizer
+- xosproject/vrouter-synchronizer
 - xosproject/vtn-synchronizer
 - xosproject/onos-synchronizer
 - xosproject/addressmanager-synchronizer
diff --git a/examples/pull-always-values.yaml b/examples/pull-always-values.yaml
index 75a185a..de15672 100644
--- a/examples/pull-always-values.yaml
+++ b/examples/pull-always-values.yaml
@@ -16,7 +16,7 @@
 
 # Set all image tags to "candidate" to use imagebuilder's local images
 
-# in xos-core and rcord-lite charts
+# in xos-core, rcord-lite, onos and voltha charts
 imagePullPolicy: 'Always'
 
 # in service charts
@@ -34,3 +34,5 @@
   imagePullPolicy: 'Always'
 vrouter:
   imagePullPolicy: 'Always'
+xos-gui:
+  imagePullPolicy: 'Always'
diff --git a/examples/test-images.yaml b/examples/test-images.yaml
new file mode 100644
index 0000000..787193c
--- /dev/null
+++ b/examples/test-images.yaml
@@ -0,0 +1,38 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+# Whitelist for use with imagebuilder, only images needed for api-test
+
+docker_image_whitelist:
+- xosproject/chameleon
+- xosproject/xos-base
+- xosproject/xos-client
+- xosproject/xos-core
+- xosproject/xos-libraries
+- xosproject/xos-tosca
+- xosproject/xos-synchronizer-base
+- xosproject/rcord-synchronizer
+- xosproject/volt-synchronizer
+- xosproject/vtn-synchronizer
+- xosproject/onos-synchronizer
+- xosproject/addressmanager-synchronizer
+- xosproject/vsg-hw-synchronizer
+- xosproject/kubernetes-synchronizer
+- xosproject/fabric-synchronizer
+- xosproject/xos-api-tester
+- node
+- postgres
+- redis
+
diff --git a/xos-core/templates/ws-configmap.yaml b/examples/test-values.yaml
similarity index 68%
copy from xos-core/templates/ws-configmap.yaml
copy to examples/test-values.yaml
index 7dcc72b..9127993 100644
--- a/xos-core/templates/ws-configmap.yaml
+++ b/examples/test-values.yaml
@@ -1,5 +1,5 @@
 ---
-# Copyright 2017-present Open Networking Foundation
+# Copyright 2018-present Open Networking Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,13 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: xos-ws
-  labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
-data:
-  config: |
-{{ include "xos-ws.gateway_config" . | indent 4 }}
+# API test values file
+
+xos-gui:
+  enabled: false
 
diff --git a/xos-core/templates/ws-configmap.yaml b/examples/xossh-candidate.yaml
similarity index 68%
copy from xos-core/templates/ws-configmap.yaml
copy to examples/xossh-candidate.yaml
index 7dcc72b..fe1e848 100644
--- a/xos-core/templates/ws-configmap.yaml
+++ b/examples/xossh-candidate.yaml
@@ -1,5 +1,5 @@
 ---
-# Copyright 2017-present Open Networking Foundation
+# Copyright 2018-present Open Networking Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,13 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: xos-ws
-  labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
-data:
-  config: |
-{{ include "xos-ws.gateway_config" . | indent 4 }}
-
+# tools
+xosshImage: 'xosproject/xos-client:candidate'
+imagePullPolicy: 'Always'
\ No newline at end of file
diff --git a/onos/templates/deployment.yaml b/onos/templates/deployment.yaml
index 5d9e343..585b250 100644
--- a/onos/templates/deployment.yaml
+++ b/onos/templates/deployment.yaml
@@ -40,8 +40,8 @@
       serviceAccountName: {{ .Values.serviceAccountName }}
       containers:
         - name: {{ .Chart.Name }}
-          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
-          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          image: {{ .Values.onosImage }}
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           env:
 {{ toYaml .Values.onos_env | indent 12 }}
           ports:
diff --git a/onos/values.yaml b/onos/values.yaml
index 601e46d..795176a 100644
--- a/onos/values.yaml
+++ b/onos/values.yaml
@@ -20,10 +20,8 @@
 
 replicaCount: 1
 
-image:
-  repository: onosproject/onos
-  tag: 1.13.1
-  pullPolicy: IfNotPresent
+imagePullPolicy: IfNotPresent
+onosImage: 'onosproject/onos:1.13.1'
 
 nameOverride: ""
 fullnameOverride: ""
diff --git a/scripts/helmrepo.sh b/scripts/helmrepo.sh
new file mode 100755
index 0000000..e32f546
--- /dev/null
+++ b/scripts/helmrepo.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+# helmrepo.sh
+# creates a helm repo for publishing on guide website
+
+set -e -u -o pipefail
+
+REPO_DIR="${REPO_DIR:-chart_repo}"
+
+GERRIT_BRANCH="${GERRIT_BRANCH:-$(git symbolic-ref --short HEAD)}"
+PUBLISH_URL="${PUBLISH_URL:-https://guide.opencord.org/charts/${GERRIT_BRANCH}}"
+
+mkdir -p "${REPO_DIR}"
+
+for chart in $(find . -name Chart.yaml -print) ; do
+
+  chartdir=$(dirname "${chart}")
+
+  echo "Adding ${chartdir}"
+
+  helm package --dependency-update --destination "${REPO_DIR}" "${chartdir}"
+
+done
+
+echo "Generating repo index"
+
+helm repo index "${REPO_DIR}" --url "${PUBLISH_URL}"
+
+echo "Finished, chart repo generated: ${REPO_DIR}"
+
diff --git a/voltha/templates/envoy_for_etcd.yaml b/voltha/templates/envoy_for_etcd.yaml
index 59bacdb..4869682 100644
--- a/voltha/templates/envoy_for_etcd.yaml
+++ b/voltha/templates/envoy_for_etcd.yaml
@@ -41,7 +41,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
         - name: voltha
-          image: {{ .Values.pull_docker_registry }}{{ .Values.images.envoy_for_etcd.repository }}:{{ .Values.images.envoy_for_etcd.tag }}
+          image: {{ .Values.envoyForEtcdImage }}
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           env:
             - name: POD_IP
               valueFrom:
@@ -67,6 +68,5 @@
               name: mystery2-port
             - containerPort: 50555
               name: grpc-port
-          imagePullPolicy: {{ .Values.image_pull_policy }}
 
 
diff --git a/voltha/templates/freeradius.yaml b/voltha/templates/freeradius.yaml
index 10a32c6..6436303 100644
--- a/voltha/templates/freeradius.yaml
+++ b/voltha/templates/freeradius.yaml
@@ -55,7 +55,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
         - name: freeradius
-          image: {{ .Values.pull_docker_registry }}{{ .Values.images.freeradius.repository }}:{{ .Values.images.freeradius.tag }}
+          image: {{ .Values.freeradiusImage }}
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           env:
             - name: POD_IP
               valueFrom:
diff --git a/voltha/templates/grafana.yaml b/voltha/templates/grafana.yaml
index 4fa7566..f4716bb 100644
--- a/voltha/templates/grafana.yaml
+++ b/voltha/templates/grafana.yaml
@@ -63,7 +63,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
       - name: grafana
-        image: {{ .Values.pull_docker_registry }}{{ .Values.images.grafana.repository }}:{{ .Values.images.grafana.tag }}
+        image: {{ .Values.grafanaImage }}
+        imagePullPolicy: {{ .Values.imagePullPolicy }}
         ports:
         - containerPort: 80
         - containerPort: 2003
diff --git a/voltha/templates/netconf.yaml b/voltha/templates/netconf.yaml
index cacbf2e..acec48f 100644
--- a/voltha/templates/netconf.yaml
+++ b/voltha/templates/netconf.yaml
@@ -53,8 +53,8 @@
               topologyKey: kubernetes.io/hostname
       containers:
       - name: netconf
-        image: {{ .Values.pull_docker_registry }}{{ .Values.images.netconf.repository }}:{{ .Values.images.netconf.tag }}
-        imagePullPolicy: {{ .Values.image_pull_policy }}
+        image: {{ .Values.netconfImage }}
+        imagePullPolicy: {{ .Values.imagePullPolicy }}
         ports:
         - containerPort: 830
         env:
diff --git a/voltha/templates/ofagent.yaml b/voltha/templates/ofagent.yaml
index 124f0b4..9a2f836 100644
--- a/voltha/templates/ofagent.yaml
+++ b/voltha/templates/ofagent.yaml
@@ -41,8 +41,8 @@
             topologyKey: kubernetes.io/hostname
       containers:
       - name: ofagent
-        image: {{ .Values.pull_docker_registry }}{{ .Values.images.ofagent.repository }}:{{ .Values.images.ofagent.tag }}
-        imagePullPolicy: {{ .Values.image_pull_policy }}
+        image: {{ .Values.ofagentImage }}
+        imagePullPolicy: {{ .Values.imagePullPolicy }}
         env:
         - name: NAMESPACE
           valueFrom:
diff --git a/voltha/templates/stats.yaml b/voltha/templates/stats.yaml
index a7b9a70..51511a8 100644
--- a/voltha/templates/stats.yaml
+++ b/voltha/templates/stats.yaml
@@ -31,8 +31,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
       - name: dashd
-        image: {{ .Values.pull_docker_registry }}{{ .Values.images.dashd.repository }}:{{ .Values.images.dashd.tag }}
-        imagePullPolicy: {{ .Values.image_pull_policy }}
+        image: {{ .Values.dashdImage }}
+        imagePullPolicy: {{ .Values.imagePullPolicy }}
         env:
         - name: NAMESPACE
           valueFrom:
@@ -64,8 +64,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
       - name: shovel
-        image: {{ .Values.pull_docker_registry }}{{ .Values.images.shovel.repository }}:{{ .Values.images.shovel.tag }}
-        imagePullPolicy: {{ .Values.image_pull_policy }}
+        image: {{ .Values.shovelImage }}
+        imagePullPolicy: {{ .Values.imagePullPolicy }}
         env:
         - name: NAMESPACE
           valueFrom:
diff --git a/voltha/templates/vcli.yaml b/voltha/templates/vcli.yaml
index 5b8fbdb..4a9e9c7 100644
--- a/voltha/templates/vcli.yaml
+++ b/voltha/templates/vcli.yaml
@@ -48,7 +48,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
         - name: vcli
-          image: {{ .Values.pull_docker_registry }}{{ .Values.images.vcli.repository }}:{{ .Values.images.vcli.tag }}
+          image: {{ .Values.vcliImage }}
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           env:
             - name: POD_IP
               valueFrom:
@@ -63,6 +64,5 @@
           ports:
             - containerPort: 22
               name: ssh-port
-          imagePullPolicy: {{ .Values.image_pull_policy }}
 
 
diff --git a/voltha/templates/vcore_for_etcd.yaml b/voltha/templates/vcore_for_etcd.yaml
index b9051ee..7f02fe0 100644
--- a/voltha/templates/vcore_for_etcd.yaml
+++ b/voltha/templates/vcore_for_etcd.yaml
@@ -53,7 +53,8 @@
       serviceAccountName: {{ .Values.global.namespace }}-serviceaccount
       containers:
         - name: voltha
-          image: {{ .Values.pull_docker_registry }}{{ .Values.images.vcore.repository }}:{{ .Values.images.vcore.tag }}
+          image: {{ .Values.vcoreImage }}
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           env:
             - name: NAMESPACE
               valueFrom:
@@ -77,6 +78,5 @@
               name: mystery-port
             - containerPort: 50556
               name: grpc-port
-          imagePullPolicy: {{ .Values.image_pull_policy }}
 
 
diff --git a/voltha/values.yaml b/voltha/values.yaml
index 8939b33..a666ea5 100644
--- a/voltha/values.yaml
+++ b/voltha/values.yaml
@@ -15,7 +15,7 @@
 pull_docker_registry:
 k8s_docker_registry: 'k8s.gcr.io/'
 
-image_pull_policy: IfNotPresent
+imagePullPolicy: IfNotPresent
 
 replicas:
   vcore: 1
@@ -51,41 +51,15 @@
   customResources:
     createEtcdClusterCRD: true
 
-images:
-  consul:
-    repository: consul
-    tag: '0.9.2'
-  envoy_for_etcd:
-    repository: voltha/voltha-envoy
-    tag: 'latest'
-  fluentd:
-    repository: fluentd-gcp
-    tag: '1.30'
-  freeradius:
-    repository: marcelmaatkamp/freeradius
-    tag: 'latest'
-  grafana:
-    repository: kamon/grafana_graphite
-    tag: '3.0'
-  netconf:
-    repository: voltha/voltha-netconf
-    tag: 'latest'
-  ofagent:
-    repository: voltha/voltha-ofagent
-    tag: 'latest'
-  dashd:
-    repository: voltha/voltha-dashd
-    tag: 'latest'
-  shovel:
-    repository: voltha/voltha-shovel
-    tag: 'latest'
-  vcli:
-    repository: voltha/voltha-cli
-    tag: 'latest'
-  vcore:
-    repository: voltha/voltha-voltha
-    tag: 'latest'
-    
+envoyForEtcdImage: 'voltha/voltha-envoy:latest'
+freeradiusImage: 'marcelmaatkamp/freeradius:latest'
+grafanaImage: 'kamon/grafana_graphite:3.0'
+netconfImage: 'voltha/voltha-netconf:latest'
+ofagentImage: 'voltha/voltha-ofagent:latest'
+dashdImage: 'voltha/voltha-dashd:latest'
+shovelImage: 'voltha/voltha-shovel:latest'
+vcliImage: 'voltha/voltha-cli:latest'
+vcoreImage: 'voltha/voltha-voltha:latest'
   
 kafka:
   enabled: true
diff --git a/xos-core/templates/ws-configmap.yaml b/xos-core/requirements.yaml
similarity index 75%
copy from xos-core/templates/ws-configmap.yaml
copy to xos-core/requirements.yaml
index 7dcc72b..f77c942 100644
--- a/xos-core/templates/ws-configmap.yaml
+++ b/xos-core/requirements.yaml
@@ -13,13 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: xos-ws
-  labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
-data:
-  config: |
-{{ include "xos-ws.gateway_config" . | indent 4 }}
+dependencies:
+- name: xos-gui
+  version: 0.1.0
+  repository: file://../xos-gui
+  condition: xos-gui.enabled
 
diff --git a/xos-core/templates/tests/test-xos-core-api.yaml b/xos-core/templates/tests/test-xos-core-api.yaml
index 86ed0a0..24c7a8c 100644
--- a/xos-core/templates/tests/test-xos-core-api.yaml
+++ b/xos-core/templates/tests/test-xos-core-api.yaml
@@ -22,10 +22,14 @@
   annotations:
     "helm.sh/hook": test-success
 spec:
+  restartPolicy: Never
   containers:
     - name: {{ .Release.Name }}-api-test
       image: {{ .Values.xos_api_testerImage }}
       imagePullPolicy: {{ .Values.imagePullPolicy }}
+      volumeMounts:
+        - name: log-volume
+          mountPath: /src/cord-api/Tests/Log/
       env:
         - name: SERVER_IP
           value: 'xos-chameleon'
@@ -38,4 +42,8 @@
         - name: SITE_NAME
           value: {{ .Values.cordSiteName | quote }}
       command: ["pybot", "-L", "TRACE", "-d", "Log", "-T", "Ch_DeploymentTest.txt", "Ch_SiteTest.txt", "Ch_UsersTest.txt", "Ch_SliceTest.txt", "Ch_ServiceTest.txt"]
-  restartPolicy: Never
+  volumes:
+    - name: log-volume
+      hostPath:
+        path: /tmp/helm_test_xos_core_logs_{{ dateInZone "20060102T030405.00Z" (now) "UTC"  }}
+        type: DirectoryOrCreate
diff --git a/xos-core/values.yaml b/xos-core/values.yaml
index b06eb19..66130f5 100644
--- a/xos-core/values.yaml
+++ b/xos-core/values.yaml
@@ -13,15 +13,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+xos_gui:
+  enabled: true
+
 imagePullPolicy: 'IfNotPresent'
 
 # Docker images
 # YAML variable names can't contain `-`, so substituted with `_`
 xos_coreImage: 'xosproject/xos-core:master'
 xos_chameleonImage: 'xosproject/chameleon:master'
-xos_guiImage: 'xosproject/xos-gui:master'
 xos_toscaImage: 'xosproject/xos-tosca:master'
-xos_wsImage: 'xosproject/xos-ws:master'
 xos_api_testerImage: 'xosproject/xos-api-tester:master'
 
 postgresImage: 'postgres:10.3-alpine'
@@ -29,10 +30,8 @@
 redisImage: 'redis:3.2'
 
 # NodePorts
-xos_guiNodePort: 30001
 xos_chameleonNodePort: 30006
 xos_toscaNodePort: 30007
-xos_wsNodePort: 30008
 
 # XOS Admin username/password
 xosAdminUser: 'admin@opencord.org'
diff --git a/xos-gui/.helmignore b/xos-gui/.helmignore
new file mode 100644
index 0000000..f0c1319
--- /dev/null
+++ b/xos-gui/.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/xos-core/templates/ws-configmap.yaml b/xos-gui/Chart.yaml
similarity index 76%
copy from xos-core/templates/ws-configmap.yaml
copy to xos-gui/Chart.yaml
index 7dcc72b..c60ee86 100644
--- a/xos-core/templates/ws-configmap.yaml
+++ b/xos-gui/Chart.yaml
@@ -14,12 +14,8 @@
 # limitations under the License.
 
 apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: xos-ws
-  labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
-data:
-  config: |
-{{ include "xos-ws.gateway_config" . | indent 4 }}
+appVersion: "1.0"
+description: Web GUI for XOS
+name: xos-gui
+version: 0.1.0
 
diff --git a/xos-core/templates/_gui.tpl b/xos-gui/templates/_helpers.tpl
similarity index 81%
rename from xos-core/templates/_gui.tpl
rename to xos-gui/templates/_helpers.tpl
index 8939554..37909bc 100644
--- a/xos-core/templates/_gui.tpl
+++ b/xos-gui/templates/_helpers.tpl
@@ -14,6 +14,14 @@
 limitations under the License.
 */ -}}
 
+{{- define "xos-gui.release_labels" }}
+app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }}
+chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+release: {{ .Release.Name }}
+heritage: {{ .Release.Service }}
+version: {{ .Chart.Version }}
+{{- end }}
+
 {{- define "xos-gui.app_config" }}
 angular.module('app')
 .constant('AppConfig', {
diff --git a/xos-core/templates/_ws.tpl b/xos-gui/templates/_ws.tpl
similarity index 100%
rename from xos-core/templates/_ws.tpl
rename to xos-gui/templates/_ws.tpl
diff --git a/xos-core/templates/gui-configmap.yaml b/xos-gui/templates/gui-configmap.yaml
similarity index 88%
rename from xos-core/templates/gui-configmap.yaml
rename to xos-gui/templates/gui-configmap.yaml
index 273e001..0e4a5c5 100644
--- a/xos-core/templates/gui-configmap.yaml
+++ b/xos-gui/templates/gui-configmap.yaml
@@ -18,7 +18,7 @@
 metadata:
   name: gui-app-config
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 data:
   config: |
 {{ include "xos-gui.app_config" . | indent 4 }}
@@ -31,7 +31,7 @@
 metadata:
   name: gui-style-config
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 data:
   config: |
 {{ include "xos-gui.style_config" . | indent 4 }}
diff --git a/xos-core/templates/gui-deployment.yaml b/xos-gui/templates/gui-deployment.yaml
similarity index 96%
rename from xos-core/templates/gui-deployment.yaml
rename to xos-gui/templates/gui-deployment.yaml
index 4faecdf..c00e073 100644
--- a/xos-core/templates/gui-deployment.yaml
+++ b/xos-gui/templates/gui-deployment.yaml
@@ -18,7 +18,7 @@
 metadata:
   name: xos-gui
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 spec:
   replicas: 1
   template:
diff --git a/xos-core/templates/gui-service.yaml b/xos-gui/templates/gui-service.yaml
similarity index 93%
rename from xos-core/templates/gui-service.yaml
rename to xos-gui/templates/gui-service.yaml
index 56aabb3..2504f58 100644
--- a/xos-core/templates/gui-service.yaml
+++ b/xos-gui/templates/gui-service.yaml
@@ -18,7 +18,7 @@
 metadata:
   name: "xos-gui"
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 spec:
   type: NodePort
   ports:
diff --git a/xos-core/templates/ws-configmap.yaml b/xos-gui/templates/ws-configmap.yaml
similarity index 92%
rename from xos-core/templates/ws-configmap.yaml
rename to xos-gui/templates/ws-configmap.yaml
index 7dcc72b..f2caa68 100644
--- a/xos-core/templates/ws-configmap.yaml
+++ b/xos-gui/templates/ws-configmap.yaml
@@ -18,7 +18,7 @@
 metadata:
   name: xos-ws
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 data:
   config: |
 {{ include "xos-ws.gateway_config" . | indent 4 }}
diff --git a/xos-core/templates/ws-deployment.yaml b/xos-gui/templates/ws-deployment.yaml
similarity index 95%
rename from xos-core/templates/ws-deployment.yaml
rename to xos-gui/templates/ws-deployment.yaml
index 5f4cad4..9d958bb 100644
--- a/xos-core/templates/ws-deployment.yaml
+++ b/xos-gui/templates/ws-deployment.yaml
@@ -18,7 +18,7 @@
 metadata:
   name: xos-ws
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 spec:
   replicas: 1
   template:
diff --git a/xos-core/templates/ws-service.yaml b/xos-gui/templates/ws-service.yaml
similarity index 93%
rename from xos-core/templates/ws-service.yaml
rename to xos-gui/templates/ws-service.yaml
index 86912d1..41c1a07 100644
--- a/xos-core/templates/ws-service.yaml
+++ b/xos-gui/templates/ws-service.yaml
@@ -18,7 +18,7 @@
 metadata:
   name: "xos-ws"
   labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
+    {{- include "xos-gui.release_labels" . | indent 4 }}
 spec:
   type: NodePort
   ports:
diff --git a/xos-core/templates/ws-configmap.yaml b/xos-gui/values.yaml
similarity index 75%
copy from xos-core/templates/ws-configmap.yaml
copy to xos-gui/values.yaml
index 7dcc72b..3449931 100644
--- a/xos-core/templates/ws-configmap.yaml
+++ b/xos-gui/values.yaml
@@ -13,13 +13,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: xos-ws
-  labels:
-    {{- include "xos-core.release_labels" . | indent 4 }}
-data:
-  config: |
-{{ include "xos-ws.gateway_config" . | indent 4 }}
+imagePullPolicy: 'IfNotPresent'
+
+# Docker Images
+xos_guiImage: 'xosproject/xos-gui:master'
+xos_wsImage: 'xosproject/xos-ws:master'
+
+# NodePorts
+xos_guiNodePort: 30001
+xos_wsNodePort: 30008
 
diff --git a/xos-profiles/rcord-lite/values.yaml b/xos-profiles/rcord-lite/values.yaml
index 9dedb60..7367f04 100644
--- a/xos-profiles/rcord-lite/values.yaml
+++ b/xos-profiles/rcord-lite/values.yaml
@@ -231,10 +231,12 @@
           type: tosca.nodes.VOLTService
           properties:
             name: volt
-            voltha_url: voltha.voltha.svc.cluster.local:8882
-            p_onos_url: onos-voltha-ui.voltha.svc.cluster.local:8181
-            p_onos_user: karaf
-            p_onos_pass: karaf
+            voltha_url: voltha.voltha.svc.cluster.local
+            voltha_port: 8882
+            onos_voltha_url: onos-voltha-ui.voltha.svc.cluster.local
+            onos_voltha_port: 8181
+            onos_voltha_user: karaf
+            onos_voltha_pass: karaf
         service#vsg-hw:
           type: tosca.nodes.VSGHWService
           properties:
diff --git a/xos-tools/xossh/README.md b/xos-tools/xossh/README.md
index 95358d3..9d08a67 100644
--- a/xos-tools/xossh/README.md
+++ b/xos-tools/xossh/README.md
@@ -7,3 +7,9 @@
 # wait a few seconds for the container to start, then run the following
 xos-tools/xossh/xossh-attach.sh
 ```
+
+To deploy a development version of `xossh` tagged with the `candidate` tag, you can do:
+
+```
+helm install xos-tools/xossh/ -n xossh -f examples/xossh-candidate.yaml
+```
diff --git a/xos-tools/xossh/templates/deployment.yaml b/xos-tools/xossh/templates/deployment.yaml
index 242e302..8859f74 100644
--- a/xos-tools/xossh/templates/deployment.yaml
+++ b/xos-tools/xossh/templates/deployment.yaml
@@ -46,8 +46,8 @@
                - "{{ .Values.xosshConfig.accessor.endpoint }}"
           stdin: true
           tty: true
-          image: "{{ .Values.pull_docker_registry }}{{ .Values.image.repository }}:{{ .Values.image.tag }}"
-          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          image: "{{ .Values.xosshImage }}"
+          imagePullPolicy: {{ .Values.imagePullPolicy }}
           resources:
 {{ toYaml .Values.resources | indent 12 }}
           volumeMounts:
diff --git a/xos-tools/xossh/values.yaml b/xos-tools/xossh/values.yaml
index 9fcdf22..6ed3137 100644
--- a/xos-tools/xossh/values.yaml
+++ b/xos-tools/xossh/values.yaml
@@ -25,10 +25,9 @@
 nameOverride: ""
 fullnameOverride: ""
 
-image:
-  repository: xosproject/xos-client
-  tag: candidate
-  pullPolicy: IfNotPresent
+imagePullPolicy: IfNotPresent
+
+xosshImage: 'xosproject/xos-client:master'
 
 resources: {}