This is an automated email from the ASF dual-hosted git repository.

dgrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwhisk-deploy-kube.git


The following commit(s) were added to refs/heads/master by this push:
     new 6849288  Upgrade to Helm3 (#572)
6849288 is described below

commit 6849288f41cf9673a721ffffb82ac8b698f67ba9
Author: David Grove <[email protected]>
AuthorDate: Mon Feb 24 10:15:01 2020 -0500

    Upgrade to Helm3 (#572)
    
    OpenWhisk Helm chart now requires Helm3.
    + update documentation
    + update chart version
    + added values.schema.json to enforce typing constraints on values.yaml
    + misc small fixes found by better validation in Helm 3
---
 README.md                           |   80 +-
 docs/helm.md                        |   56 --
 docs/k8s-docker-for-windows.md      |   14 +-
 docs/k8s-nfs-dynamic-storage.md     |    9 +-
 docs/okd-311.md                     |    5 +-
 helm/openwhisk/Chart.yaml           |   11 +-
 helm/openwhisk/values-metadata.yaml | 1790 -----------------------------------
 helm/openwhisk/values.schema.json   |  524 ++++++++++
 helm/openwhisk/values.yaml          |    6 +-
 9 files changed, 570 insertions(+), 1925 deletions(-)

diff --git a/README.md b/README.md
index c8e78ee..62a55b6 100644
--- a/README.md
+++ b/README.md
@@ -127,41 +127,26 @@ least 1 worker node with 4GB of memory and 2 virtual CPUs 
to deploy
 the default configuration of OpenWhisk.  You can deploy to
 significantly larger clusters by scaling up the replica count of the
 various components and labeling multiple nodes as invoker nodes.
-There are some additional notes [here](docs/k8s-diy.md).
-
-[Here](docs/k8s-diy-ubuntu.md) a Kubernetes cluster example using kubeadm and 
Ubuntu 18.04.
 
+Additional more detailed instructions:
+* [Some general comments](docs/k8s-diy.md).
+* [Using kubeadm on Ubuntu 18.04](docs/k8s-diy-ubuntu.md).
 
 ## Helm
 
 [Helm](https://github.com/kubernetes/helm) is a tool to simplify the
-deployment and management of applications on Kubernetes clusters. Helm
-consists of the `helm` command line tool that you install on your
-development machine and the `tiller` runtime that is deployed on your
-Kubernetes cluster.
-
-For details on installing Helm, see these [instructions](docs/helm.md).
+deployment and management of applications on Kubernetes clusters.
+The OpenWhisk Helm chart requires the Helm 3.
 
-WARNING: There is a [serious regression in Helm 
v2.15.0](https://github.com/helm/helm/issues/6708)
-that impacts the OpenWhisk chart.  You should use Helm v2.14.3.
+Our automated testing currently uses Helm v3.0.1.
 
-In short if you already have the `helm` cli installed on your development 
machine,
-you will need to execute these two commands and wait a few seconds for the
-`tiller-deploy` pod in the `kube-system` namespace to be in the `Running` 
state.
-```shell
-helm init
-kubectl create clusterrolebinding tiller-cluster-admin 
--clusterrole=cluster-admin --serviceaccount=kube-system:default
-```
-
-If you are targeting an OKD/OpenShift cluster, you will need the
-`helm` cli on your development machine but will not run the
-`tiller-deploy` pod in the cluster as it is not allowed by
-OKD/OpenShift security policies.
+Follow the Helm [install instructions](https://github.com/kubernetes/helm)
+for your platform to install Helm v3.0.1 or newer.
 
 # Deploying OpenWhisk
 
-Now that you have your Kubernetes cluster and have installed and
-initialized Helm, you are ready to deploy OpenWhisk.
+Now that you have your Kubernetes cluster and have installed
+the Helm 3 CLI, you are ready to deploy OpenWhisk.
 
 ## Overview
 
@@ -240,25 +225,27 @@ discussion of the primary options.
 
 ## Deploy With Helm
 
+For simplicity, in this README, we have used `owdev` as the release name and
+`openwhisk` as the namespace into which the Chart's resources will be deployed.
+You can use a different name and/or namespace simply by changing the commands
+used below.
+
 Deployment can be done by using the following single command:
 ```shell
-helm install ./helm/openwhisk --namespace=openwhisk --name=owdev -f 
mycluster.yaml
+helm install owdev ./helm/openwhisk -n openwhisk -f mycluster.yaml
 ```
 
-Deploying to OKD/OpenShift uses the commands:
+Deploying to OKD/OpenShift uses the command sequence:
 ```shell
-helm template ./helm/openwhisk --namespace=openwhisk --name=owdev -f 
mycluster.yaml > owdev.yaml
+helm template owdev ./helm/openwhisk -n openwhisk -f mycluster.yaml > 
owdev.yaml
 oc create -f owdev.yaml
 ```
-We recommend generating to a file to make it easier to undeploy openwhisk later
+The two step sequence is currently required because the `oc` command must be
+used to create the `Route` resource specified in the generated `owdev.yaml`.
+We recommend generating to a file to make it easier to undeploy OpenWhisk later
 by simply doing `oc delete -f owdev.yaml`
 
-For simplicity, in this README, we have used `owdev` as the release name and
-`openwhisk` as the namespace into which the Chart's resources will be deployed.
-You can use different names, or not specify a release name at all and let
-Helm auto-generate one for you.
-
-You can use the command `helm status owdev` to get a summary
+You can use the command `helm status owdev -n openwhisk` to get a summary
 of the various Kubernetes artifacts that make up your OpenWhisk
 deployment. Once the `install-packages` Pod is in the `Completed` state,
 your OpenWhisk deployment is ready to be used.
@@ -294,10 +281,8 @@ Your OpenWhisk installation should now be usable.  You can 
test it by following
 [these 
instructions](https://github.com/apache/openwhisk/blob/master/docs/actions.md)
 to define and invoke a sample OpenWhisk action in your favorite programming 
language.
 
-You can also issue the command `helm test owdev` to run the basic
-verification test suite included in the OpenWhisk Helm chart. Note
-that `helm test` is not supported for OpenShift deployments because it
-requires the `tiller` pod to be run in the cluster.
+You can also issue the command `helm test owdev -n openwhisk` to run the basic
+verification test suite included in the OpenWhisk Helm chart.
 
 Note: if you installed self-signed certificates, which is the default
 for the OpenWhisk Helm chart, you will need to use `wsk -i` to
@@ -402,7 +387,7 @@ controller:
 Redeploy with Helm by executing this commaned in your
 openwhisk-deploy-kube directory:
 ```shell
-helm upgrade ./helm/openwhisk --namespace=openwhisk --name=owdev -f 
mycluster.yaml
+helm upgrade owdev ./helm/openwhisk -n openwhisk -f mycluster.yaml
 ```
 
 ### Deploying Lean Openwhisk version.
@@ -417,17 +402,14 @@ controller:
 
 Use the following command to remove all the deployed OpenWhisk components:
 ```shell
-helm delete owdev
-```
-Helm does keep a history of previous deployments.  If you want to
-completely remove the deployment from helm, for example so you can
-reuse owdev to deploy OpenWhisk again, use the command:
-```shell
-helm delete owdev --purge
+helm uninstall owdev -n openwhisk
 ```
+By default, `helm uninstall` removes the history of previous deployments.
+If you want to keep the history, add the command line flag `--keep-history`.
 
-For OpenShift deployments, you cannot use Helm to remove the OpenWhisk
-deployment.  If you saved the output from `helm template` into a file,
+For OpenShift deployments, you cannot use `helm uninstall` to remove the 
OpenWhisk
+deployment because we did not do a `helm install`.
+If you saved the output from `helm template` into a file,
 you can simply use that file as an argument to `oc delete`.  If you
 did not save the file, you can redo the `helm template` command and
 feed the generated yaml into an `oc delete` command.
diff --git a/docs/helm.md b/docs/helm.md
deleted file mode 100644
index 5d42ee3..0000000
--- a/docs/helm.md
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
--->
-
-## Installing Helm
-
-[Helm](https://github.com/kubernetes/helm) is a tool to simplify the
-deployment and management of applications on Kubernetes clusters.  We
-will use Helm to deploy OpenWhisk on Kubernetes.
-
-Before you can use Helm, you need to do a small amount of one-time
-setup on your Kubernetes cluster.
-
-1. Make sure that you have a running Kubernetes cluster and a
-`kubectl` client connected to this cluster as described in the
-[Requirements section](../README.md#requirements) of the main
-README.md.
-
-2. Follow the Helm [install instructions](https://github.com/kubernetes/helm)
-for your platform to install Helm v2.14.3.
-
-WARNING: There is a [serious regression in Helm 
v2.15.0](https://github.com/helm/helm/issues/6708)
-that impacts the OpenWhisk chart.  You cannout use versions of Helm newer than 
v2.14.3 until
-a there is a 2.15.x release with a fix for the regression.
-
-3. Run the following command to init `Helm Tiller`:
-```shell
-helm init
-```
-
-4. To see if Helm is ready, use the command below and make sure the
-`tiller-deploy` pod is in the `Running` state.
-```shell
-kubectl get pods -n kube-system
-```
-
-5. Grant the necessary privileges to the `Helm` user:
-```shell
-kubectl create clusterrolebinding tiller-cluster-admin 
--clusterrole=cluster-admin --serviceaccount=kube-system:default
-```
-
diff --git a/docs/k8s-docker-for-windows.md b/docs/k8s-docker-for-windows.md
index d83ffaa..8fbf06d 100644
--- a/docs/k8s-docker-for-windows.md
+++ b/docs/k8s-docker-for-windows.md
@@ -77,29 +77,21 @@ nginx:
 
 ### Using helm to install OpenWhisk
 
-Execute these two commands and wait a few seconds for the tiller-deploy pod
-in the kube-system namespace to be in the Running state:
-
-```cmd
-helm init
-kubectl create clusterrolebinding tiller-cluster-admin 
--clusterrole=cluster-admin --serviceaccount=kube-system:default
-```
-
 Indicate the Kubernetes worker nodes that should be used to execute user
 containers by OpenWhisk's invokers. For a single node development cluster,
 simply run:
 
 `kubectl label nodes --all openwhisk-role=invoker`
 
-Now you're ready to run helm to set up OpenWhisk. Make sure you created your
+Make sure you created your
 `mycluster.yaml` file as described above, and run:
 
 ```cmd
 cd openwhisk-deploy-kube
-helm install ./helm/openwhisk --namespace=openwhisk --name=owdev -f 
mycluster.yaml
+helm install owdev ./helm/openwhisk -n openwhisk -f mycluster.yaml
 ```
 
-You can use the command `helm status owdev` to get a summary of the various
+You can use the command `helm status owdev -n openwhisk` to get a summary of 
the various
 Kubernetes artifacts that make up your OpenWhisk deployment. Once the
 `install-packages` Pod is in the Completed state, your OpenWhisk deployment
 is ready to be used.
diff --git a/docs/k8s-nfs-dynamic-storage.md b/docs/k8s-nfs-dynamic-storage.md
index 67a4a4a..e536180 100644
--- a/docs/k8s-nfs-dynamic-storage.md
+++ b/docs/k8s-nfs-dynamic-storage.md
@@ -89,14 +89,7 @@ storageClass:
   reclaimPolicy: Delete
 ```
 
-With Helm 2, run the command to install it:
-```
-helm install --name your-ow-release-name --namespace openwhisk \
-  --values ./openwhisk-nfs-client-provisioner.yaml \
-  stable/nfs-client-provisioner
-```
-
-Or if you're using Helm 3:
+Using Helm 3, run this command to install it:
 ```
 helm install your-ow-release-name --namespace openwhisk \
   stable/nfs-client-provisioner \
diff --git a/docs/okd-311.md b/docs/okd-311.md
index b8c9868..c2467a8 100644
--- a/docs/okd-311.md
+++ b/docs/okd-311.md
@@ -73,6 +73,5 @@ set the resolver in `nginx-cm.yaml`).  As a result, the 
namespace
 prefixed 'vanity url' rewriting routes and the download of the cli/SDK
 binaries is not currently supported when deploying on OpenShift.
 
-Smoketesting a deployment via `helm test` is not supported because it
-relies on `tiller` (the server side component of Helm) and OpenShift
-forbids the use of the server-side components of Helm.
+Smoketesting a deployment via `helm test` is not supported because
+we did not use `helm install` to deploy the chart.
diff --git a/helm/openwhisk/Chart.yaml b/helm/openwhisk/Chart.yaml
index 8435a3f..7e99922 100644
--- a/helm/openwhisk/Chart.yaml
+++ b/helm/openwhisk/Chart.yaml
@@ -15,16 +15,17 @@
 # limitations under the License.
 #
 
-apiVersion: v1
-description: An open source, distributed serverless platform that executes 
functions in response to events at any scale
+apiVersion: v2
+type: application
 name: openwhisk
-version: 0.1.11
+version: 0.2.0
+home: https://openwhisk.apache.org
+description: Apache OpenWhisk is an open source serverless cloud platform
 icon: 
https://raw.githubusercontent.com/apache/openwhisk/682eb5b62ee6ba8017ab54226c2ace3637f4f1ec/docs/images/whisk_icon_full-color_with_tm_64x64-300dpi.png
 keywords:
   - Apache OpenWhisk
   - amd64
 maintainers:
-  - name: Apache OpenWhisk committers
+  - name: Apache OpenWhisk Community
     email: [email protected]
-tillerVersion: ">=2.9.0"
 kubeVersion: ">=v1.10.0-r0"
diff --git a/helm/openwhisk/values-metadata.yaml 
b/helm/openwhisk/values-metadata.yaml
deleted file mode 100644
index 91651d7..0000000
--- a/helm/openwhisk/values-metadata.yaml
+++ /dev/null
@@ -1,1790 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-
-
-## Metadata for OpenWhisk configuration
-## This describes values that are defined in values.yaml for Helm chart
-
-## apiHostName configuration metadata
-whisk:
-  __metadata:
-    label: "General OpenWhisk configuration"
-    description: "System-wide configuration parameters for your OpenWhisk 
deployment"
-  ingress:
-    apiHostName:
-      __metadata:
-        label: "API host name"
-        description: "The external hostname or IP address used to access the 
Ingress of your Kubernetes cluster"
-        type: "string"
-        required: true
-    apiHostPort:
-      __metadata:
-        label: "API host port"
-        description: "The external port used to access the Ingress of your 
Kubernetes cluster"
-        type: "string"
-        required: true
-    apiHostProto:
-      __metadata:
-        label: "API host protocol"
-        description: "The protocol to be used to connect to the Ingress of 
your Kubernetes cluster"
-        type: "string"
-        required: true
-        options:
-        - label: "http"
-          value: "http"
-        - label: "https"
-          value: "https"
-    type:
-      __metadata:
-        label: "Ingress type"
-        description: "The type of Ingress being deployed (NodePort, 
LoadBalancer, Standard)"
-        type: "string"
-        required: true
-        options:
-        - label: "NodePort"
-          value: "NodePort"
-        - label: "LoadBalancer"
-          value: "LoadBalancer"
-        - label: "Standard"
-          value: "Standard"
-    annotations:
-      __metadata:
-        label: "Ingress Annotations"
-        description: "Annotations to add to Ingress resource. Specify as a 
list of key: value pairs"
-        type: "string"
-        multiline: true
-        required: false
-    domain:
-      __metadata:
-        label: "Ingress Domain"
-        description: "The Fully Qualified Host Name for the Ingress domain"
-        type: "string"
-        required: true
-    tls:
-      enabled:
-        __metadata:
-          label: "TLS enabled"
-          description: "If TLS is enabled for the Ingress"
-          type: "boolean"
-          required: true
-      secretenabled:
-        __metadata:
-          label: "Secret enabled"
-          description: "If TLS secret is enabled for the Ingress"
-          type: "boolean"
-          required: true
-      createsecret:
-        __metadata:
-          label: "Create secret"
-          description: "If the Ingress TLS secret should be auto-created when 
chart is deployed"
-          type: "boolean"
-          required: true
-      secretname:
-        __metadata:
-          label: "TLS Secret name"
-          description: "The name of the Ingress TLS secret"
-          type: "string"
-          required: true
-      secrettype:
-        __metadata:
-          label: "TLS Secret type"
-          description: "The type of the Ingress TLS secret"
-          type: "string"
-          required: true
-      crt:
-        __metadata:
-          label: "TLS crt"
-          description: "The TLS certificate for the Ingress"
-          type: "string"
-          required: true
-      key:
-        __metadata:
-          label: "TLS Key"
-          description: "The TLS key for the Ingress"
-          type: "string"
-          required: true
-  auth:
-    system:
-      __metadata:
-        label: "System auth"
-        description: "The auth secret for the system namespace"
-        type: "string"
-        required: true
-    guest:
-      __metadata:
-        label: "Guest auth"
-        description: "The auth secret for the guest namespace"
-        type: "string"
-        required: true
-  systemNameSpace:
-    __metadata:
-      label: "System namespace"
-      description: "The namespace in which to install OpenWhisk system actions 
and packages"
-      type: "string"
-      required: true
-  limits:
-    actionsInvokesPerminute:
-      __metadata:
-        label: "Maximum actions invoked per minute"
-        description: "The maximum number of action invocations per minute by a 
single namespace"
-        type: "number"
-        required: true
-    actionsInvokesConcurrent:
-      __metadata:
-        label: "Maximum concurrent action invocations"
-        description: "The maximum number of concurrent action invocations by a 
single namespace"
-        type: "number"
-        required: true
-    triggersFiresPerminute:
-      __metadata:
-        label: "Maximum triggers fired per minute"
-        description: "The maximum triggers fired per minute for a single 
namespace"
-        type: "number"
-        required: true
-    actionsSequenceMaxlength:
-      __metadata:
-        label: "Maximum length of action sequence"
-        description: "The maximum length of an action sequence"
-        type: "number"
-        required: true
-    actions:
-      time:
-        min:
-          __metadata:
-            label: "Minimum action time"
-            description: "The minimum billing granularity for action execution 
time"
-            type: "string"
-            required: true
-        max:
-          __metadata:
-            label: "Maximum action time"
-            description: "The maximum allowed execution time for any action"
-            type: "string"
-            required: true
-        std:
-          __metadata:
-            label: "Standard action time"
-            description: "The default maximum execution time for an action"
-            type: "string"
-            required: true
-      memory:
-        min:
-          __metadata:
-            label: "Minimum action memory"
-            description: "The minimum memory allocation for an action"
-            type: "string"
-            required: true
-        max:
-          __metadata:
-            label: "Maximum action memory"
-            description: "The maximum allowed memory allocation for an action"
-            type: "string"
-            required: true
-        std:
-          __metadata:
-            label: "Standard action memory"
-            description: "The default memory allocation for an action"
-            type: "string"
-            required: true
-      concurrency:
-        min:
-          __metadata:
-            label: "Minimum action concurrency"
-            description: "The minimum number of concurrent requests supported 
by a single action container"
-            type: "number"
-            required: true
-        max:
-          __metadata:
-            label: "Maximum action concurrency"
-            description: "The maximum number of concurrent requests supported 
by a single action container"
-            type: "number"
-            required: true
-        std:
-          __metadata:
-            label: "Standard action concurrency"
-            description: "The default number of concurrent requests supported 
by a single action container"
-            type: "number"
-            required: true
-      log:
-        min:
-          __metadata:
-            label: "Mimimum action log size"
-            description: "The mimimum log size for an action invocation"
-            type: "string"
-            required: true
-        max:
-          __metadata:
-            label: "Maximum action log size"
-            description: "The maximum allowed log size for an action 
invocation"
-            type: "string"
-            required: true
-        std:
-          __metadata:
-            label: "Standard action log size"
-            description: "The default allowed log size for an action 
invocation"
-            type: "string"
-            required: true
-    activation:
-      payload:
-        max:
-          __metadata:
-            label: "Maximum activation payload"
-            description: "The maximum size of an activation payload"
-            type: "string"
-            required: true
-  loadbalancer:
-    blackboxFraction:
-      __metadata:
-        label: "Loadbalancer blackbox fraction"
-        description: "The fraction of invokers reserved to execute blackbox 
actions"
-        type: "string"
-        required: true
-    timeoutFactor:
-      __metadata:
-        label: "Loadbalancer timeout factor"
-        description: "The loadbalancer's timeout factor"
-        type: "number"
-        required: true
-  kafka:
-    replicationFactor:
-      __metadata:
-        label: "Kafka topic replication factor"
-        description: "The replication factor for all Kafka topics"
-        type: "string"
-        required: false
-    topics:
-      cacheInvalidation:
-        segmentBytes:
-          __metadata:
-            label: "cacheInvalidation segment bytes"
-            description: "Kafka topic configuration: the cacheInvalidation 
topic's segment bytes"
-            type: "string"
-            required: false
-        retentionBytes:
-          __metadata:
-            label: "cacheInvalidation retention bytes"
-            description: "Kafka topic configuration: the cacheInvalidation 
topic's retention bytes"
-            type: "string"
-            required: false
-        retentionMs:
-          __metadata:
-            label: "cacheInvalidation retention ms"
-            description: "Kafka topic configuration: the cacheInvalidation 
topic's retention ms"
-            type: "string"
-            required: false
-      completed:
-        segmentBytes:
-          __metadata:
-            label: "completed segment bytes"
-            description: "Kafka topic configuration: the completed topic's 
segment bytes"
-            type: "string"
-            required: false
-        retentionBytes:
-          __metadata:
-            label: "completed retention bytes"
-            description: "Kafka topic configuration: the completed topic's 
retention bytes"
-            type: "string"
-            required: false
-        retentionMs:
-          __metadata:
-            label: "completed retention ms"
-            description: "Kafka topic configuration: the completed topic's 
retention ms"
-            type: "string"
-            required: false
-      events:
-        segmentBytes:
-          __metadata:
-            label: "events segment bytes"
-            description: "Kafka topic configuration: the events topic's 
segment bytes"
-            type: "string"
-            required: false
-        retentionBytes:
-          __metadata:
-            label: "events retention bytes"
-            description: "Kafka topic configuration: the events topic's 
retention bytes"
-            type: "string"
-            required: false
-        retentionMs:
-          __metadata:
-            label: "events retention ms"
-            description: "Kafka topic configuration: the events topic's 
retention ms"
-            type: "string"
-            required: false
-      health:
-        segmentBytes:
-          __metadata:
-            label: "health segment bytes"
-            description: "Kafka topic configuration: the health topic's 
segment bytes"
-            type: "string"
-            required: false
-        retentionBytes:
-          __metadata:
-            label: "health retention bytes"
-            description: "Kafka topic configuration: the health topic's 
retention bytes"
-            type: "string"
-            required: false
-        retentionMs:
-          __metadata:
-            label: "health retention ms"
-            description: "Kafka topic configuration: the health topic's 
retention ms"
-            type: "string"
-            required: false
-      invoker:
-        segmentBytes:
-          __metadata:
-            label: "invoker segment bytes"
-            description: "Kafka topic configuration: the invoker-N topic's 
segment bytes"
-            type: "string"
-            required: false
-        retentionBytes:
-          __metadata:
-            label: "invoker retention bytes"
-            description: "Kafka topic configuration: the invoker-N topic's 
retention bytes"
-            type: "string"
-            required: false
-        retentionMs:
-          __metadata:
-            label: "invoker retention ms"
-            description: "Kafka topic configuration: the invoker-N topic's 
retention ms"
-            type: "string"
-            required: false
-  containerPool:
-    userMemory:
-      __metadata:
-        label: "Comtainerpool user memory"
-        description: "The total memory available to a single Invoker for 
executing user actions"
-        type: "string"
-        required: true
-  runtimes:
-    __metadata:
-      label: "Runtimes"
-      description: "The JSON file containing the runtimes manifest for this 
deployment"
-      type: "string"
-      required: true
-  testing:
-    includeTests:
-      __metadata:
-        label: "Include basic tests"
-        description: "If basic tests should be included in the Helm test suite"
-        type: "boolean"
-        required: true
-    includeSystemTests:
-      __metadata:
-        label: "Include system tests"
-        description: "If systems tests should be included in the Helm test 
suite"
-        type: "boolean"
-        required: true
-  versions:
-    openwhisk:
-      buildDate:
-        __metadata:
-          label: "OpenWhisk build date"
-          description: "The OpenWhisk build date"
-          type: "string"
-          required: true
-      buildNo:
-        __metadata:
-          label: "OpenWhisk build number"
-          description: "The OpenWhisk build number"
-          type: "string"
-          required: true
-      gitTag:
-        __metadata:
-          label: "OpenWhisk git tag"
-          description: "The git tag for openwhisk"
-          type: "string"
-          required: true
-    openwhiskCli:
-      tag:
-        __metadata:
-          label: "CLI tag"
-          description: "The git tag for openwhisk-cli"
-          type: "string"
-          required: true
-    openwhiskCatalog:
-      gitTag:
-        __metadata:
-          label: "Catalog git tag"
-          description: "The git tag for openwhisk-catalog"
-          type: "string"
-          required: true
-    openwhiskPackageAlarms:
-      gitTag:
-        __metadata:
-          label: "Alarms git tag"
-          description: "The git tag for openwhisk-package-alarms"
-          type: "string"
-          required: true
-    openwhiskPackageCloudant:
-      gitTag:
-        __metadata:
-          label: "Cloudant git tag"
-          description: "The git tag for openwhisk-package-cloudant"
-          type: "string"
-          required: true
-    openwhiskPackageKafka:
-      gitTag:
-        __metadata:
-          label: "Kafka git tag"
-          description: "The git tag for openwhisk-package-kafka"
-          type: "string"
-          required: true
-
-k8s:
-  __metadata:
-    label: "Kubernetes configuration"
-    description: "Configuration values to describe your Kubernetes cluster"
-  domain:
-    __metadata:
-      label: "Domain"
-      description: "The DNS suffix for services in your cluster (eg. 
\"cluster.local\")"
-      type: "string"
-      required: true
-  dns:
-    __metadata:
-      label: "Kubernetes DNS service"
-      description: "The name of your cluster's DNS service"
-      type: "string"
-      required: true
-  persistence:
-    enabled:
-      __metadata:
-        label: "Persistence enabled"
-        description: "If persistence should be enabled"
-        type: "boolean"
-        required: true
-    hasDefaultStorageClass:
-      __metadata:
-        label: "Has default storage class"
-        description: "If your cluster has a default storage class configured"
-        type: "boolean"
-        required: true
-    explicitStorageClass:
-      __metadata:
-        label: "Explicit storage class"
-        description: "The name of the StorageClass to use if not using the 
default StorageClass"
-        type: "string"
-        required: false
-
-utility:
-  __metadata:
-    label: "Utility configuration"
-    description: "Update these default values to configure utility images"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The name of the OpenWhisk utility image"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The tag of the OpenWhisk utility image"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-
-docker:
-  __metadata:
-    label: "Docker Registry configuration"
-    description: "Change these default values to configure the Docker Registry"
-  registry:
-    name:
-      __metadata:
-        label: "Docker Registry name"
-        description: "The Docker Registry name"
-        type: "string"
-        required: false
-    username:
-      __metadata:
-        label: "Docker Registry username"
-        description: "The username for the Docker Registry"
-        type: "string"
-        required: false
-    password:
-      __metadata:
-        label: "Docker Registry password"
-        description: "The password for the Docker Registry"
-        type: "password"
-        required: false
-  timezone:
-    __metadata:
-      label: "Timezone"
-      description: "The timezone to use when performing Docker operations"
-      type: "string"
-      required: false
-
-zookeeper:
-  __metadata:
-    label: "Zookeeper configuration"
-    description: "Update these default values to customize the Zookeeper 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "Number of zookeeper instances to deploy; must be an odd 
number."
-      type: "number"
-      required: true
-      options:
-      - label: "1"
-        value: "1"
-      - label: "3"
-        value: "3"
-      - label: "5"
-        value: "5"
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for zookeeper pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "Port"
-      description: "The primary zookeeper port"
-      type: "string"
-      required: true
-  serverPort:
-    __metadata:
-      label: "Server port"
-      description: "The zookeeper server port"
-      type: "string"
-      required: true
-  leaderElectionPort:
-    __metadata:
-      label: "Leader election port"
-      description: "The zookeeper leader election port"
-      type: "string"
-      required: true
-  persistence:
-    size:
-      __metadata:
-        label: "Size"
-        description: "The persistent volume size"
-        type: "string"
-        required: true
-  config:
-    tickTime:
-      __metadata:
-        label: "Tick time"
-        description: "Zookeeper configuration: Tick time"
-        type: "number"
-        required: true
-    initLimit:
-      __metadata:
-        label: "Init limit"
-        description: "Zookeeper configuration: Init limit"
-        type: "number"
-        required: true
-    syncLimit:
-      __metadata:
-        label: "Sync limit"
-        description: "Zookeeper configuration: Sync limit"
-        type: "number"
-        required: true
-    dataDir:
-      __metadata:
-        label: "Data directory"
-        description: "Zookeeper configuration: Data directory"
-        type: "string"
-        required: true
-    dataLogDir:
-      __metadata:
-        label: "Data log directory"
-        description: "Zookeeper configuration: Data log directory"
-        type: "string"
-        required: true
-
-kafka:
-  __metadata:
-    label: "Kafka configuration"
-    description: "Update these default values to customize the Kafka 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "Number of Kafka instances to deploy. Currently must be 1"
-      type: "number"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for Kafka pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "Port"
-      description: "The primary kafka port"
-      type: "string"
-      required: true
-  persistence:
-    size:
-      __metadata:
-        label: "Size"
-        description: "The size of the Kafka persistent volume"
-        type: "string"
-        required: true
-
-db:
-  __metadata:
-    label: "Database configuration"
-    description: "Update these default values to customize the CouchDB 
deployment"
-  external:
-    __metadata:
-      label: "External"
-      description: "If using an externally deployed CouchDB"
-      type: "boolean"
-      required: true
-  wipeAndInit:
-    __metadata:
-      label: "wipe and initialise"
-      description: "If the database should be wiped and initialised when 
OpenWhisk is deployed"
-      type: "boolean"
-      required: true
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "Number of database instances to deploy. Currently must be 
1"
-      type: "number"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for database pods"
-      type: "string"
-      required: true
-  host:
-    __metadata:
-      label: "Host"
-      description: "If using an external database, the hostname or IP address 
to use to connect to the database"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "Port"
-      description: "If using an external database, the port to use to connect 
to the database"
-      type: "string"
-      required: true
-  provider:
-    __metadata:
-      label: "Provider"
-      description: "If using an external database, whether it is Cloudant or 
CouchDB"
-      type: "string"
-      required: true
-      options:
-      - label: "CouchDB"
-        value: "CouchDB"
-      - label: "Cloudant"
-        value: "Cloudant"
-  protocol:
-    __metadata:
-      label: "Protocol"
-      description: "If using an external database, the protocol to use to 
connect to the database"
-      type: "string"
-      required: true
-      options:
-      - label: "http"
-        value: "http"
-      - label: "https"
-        value: "https"
-  auth:
-    username:
-      __metadata:
-        label: "Username"
-        description: "The username to use when connecting to the database"
-        type: "string"
-        required: true
-    password:
-      __metadata:
-        label: "Password"
-        description: "The password to use when connecting to the database"
-        type: "password"
-        required: true
-  dbPrefix:
-    __metadata:
-      label: "Prefix"
-      description: "The prefix to use when creating database resources"
-      type: "string"
-      required: true
-  activationsTable:
-    __metadata:
-      label: "Activations table"
-      description: "The name of the activations table"
-      type: "string"
-      required: true
-  actionsTable:
-    __metadata:
-      label: "Actions table"
-      description: "The name of the actions table"
-      type: "string"
-      required: true
-  authsTable:
-    __metadata:
-      label: "Auths table"
-      description: "The name of the auths table"
-      type: "string"
-      required: true
-  persistence:
-    size:
-      __metadata:
-        label: "Size"
-        description: "The size of the persistent volume for CouchDB"
-        type: "string"
-        required: true
-
-nginx:
-  __metadata:
-    label: "NGINX Configuration"
-    description: "Update these default values to customize the NGINX 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "The number of nginx instances to deploy"
-      type: "string"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for nginx pods"
-      type: "string"
-      required: true
-  httpPort:
-    __metadata:
-      label: "HTTP port"
-      description: "The port to use for HTTP connections"
-      type: "string"
-      required: true
-  httpsPort:
-    __metadata:
-      label: "HTTPS port"
-      description: "The port to use for HTTPS connections"
-      type: "string"
-      required: true
-  httpsNodePort:
-    __metadata:
-      label: "HTTPS node port"
-      description: "The port for HTTPS connections when using a NodePort 
Ingress"
-      type: "string"
-      required: true
-
-controller:
-  __metadata:
-    label: "Controller configuration"
-    description: "Update these default values to customize the OpenWhisk 
Controller deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "The number of controller instances to deploy"
-      type: "number"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for controller pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "Port"
-      description: "The primary port for the controller service"
-      type: "string"
-      required: true
-  options:
-    __metadata:
-      label: "Options"
-      description: "Additional controller command line options"
-      type: "string"
-      required: false
-  jvmHeapMB:
-    __metadata:
-      label: "JVM heap memory (MB)"
-      description: "The maximum Java heap size in megabytes (MB)"
-      type: "string"
-      required: true
-  jvmOptions:
-    __metadata:
-      label: "JVM options"
-      description: "Additional JVM command line options"
-      type: "string"
-      required: false
-
-
-invoker:
-  __metadata:
-    label: "Invoker Configuration"
-    description: "Update these default values to customize the OpenWhisk 
Invoker deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "Docker image name for the Invoker"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag for the Invoker"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for invoker pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "Port"
-      description: "The primary invoker port"
-      type: "string"
-      required: true
-  options:
-    __metadata:
-      label: "Additional options"
-      description: "Additional command line options to give to the invoker"
-      type: "string"
-      required: false
-  jvmHeapMB:
-    __metadata:
-      label: "JVM heap memory (MB)"
-      description: "the maximum Java heap size in megabytes (MB)"
-      type: "string"
-      required: true
-  jvmOptions:
-    __metadata:
-      label: "JVM options"
-      description: "Additional JVM command line options"
-      type: "string"
-      required: false
-  containerFactory:
-    useRunc:
-      __metadata:
-        label: "useRunc"
-        description: "Should the invoker use runc to pause/unpause idle action 
containers"
-        type: "boolean"
-        required: true
-    impl:
-      __metadata:
-        label: "impl"
-        description: "Which ContainerFactory shoUld be used"
-        type: "string"
-        required: true
-        options:
-        - label: "docker"
-          value: "docker"
-        - label: "kubernetes"
-          value: "kubernetes"
-    enableConcurrency:
-      __metadata:
-        label: "Enable concurrency"
-        description: "Should the invoker pass `__OW_ALLOW_CONCURRENT=true` to 
action containers, enabling concurrent execution in supporting runtimes"
-        type: "boolean"
-        required: true
-    networkConfig:
-      name:
-        __metadata:
-          label: "Container Network Name"
-          description: "Name of the Docker network to be used by user action 
containers"
-          type: "string"
-          required: false
-      dns:
-        inheritInvokerConfig:
-          __metadata:
-            label: "Inherit Invoker DNS Configuration"
-            description: "Should the user action containers use the same DNS 
configuration as the Invoker's container?"
-            type: "boolean"
-            required: false
-        overrides:
-          nameservers:
-            __metadata:
-              label: "DNS nameservers"
-              description: "A list of IP addresses of DNS nameserver(s) to be 
used by user action containers"
-              type: "string"
-              required: false
-          search:
-            __metadata:
-              label: "DNS search domains"
-              description: "A list of DNS search domains to be used by user 
action containers"
-              type: "string"
-              required: false
-          options:
-            __metadata:
-              label: "options"
-              description: "A list of DNS options to be used by user action 
containers"
-              type: "string"
-          required: false
-    kubernetes:
-      replicaCount:
-        __metadata:
-          label: "ContainerFactory replica count"
-          description: "How many instances of the KubernetesContainerFactory 
should be deployed?"
-          type: "number"
-          required: true
-
-apigw:
-  __metadata:
-    label: "API gateway configuration"
-    description: "Update these default values to customize the API Gateway 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "Number of apigw instances to deploy"
-      type: "string"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for apigw pods"
-      type: "string"
-      required: true
-  apiPort:
-    __metadata:
-      label: "API port"
-      description: "The API port"
-      type: "string"
-      required: true
-  mgmtPort:
-    __metadata:
-      label: "Management port"
-      description: "The management port"
-      type: "string"
-      required: true
-
-redis:
-  __metadata:
-    label: "Redis configuration"
-    description: "Update these default values to customize the Redis 
deployment"
-  external:
-    __metadata:
-      label: "External"
-      description: "If using an externally deployed Redis"
-      type: "boolean"
-      required: true
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "The number of redis instances to deploy (currently must be 
1)"
-      type: "string"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for redis pods"
-      type: "string"
-      required: true
-  host:
-    __metadata:
-      label: "Host"
-      description: "If using an external Redis, the hostname or IP address to 
use to connect to the Redis"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "Port"
-      description: "The primary service port"
-      type: "string"
-      required: true
-  persistence:
-    size:
-      __metadata:
-        label: "Size"
-        description: "The size of the persistent volume for redis"
-        type: "string"
-        required: true
-
-user-events:
-  __metadata:
-    label: "User-events Configuration"
-    description: "Update these default values to customize the User-events 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "The number of user-events instances to deploy"
-      type: "string"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for user-events pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "HTTP port"
-      description: "The port to use for HTTP connections"
-      type: "string"
-      required: true
-
-prometheus:
-  __metadata:
-    label: "Prometheus Configuration"
-    description: "Update these default values to customize the prometheus 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "The number of prometheus instances to deploy"
-      type: "string"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for prometheus pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "HTTP port"
-      description: "The port to use for HTTP connections"
-      type: "string"
-      required: true
-    persistence:
-      size:
-        __metadata:
-          label: "Prometheus persistence size"
-          description: "The size of the persistent volume for Prometheus"
-          type: "string"
-          required: true
-
-grafana:
-  __metadata:
-    label: "User-events Configuration"
-    description: "Update these default values to customize the User-events 
deployment"
-  imageName:
-    __metadata:
-      label: "Image name"
-      description: "The docker image name"
-      type: "string"
-      required: true
-  imageTag:
-    __metadata:
-      label: "Image tag"
-      description: "The docker image tag"
-      type: "string"
-      required: true
-  imagePullPolicy:
-    __metadata:
-      label: "Image pull policy"
-      description: "The image pull policy to apply for this image."
-      type: "string"
-      required: true
-      options:
-      - label: "Always"
-        value: "Always"
-      - label: "Never"
-        value: "Never"
-      - label: "IfNotPresent"
-        value: "IfNotPresent"
-  replicaCount:
-    __metadata:
-      label: "Replica count"
-      description: "The number of user-events instances to deploy"
-      type: "string"
-      required: true
-  restartPolicy:
-    __metadata:
-      label: "Restart policy"
-      description: "The restart policy for user-events pods"
-      type: "string"
-      required: true
-  port:
-    __metadata:
-      label: "HTTP port"
-      description: "The port to use for HTTP connections"
-      type: "string"
-      required: true
-  adminPassword:
-    __metadata:
-      label: "Grafana user admin password"
-      description: "The password used for logging in as an admin user in 
Grafana"
-      type: "string"
-      required: true
-  dashboards:
-    __metadata:
-      label: "List of dashboards Grafana dashboards"
-      description: "List of dashboards that should be configured in Grafana on 
container init"
-      type: "string"
-      required: true
-
-providers:
-  __metadata:
-    label: "OpenWhisk providers configuration"
-    description: "Update these default values to customize OpenWhisk providers 
(Alarm, Cloudant and Kafka)"
-  db:
-    external:
-      __metadata:
-        label: "External Providers Database"
-        description: "If the event providers database is external"
-        type: "boolean"
-        required: true
-    host:
-      __metadata:
-        label: "Database host"
-        description: "The external event providers database host"
-        type: "string"
-        required: true
-    port:
-      __metadata:
-        label: "Database port"
-        description: "The external event providers database port"
-        type: "string"
-        required: true
-    protocol:
-      __metadata:
-        label: "Database protocol"
-        description: "The external event providers database protocol"
-        type: "string"
-        required: true
-        options:
-        - label: "http"
-          value: "http"
-        - label: "https"
-          value: "https"
-    username:
-      __metadata:
-        label: "Database username"
-        description: "The external event providers database username"
-        type: "string"
-        required: true
-    password:
-      __metadata:
-        label: "Database password"
-        description: "The external event providers database password"
-        type: "password"
-        required: true
-
-  alarm:
-    enabled:
-      __metadata:
-        label: "Alarm enabled"
-        description: "If alarm provider should be enabled"
-        type: "boolean"
-        required: true
-    imageName:
-      __metadata:
-        label: "Alarm image name"
-        description: "The alarm docker image name"
-        type: "string"
-        required: true
-    imageTag:
-      __metadata:
-        label: "Alarm image tag"
-        description: "The alarm docker image tag"
-        type: "string"
-        required: true
-    imagePullPolicy:
-      __metadata:
-        label: "Image pull policy"
-        description: "The image pull policy to apply for this image."
-        type: "string"
-        required: true
-        options:
-        - label: "Always"
-          value: "Always"
-        - label: "Never"
-          value: "Never"
-        - label: "IfNotPresent"
-          value: "IfNotPresent"
-    replicaCount:
-      __metadata:
-        label: "Alarm replica count"
-        description: "The number of alarm provider instances to deploy"
-        type: "string"
-        required: true
-    restartPolicy:
-      __metadata:
-        label: "Alarm restart policy"
-        description: "The restart policy for Alarm provider pods"
-        type: "string"
-        required: true
-    apiPort:
-      __metadata:
-        label: "Alarm API port"
-        description: "The API port for the Alarm provider"
-        type: "string"
-        required: true
-    dbPrefix:
-      __metadata:
-        label: "Alarm DB prefix"
-        description: "The prefix for the Alarm provider's database tables"
-        type: "string"
-        required: true
-    persistence:
-      size:
-        __metadata:
-          label: "Alarm persistence size"
-          description: "The size of the persistent volume for the Alarm 
provider"
-          type: "string"
-          required: true
-
-  cloudant:
-    enabled:
-      __metadata:
-        label: "Cloudant enabled"
-        description: "if Cloudant provider should be enabled"
-        type: "boolean"
-        required: true
-    imageName:
-      __metadata:
-        label: "Cloudant image name"
-        description: "The Cloudant provider docker image name"
-        type: "string"
-        required: true
-    imageTag:
-      __metadata:
-        label: "Cloudant image tag"
-        description: "The Cloudant provider docker image tag"
-        type: "string"
-        required: true
-    imagePullPolicy:
-      __metadata:
-        label: "Image pull policy"
-        description: "The image pull policy to apply for this image."
-        type: "string"
-        required: true
-        options:
-        - label: "Always"
-          value: "Always"
-        - label: "Never"
-          value: "Never"
-        - label: "IfNotPresent"
-          value: "IfNotPresent"
-    replicaCount:
-      __metadata:
-        label: "Cloudant replica count"
-        description: "The number of Cloudant provider instances to deploy"
-        type: "string"
-        required: true
-    restartPolicy:
-      __metadata:
-        label: "Cloudant restart policy"
-        description: "The restart policy for Cloudant provider pods"
-        type: "string"
-        required: true
-    apiPort:
-      __metadata:
-        label: "Cloudant API port"
-        description: "The API port for the Cloudant provider"
-        type: "string"
-        required: true
-    dbPrefix:
-      __metadata:
-        label: "Cloudant DB prefix"
-        description: "The prefix to use for Cloudant provider database tables"
-        type: "string"
-        required: true
-    persistence:
-      size:
-        __metadata:
-          label: "Cloudant persistence size"
-          description: "The size of the persistent volume for the Cloudant 
provider"
-          type: "string"
-          required: true
-
-  kafka:
-    enabled:
-      __metadata:
-        label: "Kafka enabled"
-        description: "If the Kafka provider should be enabled"
-        type: "boolean"
-        required: true
-    imageName:
-      __metadata:
-        label: "Kafka image name"
-        description: "The docker image name for the Kakfa provider"
-        type: "string"
-        required: true
-    imageTag:
-      __metadata:
-        label: "Kafka image tag"
-        description: "The docker image tag for the Kafka provider"
-        type: "string"
-        required: true
-    imagePullPolicy:
-      __metadata:
-        label: "Image pull policy"
-        description: "The image pull policy to apply for this image."
-        type: "string"
-        required: true
-        options:
-        - label: "Always"
-          value: "Always"
-        - label: "Never"
-          value: "Never"
-        - label: "IfNotPresent"
-          value: "IfNotPresent"
-    replicaCount:
-      __metadata:
-        label: "Kafka replica count"
-        description: "The number of instances of the Kafka provider to deploy"
-        type: "string"
-        required: true
-    restartPolicy:
-      __metadata:
-        label: "Kafka restart policy"
-        description: "The restart policy for Kafka provider pods"
-        type: "string"
-        required: true
-    apiPort:
-      __metadata:
-        label: "Kafka API port"
-        description: "The API port for the Kafka provider"
-        type: "string"
-        required: true
-    dbPrefix:
-      __metadata:
-        label: "Kafka DB prefix"
-        description: "The prefix to use for the Kafka provider's database 
tables"
-        type: "string"
-        required: true
-
-affinity:
-  __metadata:
-    label: "Node affinity configuration"
-    description: "Labels used to tag Kubernetes worker nodes to enable 
scheduling affinity"
-  enabled:
-    __metadata:
-      label: "Affinity enabled"
-      description: "If affinity should be enabled"
-      type: "boolean"
-      required: true
-  coreNodeLabel:
-    __metadata:
-      label: "Core node label"
-      description: "Label used for worker nodes that should execute OpenWhisk 
core pods"
-      type: "string"
-      required: true
-  edgeNodeLabel:
-    __metadata:
-      label: "Edge node label"
-      description: "Label used for worker nodes that should execute OpenWhisk 
Ingress pods"
-      type: "string"
-      required: true
-  invokerNodeLabel:
-    __metadata:
-      label: "Invoker node label"
-      description: "Label used for worker nodes that should execute OpenWhisk 
Invoker pods and user actions"
-      type: "string"
-      required: true
-  providerNodeLabel:
-    __metadata:
-      label: "Provider node label"
-      description: "Label used for worker nodes that should execute OpenWhisk 
event provider pods"
-      type: "string"
-      required: true
-
-toleration:
-  __metadata:
-    label: "Node toleration configuration"
-    description: "Key used for node tolerations"
-  enabled:
-    __metadata:
-      label: "Toleration enabled"
-      description: "If toleration should be enabled"
-      type: "boolean"
-      required: true
-  coreValue:
-    __metadata:
-      label: "Core openwhisk-role toleration value"
-      description: "Value used for worker nodes toleration that should execute 
OpenWhisk core pods"
-      type: "string"
-      required: true
-  edgeValue:
-    __metadata:
-      label: "Edge openwhisk-role toleration value"
-      description: "Value used for worker nodes toleration that should execute 
OpenWhisk edge pods"
-      type: "string"
-      required: true
-  invokerValue:
-    __metadata:
-      label: "Invoker openwhisk-role toleration value"
-      description: "Value used for worker nodes toleration that should execute 
OpenWhisk invoker pods"
-      type: "string"
-      required: true
-
-probes:
-  _metadata:
-  label: "Pod's Probes Settings"
-  description: "Used for configurable liveness and readiness probes timing 
settings"
-  controller:
-    initialDelaySeconds:
-      _metadata:
-      label: "Initial wait time to start probes after container has started"
-      description: "Time in seconds to wait before starting the probes on pod 
in started state."
-      type: "number"
-      required: false
-    periodSeconds:
-      _metadata:
-      label: "Frequency to perform the probe in seconds"
-      description: "Frequency to perform the probe, default is 10, minimun is 
1"
-      type: "number"
-      required: false
-    timeoutSeconds:
-      _metadata:
-      label: "Probe timeout in seconds"
-      description: "Probe will timeouts after defined seconds, defaults to 1 
second, minimum value is 1"
-      type: "number"
-      required: false
-  zookeeper:
-    initialDelaySeconds:
-      _metadata:
-      label: "Initial wait time to start probes after container has started"
-      description: "Time in seconds to wait before starting the probes on pod 
in started state."
-      type: "number"
-      required: false
-    periodSeconds:
-      _metadata:
-      label: "Frequency to perform the probe in seconds"
-      description: "Frequency to perform the probe, default is 10, minimun is 
1"
-      type: "number"
-      required: false
-    timeoutSeconds:
-      _metadata:
-      label: "Probe timeout in seconds"
-      description: "Probe will timeouts after defined seconds, defaults to 1 
second, minimum value is 1"
-      type: "number"
-      required: false
-
-# Metrics
-metrics:
-  __metadata:
-    label: "Metrics configuration"
-    description: "configurations to enable and configure Kamon metrics from 
controller and invoker."
-  prometheusEnabled:
-    __metadata:
-      label: "enable Prometheus support"
-      description: "true to enable kamon-prometheus exporter, metrics would be 
exposed at `/metrics` endpoint"
-      type: "boolean"
-      required: true
-  whiskconfigFile:
-    __metadata:
-      label: "whiskconfig file name"
-      description: "file name of whiskconfig"
-      type: "string"
-      required: false
-  kamonEnabled:
-    __metadata:
-      label: "enable kamon metrics collection"
-      description: "whether metric information is sent to the configured 
reporters"
-      type: "boolean"
-      required: true
-  kamonTags:
-    __metadata:
-      label: "enable kamon tag"
-      description: "whether to use the Kamon tags when sending metrics"
-      type: "boolean"
-      required: true
-  userMetricsEnabled:
-    __metadata:
-      label: "enable user metrics"
-      description: "true to enable user metrics"
-      type: "boolean"
-      required: true
-pdb:
-  _metadata:
-  label: "Pod's Disruption Budget"
-  description: "Pod Disruption Budget settings for voluntary and nonvoluntary 
disruptions"
-  enable:
-    _metadata:
-      label: "Enable PDB"
-      description: "true to enable pod disruption budgets for pods"
-      type: "boolean"
-      required: false
-  zookeeper:
-    _metadata:
-      label: "Zookeeper"
-    maxUnavailable:
-      _metadata:
-      label: "Max Unavailable"
-      description: "Number of pods from replica set that can be unavailable 
after the eviction. Should be an absolute number and less than replicaCount 
value"
-      type: "number"
-      required: false
-  kafka:
-    _metadata:
-    label: "Kafka"
-    maxUnavailable:
-      _metadata:
-      label: "Max Unavailable"
-      description: "Number of pods from replica set that can be unavailable 
after the eviction. Should be an absolute number and less than replicaCount 
value"
-      type: "number"
-      required: false
-  controller:
-    _metadata:
-    label: "Controllers"
-    maxUnavailable:
-      _metadata:
-      label: "Max Unavailable"
-      description: "Number of pods from replica set that can be unavailable 
after the eviction. Should be an absolute number and less than replicaCount 
value"
-      type: "number"
-      required: false
-  invoker:
-    _metadata:
-    label: "Invokers"
-    maxUnavailable:
-      _metadata:
-      label: "Max Unavailable"
-      description: "Number of pods from replica set that can be unavailable 
after the eviction. Should be an absolute number and less than replicaCount 
value"
-      type: "number"
-      required: false
-
diff --git a/helm/openwhisk/values.schema.json 
b/helm/openwhisk/values.schema.json
new file mode 100644
index 0000000..d1c4639
--- /dev/null
+++ b/helm/openwhisk/values.schema.json
@@ -0,0 +1,524 @@
+{
+  "$schema": "https://json-schema.org/draft-07/schema#";,
+
+  "definitions": {
+    "podspec": {
+      "type": "object",
+      "properties": {
+        "imageName":       { "type": "string" },
+        "imageTag":        { "type": "string" },
+        "imagePullPolicy": { "type": "string", "enum": ["Always", "Never", 
"IfNotPresent"] },
+        "replicaCount":    { "type": "integer", "minimum": 1 },
+        "restartPolicy":   { "type": "string" }
+      },
+      "required": ["imageName", "imageTag", "imagePullPolicy", "replicaCount", 
"restartPolicy"]
+    },
+
+    "daemonset": {
+      "type": "object",
+      "properties": {
+        "imageName":       { "type": "string" },
+        "imageTag":        { "type": "string" },
+        "imagePullPolicy": { "type": "string", "enum": ["Always", "Never", 
"IfNotPresent"] },
+        "restartPolicy":   { "type": "string" }
+      },
+      "required": ["imageName", "imageTag", "imagePullPolicy", "restartPolicy"]
+    },
+
+    "pvSizeValid": {
+      "$comment": "intended to validate the *.persistence.size portion of a 
podspec",
+      "type": "object",
+      "properties": {
+        "persistence": {
+          "type": "object",
+          "properties": {
+            "size": { "type": "string" }
+          },
+          "required": [ "size" ]
+        }
+      }
+    },
+
+    "probespec": {
+      "$comment": "configuration of liveness or readiness probe",
+      "properties": {
+        "initialDelaySeconds": { "type": "integer", "minimum": 0 },
+        "periodSeconds": { "type": "integer", "minimum": 0 },
+        "timeoutSeconds": { "type": "integer", "minimum": 0 }
+      },
+      "required": ["initialDelaySeconds", "periodSeconds", "timeoutSeconds"]
+    },
+
+    "standardPodProbes": {
+      "type": "object",
+      "properties": {
+        "livenessProbe": { "$ref": "#/definitions/probespec" },
+        "readinessProbe": { "$ref": "#/definitions/probespec" }
+      },
+      "required": ["livenessProbe", "readinessProbe"]
+    },
+
+    "optionalExternalHostCheck": {
+      "$comment": "external being true implies host is non-null string",
+      "properties": { "external": { "type": "boolean" } },
+      "required": ["external"],
+      "if": { "properties": { "external": { "const": true } } },
+      "then": { "properties": { "host": { "type": "string" } }, "required": 
["host"] }
+    },
+
+    "actionLimitSpecString": {
+      "type": "object",
+      "properties": {
+        "min": { "type": "string" },
+        "max": { "type": "string" },
+        "std": { "type": "string" }
+      },
+      "required": ["min", "max", "std" ]
+    },
+
+    "actionLimitSpecInteger": {
+      "type": "object",
+      "properties": {
+        "min": { "type": "number" },
+        "max": { "type": "number" },
+        "std": { "type": "number" }
+      },
+      "required": ["min", "max", "std" ]
+    },
+
+    "kafkaTopicConfig": {
+      "type": "object",
+      "properties": {
+        "segmentBytes": { "type": "string" },
+        "retentionBytes": { "type": "string" },
+        "retentionMs": { "type": "string" }
+      },
+      "required": ["segmentBytes", "retentionBytes", "retentionMs" ]
+    }
+
+  },
+
+  "type": "object",
+  "name": "Values",
+  "properties": {
+    "whisk": {
+      "type": "object",
+      "properties": {
+        "ingress": {
+          "description": "Specification of the Ingress used to expose 
OpenWhisk outside your Kubernetes cluster",
+          "type": "object",
+          "properties": {
+            "apiHostName": { "type": "string", "description": "The external 
hostname or IP address used to access the Ingress of your Kubernetes cluster" },
+            "apiHostPort": { "type": "integer", "minimum": 0, "description": 
"The external port used to access the Ingress of your Kubernetes cluster" },
+            "apiHostProto": { "type": "string", "enum": ["http", "https"], 
"description": "The protocol to be used to connect to the Ingress of your 
Kubernetes cluster" },
+            "type": { "type": "string", "enum": ["NodePort", "Standard", 
"LoadBalancer", "OpenShift"], "description": "The type of Ingress being 
deployed" },
+            "annotations": { "type": "object", "description": "Annotations to 
add to Ingress resource. Specify as a list of key: value pairs" },
+            "domain": { "type": "string", "description": "The Fully Qualified 
Host Name for the Ingress domain" },
+            "tls": {
+              "type": "object",
+              "properties": {
+                "enabled": { "type": "boolean" },
+                "secretenabled": { "type": "boolean" },
+                "createsecret": { "type": "boolean" },
+                "secrettype": { "type": "string" },
+                "crt": { "type": "string" },
+                "key": { "type": "string" }
+              }
+            }
+          },
+          "required": ["apiHostName", "apiHostPort", "apiHostProto", "type"]
+        },
+        "auth": {
+          "type": "object",
+          "properties": {
+            "system": { "type": "string" },
+            "guest": { "type": "string" }
+          }
+        },
+        "systemNameSpace": { "type": "string" },
+        "limits": {
+          "type": "object",
+          "properties": {
+            "actionsInvokesPerminute": { "type": "number", "minimum": 0, 
"descrption": "The maximum number of action invocations per minute by a single 
namespace" },
+            "actionsInvokesConcurrent": { "type": "number", "minimum": 0, 
"descrption":  "The maximum number of concurrent action invocations by a single 
namespace" },
+            "triggersFiresPerminute": { "type": "number", "minimum": 0, 
"description": "The maximum triggers fired per minute for a single namespace" },
+            "actionsSequenceMaxLength": { "type": "number", "minimum": 0, 
"description": "The maximum length of an action sequence" },
+            "actions": {
+              "type": "object",
+              "properties": {
+                "time": { "$ref": "#/definitions/actionLimitSpecString" },
+                "memory": { "$ref": "#/definitions/actionLimitSpecString" },
+                "concurrency": { "$ref": 
"#/definitions/actionLimitSpecInteger" },
+                "log": { "$ref": "#/definitions/actionLimitSpecString" },
+                "time": { "$ref": "#/definitions/actionLimitSpecString" }
+              }
+            },
+            "activation": {
+              "type": "object",
+              "properties": {
+                "payload": {
+                  "type": "object",
+                  "properties": {
+                    "max": { "type": "string" }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "loadbalancer": {
+          "type": "object",
+          "properties": {
+            "blackboxFraction": { "type": "string" },
+            "timeoutFactor": { "type": "number" }
+          }
+        }
+      },
+      "kafka": {
+        "type": "object",
+        "properties": {
+          "replicationFactor": { "type": "string" },
+          "topics": {
+            "type": "object",
+            "properties": {
+              "cacheInvalidation": { "$ref": "#/definitions/kafkaTopicConfig" 
},
+              "completed": { "$ref": "#/definitions/kafkaTopicConfig" },
+              "events": { "$ref": "#/definitions/kafkaTopicConfig" },
+              "health": { "$ref": "#/definitions/kafkaTopicConfig" },
+              "invoker": { "$ref": "#/definitions/kafkaTopicConfig" }
+            }
+          }
+        }
+      },
+      "containerPool": {
+        "type": "object",
+        "properties": {
+          "userMemory": { "type": "string" }
+        }
+      },
+      "runtimes": { "type": "string" },
+      "testing": {
+        "type": "object",
+        "properties": {
+          "includeTests": { "type": "boolean" },
+          "includeSystemTests": { "type": "boolean" }
+        }
+      },
+      "versions": {
+        "type": "object",
+        "properties": {
+          "openwhisk": {
+            "type": "object",
+            "properties": {
+              "buildDate": { "type": "string" },
+              "buildNo": { "type": "string" },
+              "gitTag": { "type": "string" }
+            },
+            "required": ["buildDate", "buildNo", "gitTag"]
+          },
+          "openwhiskCli": { "type": "object", "properties": { "gitTag": { 
"type": "string" }, "required": ["gitTag"] } },
+          "openwhiskCatalog": { "type": "object", "properties": { "gitTag": { 
"type": "string" }, "required": ["gitTag"] } },
+          "openwhiskPackageAlarms": { "type": "object", "properties": { 
"gitTag": { "type": "string" }, "required": ["gitTag"] } },
+          "openwhiskPackageCloudant": { "type": "object", "properties": { 
"gitTag": { "type": "string" }, "required": ["gitTag"] } },
+          "openwhiskPackageKafka": { "type": "object", "properties": { 
"gitTag": { "type": "string" }, "required": ["gitTag"] } },
+          "required": ["openwhisk", "openwhiskCli", "openwhiskCatalog", 
"openwhiskPackageAlarms", "openwhiskPackageCloudant", "openwhiskPackageKafka"]
+        }
+      },
+      "required": [ "ingress", "auth", "systemNameSpace", "versions" ]
+    },
+
+    "k8s": {
+      "type": "object",
+      "properties": {
+        "domain": { "type": "string" },
+        "dns": { "type": "string" },
+        "persistence": {
+          "type": "object",
+          "properties": { "enabled": { "type": "boolean" } },
+          "required": ["enabled"],
+          "if": { "properties": { "enabled": { "const": true } } },
+          "then": {
+            "allOf": [
+              { "properties": { "hasDefaultStorageClass": { "type": "boolean" 
} },
+                "required": ["hasDefaultStorageClass"]
+              },
+              { "if": { "properties": { "hasDefaultStorageClass": { "const": 
false } } },
+                "then": {
+                  "properties": { "explicitStorageClass": { "type": "string" } 
},
+                  "required": ["explicitStorageClass"]
+                }
+              }
+            ]
+          }
+        }
+      },
+      "required": ["domain", "dns", "persistence"]
+    },
+
+    "utility": {
+      "type": "object",
+      "properties": {
+        "imageName":       { "type": "string" },
+        "imageTag":        { "type": "string" },
+        "imagePullPolicy": { "type": "string", "enum": ["Always", "Never", 
"IfNotPresent"] }
+      },
+      "required": ["imageName", "imageTag", "imagePullPolicy"]
+    },
+
+    "docker": {
+      "type": "object",
+      "properties": {
+        "registry": {
+          "type": "object",
+          "properties": {
+            "name": { "type" : "string" },
+            "username": { "type" : "string" },
+            "password": { "type" : "string" }
+          }
+        },
+        "timezone": { "type": "string" }
+      }
+    },
+
+    "zookeeper": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "$comment": "Zookeeper's quorum protocol is designed to have an odd 
number of replicas",
+          "properties": { "replicaCount": { "not": { "multipleOf": 2 } } }
+        },
+        { "properties": {
+            "port": { "type": "integer", "minimum": 0 },
+            "serverPort": { "type": "integer", "minimum": 0 },
+            "leaderElectionPort": { "type": "integer", "minimum": 0 },
+            "config": {
+              "type": "object",
+              "properties": {
+                "tickTime": { "type": "integer" },
+                "initLimit": { "type": "integer" },
+                "syncLimit": { "type": "integer" },
+                "dataDir": { "type": "string" },
+                "dataLogDir": { "type": "string" }
+              },
+              "required": ["tickTime", "initLimit", "syncLimit", "dataDir", 
"dataLogDir"],
+              "additionalProperties": false
+            }
+          },
+          "required": ["port", "serverPort", "leaderElectionPort", "config"]
+        }
+      ]
+    },
+
+    "kafka": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] }
+      ]
+    },
+
+    "db": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] },
+        { "$comment": "wipeAndInit implies replicaCount is 1 because initdb.sh 
enables single node mode",
+          "if": { "properties": { "wipeAndInit": { "const": true } } },
+          "then": { "properties": { "replicaCount": { "const": 1 } } }
+        },
+        { "$ref": "#/definitions/optionalExternalHostCheck" }
+      ]
+    },
+
+    "nginx": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "httpPort": { "type": "integer", "minimum": 0 } }, 
"required": ["httpPort"] },
+        { "properties": { "httpsPort": { "type": "integer", "minimum": 0 } }, 
"required": ["httpsPort"] }
+      ]
+    },
+
+    "controller": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] },
+        { "properties": {
+            "options": { "type": "string" },
+            "jvmHeapMB": { "type": "string" },
+            "jvmOptions": { "type": "string" }
+           },
+           "required": ["jvmHeapMB"]
+        }
+      ]
+    },
+
+    "invoker": {
+      "allOf": [
+        { "$ref": "#/definitions/daemonset" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] }
+      ]
+    },
+
+    "apigw": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "apiPort": { "type": "integer", "minimum": 0 } }, 
"required": ["apiPort"] },
+        { "properties": { "mgmtPort": { "type": "integer", "minimum": 0 } }, 
"required": ["mgmtPort"] }
+      ]
+    },
+
+    "redis": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] },
+        { "properties": { "replicaCount": { "const": 1 } } },
+        { "$ref": "#/definitions/optionalExternalHostCheck" }
+      ]
+    },
+
+    "user_events": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] }
+      ]
+    },
+
+    "prometheus": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] },
+        { "properties": {
+            "persistentVolume": {
+              "type": "object",
+              "properties": { "mountPath": { "type": "string" } },
+              "required": ["mountPath" ]
+            }
+          }
+        }
+      ]
+    },
+
+    "grafana": {
+      "allOf": [
+        { "$ref": "#/definitions/podspec" },
+        { "properties": { "port": { "type": "integer", "minimum": 0 } }, 
"required": ["port"] },
+        { "properties": { "dashboards": { "type": "array", "items": { "type": 
"string" } } }, "required": ["dashboards"] }
+      ]
+    },
+
+    "metrics": {
+      "type": "object",
+      "properties": {
+        "prometheusEnabled": { "type": "boolean" },
+        "whiskconfigFile": { "type": "string" },
+        "kamonEnabled": { "type": "boolean" },
+        "kamonTags": { "type": "boolean" },
+        "userMetricsEnabled": { "type": "boolean" }
+      }
+    },
+
+    "providers": {
+      "type": "object",
+      "properties": {
+        "db": { "$ref": "#/definitions/optionalExternalHostCheck" },
+
+        "alarm": {
+          "allOf": [
+            { "$ref": "#/definitions/podspec" },
+            { "properties": { "apiPort": { "type": "integer", "minimum": 0 } 
}, "required": ["apiPort"] },
+            { "properties": { "replicaCount": { "const": 1 } } }
+          ]
+        },
+
+        "cloudant": {
+          "allOf": [
+            { "$ref": "#/definitions/podspec" },
+            { "properties": { "apiPort": { "type": "integer", "minimum": 0 } 
}, "required": ["apiPort"] },
+            { "properties": { "replicaCount": { "const": 1 } } }
+          ]
+        },
+
+        "kafka": {
+          "allOf": [
+            { "$ref": "#/definitions/podspec" },
+            { "properties": { "apiPort": { "type": "integer", "minimum": 0 } 
}, "required": ["apiPort"] },
+            { "properties": { "replicaCount": { "const": 1 } } }
+          ]
+        }
+      }
+    },
+
+    "affinity": {
+      "type": "object",
+      "properties": { "enabled": { "type": "boolean" } },
+      "required": ["enabled"],
+      "if": { "properties": { "enabled": { "const": true } } },
+      "then": {
+        "properties": {
+          "coreNodeLabel": { "type": "string" },
+          "edgeNodeLabel": { "type": "string" },
+          "invokerNodeLabel": { "type": "string" },
+          "providerNodeLabel": { "type": "string" }
+        },
+        "required": ["coreNodeLabel", "edgeNodeLabel", "invokerNodeLabel", 
"providerNodeLabel"]
+      }
+    },
+
+    "toleration": {
+      "type": "object",
+      "properties": { "enabled": { "type": "boolean" } },
+      "required": ["enabled"],
+      "if": { "properties": { "enabled": { "const": true } } },
+      "then": {
+        "properties": {
+          "coreValue": { "type": "string" },
+          "edgeValue": { "type": "string" },
+          "invokerValue": { "type": "string" }
+        },
+        "required": ["coreValue", "edgeValue", "invokerValue"]
+      }
+    },
+
+    "pdb": {
+      "type": "object",
+      "properties": { "enable": { "type": "boolean" } },
+      "required": ["enable"],
+      "if": { "properties": { "enable": { "const": true } } },
+      "then": {
+        "properties": {
+          "zookeeper": { "type": "object", "properties": { "maxUnavailable": { 
"type": "integer" } }, "required": ["maxUnavailable"] },
+          "kafka": { "type": "object", "properties": { "maxUnavailable": { 
"type": "integer" } }, "required": ["maxUnavailable"] },
+          "controller": { "type": "object", "properties": { "maxUnavailable": 
{ "type": "integer" } }, "required": ["maxUnavailable"] },
+          "invoker": { "type": "object", "properties": { "maxUnavailable": { 
"type": "integer" } }, "required": ["maxUnavailable"] }
+        },
+        "required": ["zookeeper", "kafka", "controller", "invoker"]
+      }
+    },
+
+
+    "probes": {
+      "type": "object",
+      "properties": {
+        "zookeeper": { "$ref": "#/definitions/standardPodProbes" },
+        "controller": { "$ref": "#/definitions/standardPodProbes" }
+      }
+    }
+  },
+
+  "if": {
+    "properties": { "k8s": { "properties": { "persistence": { "properties": { 
"enabled": { "const": true } }}}}}
+  },
+  "then": {
+    "$comment": "If k8s.persistence.enabled then .persistence.size must be 
valid for each listed podspec",
+    "properties": {
+      "zookeeper": { "$ref": "#/definitions/pvSizeValid" },
+      "kafka": { "$ref": "#/definitions/pvSizeValid" },
+      "db": { "$ref": "#/definitions/pvSizeValid" },
+      "redis": { "$ref": "#/definitions/pvSizeValid" },
+      "prometheus": { "$ref": "#/definitions/pvSizeValid" },
+      "providers": {
+        "properties": {
+          "alarm": { "$ref": "#/definitions/pvSizeValid" },
+          "cloudant": { "$ref": "#/definitions/pvSizeValid" }
+        }
+      }
+    }
+  }
+}
diff --git a/helm/openwhisk/values.yaml b/helm/openwhisk/values.yaml
index 665c5f0..85105c1 100644
--- a/helm/openwhisk/values.yaml
+++ b/helm/openwhisk/values.yaml
@@ -148,7 +148,7 @@ k8s:
   persistence:
     enabled: true
     hasDefaultStorageClass: true
-    explicitStorageClass: nil
+    explicitStorageClass: null
 
 # Images used to run auxillary tasks/jobs
 utility:
@@ -208,7 +208,7 @@ db:
   # NOTE: must be 1 (because initdb.sh enables single node mode)
   replicaCount: 1
   restartPolicy: "Always"
-  host: nil
+  host: null
   port: 5984
   provider: "CouchDB"
   protocol: "http"
@@ -294,7 +294,7 @@ redis:
   # NOTE: setting replicaCount > 1 will not work; need to add redis cluster 
configuration
   replicaCount: 1
   restartPolicy: "Always"
-  host: nil
+  host: null
   port: 6379
   persistence:
     size: 256Mi

Reply via email to