From eb70b1d9c2490dc2d6e85100b8c1a8f84ac805e7 Mon Sep 17 00:00:00 2001
From: Steve Wilkerson <wilkers.steve@gmail.com>
Date: Tue, 11 Apr 2017 09:23:17 -0500
Subject: [PATCH] Add Mistral Chart

This adds Mistral to the list of services included in OpenStack
Helm.

Change-Id: Ib94c600a170b21f32af0284fbbef96618021ad7f
---
 Makefile                                      |    8 +-
 mistral/Chart.yaml                            |   24 +
 mistral/requirements.yaml                     |   19 +
 mistral/templates/bin/_db-sync.sh.tpl         |   19 +
 mistral/templates/configmap-bin.yaml          |   32 +
 mistral/templates/configmap-etc.yaml          |   65 +
 mistral/templates/deployment-api.yaml         |   92 +
 mistral/templates/deployment-executor.yaml    |   79 +
 mistral/templates/etc/_mistral.conf.tpl       | 1829 +++++++++++++++++
 mistral/templates/etc/_policy.json.tpl        |   65 +
 mistral/templates/job-db-init.yaml            |   79 +
 mistral/templates/job-db-sync.yaml            |   67 +
 mistral/templates/job-ks-endpoints.yaml       |   73 +
 mistral/templates/job-ks-service.yaml         |   68 +
 mistral/templates/job-ks-user.yaml            |   70 +
 mistral/templates/secret-db-root.env.yaml     |   21 +
 .../templates/secret-keystone-admin.env.yaml  |   35 +
 .../templates/secret-keystone-user.env.yaml   |   34 +
 mistral/templates/service-api.yaml            |   29 +
 mistral/templates/statefulset-engine.yaml     |   72 +
 .../templates/statefulset-event-engine.yaml   |   72 +
 mistral/values.yaml                           |  302 +++
 22 files changed, 3151 insertions(+), 3 deletions(-)
 create mode 100644 mistral/Chart.yaml
 create mode 100644 mistral/requirements.yaml
 create mode 100644 mistral/templates/bin/_db-sync.sh.tpl
 create mode 100644 mistral/templates/configmap-bin.yaml
 create mode 100644 mistral/templates/configmap-etc.yaml
 create mode 100644 mistral/templates/deployment-api.yaml
 create mode 100644 mistral/templates/deployment-executor.yaml
 create mode 100644 mistral/templates/etc/_mistral.conf.tpl
 create mode 100644 mistral/templates/etc/_policy.json.tpl
 create mode 100644 mistral/templates/job-db-init.yaml
 create mode 100644 mistral/templates/job-db-sync.yaml
 create mode 100644 mistral/templates/job-ks-endpoints.yaml
 create mode 100644 mistral/templates/job-ks-service.yaml
 create mode 100644 mistral/templates/job-ks-user.yaml
 create mode 100644 mistral/templates/secret-db-root.env.yaml
 create mode 100644 mistral/templates/secret-keystone-admin.env.yaml
 create mode 100644 mistral/templates/secret-keystone-user.env.yaml
 create mode 100644 mistral/templates/service-api.yaml
 create mode 100644 mistral/templates/statefulset-engine.yaml
 create mode 100644 mistral/templates/statefulset-event-engine.yaml
 create mode 100644 mistral/values.yaml

diff --git a/Makefile b/Makefile
index 218bf2516c..f2e04a130f 100644
--- a/Makefile
+++ b/Makefile
@@ -12,15 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-.PHONY: ceph bootstrap mariadb etcd keystone memcached rabbitmq helm-toolkit neutron nova cinder heat ingress all clean
+.PHONY: ceph bootstrap mariadb etcd keystone memcached rabbitmq helm-toolkit mistral neutron nova cinder heat ingress all clean
 
 B64_DIRS := helm-toolkit/secrets
 B64_EXCLUDE := $(wildcard helm-toolkit/secrets/*.b64)
 
-CHARTS := ceph mariadb etcd rabbitmq memcached keystone glance horizon neutron nova cinder heat ingress
+CHARTS := ceph mariadb etcd rabbitmq memcached keystone glance horizon mistral neutron nova cinder heat ingress
 TOOLKIT_TPL := helm-toolkit/templates/_globals.tpl
 
-all: helm-toolkit ceph bootstrap mariadb etcd rabbitmq memcached keystone glance horizon neutron nova cinder heat ingress
+all: helm-toolkit ceph bootstrap mariadb etcd rabbitmq memcached keystone glance horizon mistral neutron nova cinder heat ingress
 
 helm-toolkit: build-helm-toolkit
 
@@ -43,6 +43,8 @@ rabbitmq: build-rabbitmq
 
 glance: build-glance
 
+mistral: build-mistral
+
 neutron: build-neutron
 
 nova: build-nova
diff --git a/mistral/Chart.yaml b/mistral/Chart.yaml
new file mode 100644
index 0000000000..2b377824d8
--- /dev/null
+++ b/mistral/Chart.yaml
@@ -0,0 +1,24 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+apiVersion: v1
+description: OpenStack-Helm Mistral
+name: mistral
+version: 0.1.0
+home: https://docs.openstack.org/developer/mistral
+sources:
+  - https://git.openstack.org/cgit/openstack/mistral
+  - https://git.openstack.org/cgit/openstack/openstack-helm
+maintainers:
+  - name: OpenStack-Helm Authors
diff --git a/mistral/requirements.yaml b/mistral/requirements.yaml
new file mode 100644
index 0000000000..307a18eaaf
--- /dev/null
+++ b/mistral/requirements.yaml
@@ -0,0 +1,19 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+dependencies:
+  - name: helm-toolkit
+    repository: http://localhost:8879/charts
+    version: 0.1.0
+
diff --git a/mistral/templates/bin/_db-sync.sh.tpl b/mistral/templates/bin/_db-sync.sh.tpl
new file mode 100644
index 0000000000..f89bdace5f
--- /dev/null
+++ b/mistral/templates/bin/_db-sync.sh.tpl
@@ -0,0 +1,19 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+#!/bin/bash
+
+set -ex
+
+mistral-db-manage --config-file /etc/mistral/mistral.conf upgrade head
+mistral-db-manage --config-file /etc/mistral/mistral.conf populate
diff --git a/mistral/templates/configmap-bin.yaml b/mistral/templates/configmap-bin.yaml
new file mode 100644
index 0000000000..ebb5d6c004
--- /dev/null
+++ b/mistral/templates/configmap-bin.yaml
@@ -0,0 +1,32 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: mistral-bin
+data:
+  db-init.py: |+
+{{- include "helm-toolkit.db_init" . | indent 4 }}
+  db-sync.sh: |+
+{{ tuple "bin/_db-sync.sh.tpl" . | include "helm-toolkit.template" | indent 4 }}
+  ks-service.sh: |+
+{{- include "helm-toolkit.keystone_service" . | indent 4 }}
+  ks-endpoints.sh: |+
+{{- include "helm-toolkit.keystone_endpoints" . | indent 4 }}
+  ks-user.sh: |+
+{{- include "helm-toolkit.keystone_user" . | indent 4 }}
+  ks-domain-user.sh: |+
+{{- include "helm-toolkit.keystone_domain_user" . | indent 4 }}
+
diff --git a/mistral/templates/configmap-etc.yaml b/mistral/templates/configmap-etc.yaml
new file mode 100644
index 0000000000..7b2d0941fa
--- /dev/null
+++ b/mistral/templates/configmap-etc.yaml
@@ -0,0 +1,65 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{- include "mistral.conf.mistral_values_skeleton" .Values.conf.mistral | trunc 0 -}}
+
+{{- if empty .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.auth_uri -}}
+{{- tuple "identity" "internal" "api" . | include "helm-toolkit.keystone_endpoint_uri_lookup"| set .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token "auth_uri" | quote | trunc 0 -}}
+{{- end -}}
+
+{{- if empty .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.auth_url -}}
+{{- tuple "identity" "internal" "api" . | include "helm-toolkit.keystone_endpoint_uri_lookup"| set .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token "auth_url" | quote | trunc 0 -}}
+{{- end -}}
+
+{{- if empty .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.memcached_servers -}}
+{{- tuple "oslo_cache" "internal" "memcache" . | include "helm-toolkit.hostname_endpoint_uri_lookup" | set .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token "memcached_servers" | quote | trunc 0 -}}
+{{- end -}}
+
+{{- if empty .Values.conf.mistral.database.oslo.db.connection -}}
+{{- tuple "oslo_db" "internal" "user" "mysql" . | include "helm-toolkit.authenticated_endpoint_uri_lookup"| set .Values.conf.mistral.database.oslo.db "connection" | quote | trunc 0 -}}
+{{- end -}}
+
+{{- if empty .Values.conf.mistral.default.oslo.messaging.transport_url -}}
+{{- tuple "oslo_messaging" "internal" "user" "amqp" . | include "helm-toolkit.authenticated_endpoint_uri_lookup" | set .Values.conf.mistral.default.oslo.messaging "transport_url" | quote | trunc 0 -}}
+{{- end -}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: mistral-etc
+data:
+  mistral.conf: |+
+{{ if .Values.conf.mistral.override -}}
+{{ .Values.conf.mistral.override | indent 4 }}
+{{- else -}}
+{{- if .Values.conf.mistral.prefix -}}
+{{ .Values.conf.mistral.prefix | indent 4 }}
+{{- end }}
+{{ tuple "etc/_mistral.conf.tpl" . | include "helm-toolkit.template" | indent 4 }}
+{{- end }}
+{{- if .Values.conf.mistral.append -}}
+{{ .Values.conf.mistral.append | indent 4 }}
+{{- end }}
+  policy.json: |+
+{{ if .Values.conf.policy.override -}}
+{{ .Values.conf.policy.override | indent 4 }}
+{{- else -}}
+{{- if .Values.conf.policy.prefix -}}
+{{ .Values.conf.policy.prefix | indent 4 }}
+{{- end }}
+{{ tuple "etc/_policy.json.tpl" . | include "helm-toolkit.template" | indent 4 }}
+{{- end }}
+{{- if .Values.conf.policy.append -}}
+{{ .Values.conf.policy.append | indent 4 }}
+{{- end }}
diff --git a/mistral/templates/deployment-api.yaml b/mistral/templates/deployment-api.yaml
new file mode 100644
index 0000000000..5463cd0068
--- /dev/null
+++ b/mistral/templates/deployment-api.yaml
@@ -0,0 +1,92 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.api }}
+{{- $mounts_mistral_api := .Values.mounts.mistral_api.mistral_api }}
+{{- $mounts_mistral_api_init := .Values.mounts.mistral_api.init_container }}
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: mistral-api
+spec:
+  replicas: {{ .Values.replicas.api }}
+  revisionHistoryLimit: {{ .Values.upgrades.revision_history }}
+  strategy:
+    type: {{ .Values.upgrades.pod_replacement_strategy }}
+    {{ if eq .Values.upgrades.pod_replacement_strategy "RollingUpdate" }}
+    rollingUpdate:
+      maxUnavailable: {{ .Values.upgrades.rolling_update.max_unavailable }}
+      maxSurge: {{ .Values.upgrades.rolling_update.max_surge }}
+    {{ end }}
+  template:
+    metadata:
+      labels:
+        app: mistral-api
+      annotations:
+        configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.hash" }}
+        configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.hash" }}
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies $mounts_mistral_api_init | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-api
+          image: {{ .Values.images.api }}
+          imagePullPolicy: {{ .Values.images.pull_policy }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            limits:
+              cpu: {{ .Values.resources.api.limits.cpu | quote }}
+              memory: {{ .Values.resources.api.limits.memory | quote }}
+            requests:
+              cpu: {{ .Values.resources.api.requests.cpu | quote }}
+              memory: {{ .Values.resources.api.requests.memory | quote }}
+          {{- end }}
+          command:
+          - mistral-server
+          - --server
+          - api
+          - --config-file
+          - /etc/mistral/mistral.conf
+          ports:
+            - name: {{ .Values.network.api.name }}
+              containerPort: {{ .Values.conf.mistral.api.mistral.config.port }}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.conf.mistral.api.mistral.config.port }}
+          volumeMounts:
+            - name: pod-etc-mistral
+              mountPath: /etc/mistral
+            - name: mistralconf
+              mountPath: /etc/mistral/mistral.conf
+              subPath: mistral.conf
+              readOnly: true
+            - name: mistralpolicy
+              mountPath: /etc/mistral/policy.json
+              subPath: policy.json
+              readOnly: true
+{{ if $mounts_mistral_api.volumeMounts }}{{ toYaml $mounts_mistral_api.volumeMounts | indent 12 }}{{ end }}
+      volumes:
+        - name: pod-etc-mistral
+          emptyDir: {}
+        - name: mistralconf
+          configMap:
+            name: mistral-etc
+        - name: mistralpolicy
+          configMap:
+            name: mistral-etc
+{{ if $mounts_mistral_api.volumes }}{{ toYaml $mounts_mistral_api.volumes | indent 8 }}{{ end }}
diff --git a/mistral/templates/deployment-executor.yaml b/mistral/templates/deployment-executor.yaml
new file mode 100644
index 0000000000..be93575113
--- /dev/null
+++ b/mistral/templates/deployment-executor.yaml
@@ -0,0 +1,79 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.executor }}
+{{- $mounts_mistral_executor := .Values.mounts.mistral_executor.mistral_executor }}
+{{- $mounts_mistral_executor_init := .Values.mounts.mistral_executor.init_container }}
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: mistral-executor
+spec:
+  replicas: {{ .Values.replicas.executor }}
+  revisionHistoryLimit: {{ .Values.upgrades.revision_history }}
+  strategy:
+    type: {{ .Values.upgrades.pod_replacement_strategy }}
+    {{ if eq .Values.upgrades.pod_replacement_strategy "RollingUpdate" }}
+    rollingUpdate:
+      maxUnavailable: {{ .Values.upgrades.rolling_update.max_unavailable }}
+      maxSurge: {{ .Values.upgrades.rolling_update.max_surge }}
+    {{ end }}
+  template:
+    metadata:
+      labels:
+        app: mistral-executor
+      annotations:
+        configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.hash" }}
+        configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.hash" }}
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies $mounts_mistral_executor_init | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-executor
+          image: {{ .Values.images.executor }}
+          imagePullPolicy: {{ .Values.images.pull_policy }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            limits:
+              cpu: {{ .Values.resources.executor.limits.cpu | quote }}
+              memory: {{ .Values.resources.executor.limits.memory | quote }}
+            requests:
+              cpu: {{ .Values.resources.executor.requests.cpu | quote }}
+              memory: {{ .Values.resources.executor.requests.memory | quote }}
+          {{- end }}
+          command:
+          - mistral-server
+          - --server
+          - executor
+          - --config-file
+          - /etc/mistral/mistral.conf
+          volumeMounts:
+            - name: pod-etc-mistral
+              mountPath: /etc/mistral
+            - name: mistralconf
+              mountPath: /etc/mistral/mistral.conf
+              subPath: mistral.conf
+              readOnly: true
+{{ if $mounts_mistral_executor.volumeMounts }}{{ toYaml $mounts_mistral_executor.volumeMounts | indent 12 }}{{ end }}
+      volumes:
+        - name: pod-etc-mistral
+          emptyDir: {}
+        - name: mistralconf
+          configMap:
+            name: mistral-etc
+{{ if $mounts_mistral_executor.volumes }}{{ toYaml $mounts_mistral_executor.volumes | indent 8 }}{{ end }}
diff --git a/mistral/templates/etc/_mistral.conf.tpl b/mistral/templates/etc/_mistral.conf.tpl
new file mode 100644
index 0000000000..aaea3b0fd1
--- /dev/null
+++ b/mistral/templates/etc/_mistral.conf.tpl
@@ -0,0 +1,1829 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{ include "mistral.conf.mistral_values_skeleton" .Values.conf.mistral | trunc 0 }}
+{{ include "mistral.conf.mistral" .Values.conf.mistral }}
+
+
+{{- define "mistral.conf.mistral_values_skeleton" -}}
+
+{{- if not .default -}}{{- set . "default" dict -}}{{- end -}}
+{{- if not .default.mistral -}}{{- set .default "mistral" dict -}}{{- end -}}
+{{- if not .default.mistral.config -}}{{- set .default.mistral "config" dict -}}{{- end -}}
+{{- if not .default.oslo -}}{{- set .default "oslo" dict -}}{{- end -}}
+{{- if not .default.oslo.log -}}{{- set .default.oslo "log" dict -}}{{- end -}}
+{{- if not .default.oslo.messaging -}}{{- set .default.oslo "messaging" dict -}}{{- end -}}
+{{- if not .api -}}{{- set . "api" dict -}}{{- end -}}
+{{- if not .api.mistral -}}{{- set .api "mistral" dict -}}{{- end -}}
+{{- if not .api.mistral.config -}}{{- set .api.mistral "config" dict -}}{{- end -}}
+{{- if not .coordination -}}{{- set . "coordination" dict -}}{{- end -}}
+{{- if not .coordination.mistral -}}{{- set .coordination "mistral" dict -}}{{- end -}}
+{{- if not .coordination.mistral.config -}}{{- set .coordination.mistral "config" dict -}}{{- end -}}
+{{- if not .cors -}}{{- set . "cors" dict -}}{{- end -}}
+{{- if not .cors.oslo -}}{{- set .cors "oslo" dict -}}{{- end -}}
+{{- if not .cors.oslo.middleware -}}{{- set .cors.oslo "middleware" dict -}}{{- end -}}
+{{- if not .cors.oslo.middleware.cors -}}{{- set .cors.oslo.middleware "cors" dict -}}{{- end -}}
+{{- if not .cors.subdomain -}}{{- set .cors "subdomain" dict -}}{{- end -}}
+{{- if not .cors.subdomain.oslo -}}{{- set .cors.subdomain "oslo" dict -}}{{- end -}}
+{{- if not .cors.subdomain.oslo.middleware -}}{{- set .cors.subdomain.oslo "middleware" dict -}}{{- end -}}
+{{- if not .cors.subdomain.oslo.middleware.cors -}}{{- set .cors.subdomain.oslo.middleware "cors" dict -}}{{- end -}}
+{{- if not .database -}}{{- set . "database" dict -}}{{- end -}}
+{{- if not .database.oslo -}}{{- set .database "oslo" dict -}}{{- end -}}
+{{- if not .database.oslo.db -}}{{- set .database.oslo "db" dict -}}{{- end -}}
+{{- if not .engine -}}{{- set . "engine" dict -}}{{- end -}}
+{{- if not .engine.mistral -}}{{- set .engine "mistral" dict -}}{{- end -}}
+{{- if not .engine.mistral.config -}}{{- set .engine.mistral "config" dict -}}{{- end -}}
+{{- if not .event_engine -}}{{- set . "event_engine" dict -}}{{- end -}}
+{{- if not .event_engine.mistral -}}{{- set .event_engine "mistral" dict -}}{{- end -}}
+{{- if not .event_engine.mistral.config -}}{{- set .event_engine.mistral "config" dict -}}{{- end -}}
+{{- if not .execution_expiration_policy -}}{{- set . "execution_expiration_policy" dict -}}{{- end -}}
+{{- if not .execution_expiration_policy.mistral -}}{{- set .execution_expiration_policy "mistral" dict -}}{{- end -}}
+{{- if not .execution_expiration_policy.mistral.config -}}{{- set .execution_expiration_policy.mistral "config" dict -}}{{- end -}}
+{{- if not .executor -}}{{- set . "executor" dict -}}{{- end -}}
+{{- if not .executor.mistral -}}{{- set .executor "mistral" dict -}}{{- end -}}
+{{- if not .executor.mistral.config -}}{{- set .executor.mistral "config" dict -}}{{- end -}}
+{{- if not .keycloak_oidc -}}{{- set . "keycloak_oidc" dict -}}{{- end -}}
+{{- if not .keycloak_oidc.mistral -}}{{- set .keycloak_oidc "mistral" dict -}}{{- end -}}
+{{- if not .keycloak_oidc.mistral.config -}}{{- set .keycloak_oidc.mistral "config" dict -}}{{- end -}}
+{{- if not .keystone_authtoken -}}{{- set . "keystone_authtoken" dict -}}{{- end -}}
+{{- if not .keystone_authtoken.keystonemiddleware -}}{{- set .keystone_authtoken "keystonemiddleware" dict -}}{{- end -}}
+{{- if not .keystone_authtoken.keystonemiddleware.auth_token -}}{{- set .keystone_authtoken.keystonemiddleware "auth_token" dict -}}{{- end -}}
+{{- if not .matchmaker_redis -}}{{- set . "matchmaker_redis" dict -}}{{- end -}}
+{{- if not .matchmaker_redis.oslo -}}{{- set .matchmaker_redis "oslo" dict -}}{{- end -}}
+{{- if not .matchmaker_redis.oslo.messaging -}}{{- set .matchmaker_redis.oslo "messaging" dict -}}{{- end -}}
+{{- if not .oslo_messaging_amqp -}}{{- set . "oslo_messaging_amqp" dict -}}{{- end -}}
+{{- if not .oslo_messaging_amqp.oslo -}}{{- set .oslo_messaging_amqp "oslo" dict -}}{{- end -}}
+{{- if not .oslo_messaging_amqp.oslo.messaging -}}{{- set .oslo_messaging_amqp.oslo "messaging" dict -}}{{- end -}}
+{{- if not .oslo_messaging_notifications -}}{{- set . "oslo_messaging_notifications" dict -}}{{- end -}}
+{{- if not .oslo_messaging_notifications.oslo -}}{{- set .oslo_messaging_notifications "oslo" dict -}}{{- end -}}
+{{- if not .oslo_messaging_notifications.oslo.messaging -}}{{- set .oslo_messaging_notifications.oslo "messaging" dict -}}{{- end -}}
+{{- if not .oslo_messaging_rabbit -}}{{- set . "oslo_messaging_rabbit" dict -}}{{- end -}}
+{{- if not .oslo_messaging_rabbit.oslo -}}{{- set .oslo_messaging_rabbit "oslo" dict -}}{{- end -}}
+{{- if not .oslo_messaging_rabbit.oslo.messaging -}}{{- set .oslo_messaging_rabbit.oslo "messaging" dict -}}{{- end -}}
+{{- if not .oslo_messaging_zmq -}}{{- set . "oslo_messaging_zmq" dict -}}{{- end -}}
+{{- if not .oslo_messaging_zmq.oslo -}}{{- set .oslo_messaging_zmq "oslo" dict -}}{{- end -}}
+{{- if not .oslo_messaging_zmq.oslo.messaging -}}{{- set .oslo_messaging_zmq.oslo "messaging" dict -}}{{- end -}}
+{{- if not .oslo_policy -}}{{- set . "oslo_policy" dict -}}{{- end -}}
+{{- if not .oslo_policy.oslo -}}{{- set .oslo_policy "oslo" dict -}}{{- end -}}
+{{- if not .oslo_policy.oslo.policy -}}{{- set .oslo_policy.oslo "policy" dict -}}{{- end -}}
+{{- if not .pecan -}}{{- set . "pecan" dict -}}{{- end -}}
+{{- if not .pecan.mistral -}}{{- set .pecan "mistral" dict -}}{{- end -}}
+{{- if not .pecan.mistral.config -}}{{- set .pecan.mistral "config" dict -}}{{- end -}}
+{{- if not .profiler -}}{{- set . "profiler" dict -}}{{- end -}}
+{{- if not .profiler.mistral -}}{{- set .profiler "mistral" dict -}}{{- end -}}
+{{- if not .profiler.mistral.config -}}{{- set .profiler.mistral "config" dict -}}{{- end -}}
+{{- if not .ssl -}}{{- set . "ssl" dict -}}{{- end -}}
+{{- if not .ssl.oslo -}}{{- set .ssl "oslo" dict -}}{{- end -}}
+{{- if not .ssl.oslo.service -}}{{- set .ssl.oslo "service" dict -}}{{- end -}}
+{{- if not .ssl.oslo.service.sslutils -}}{{- set .ssl.oslo.service "sslutils" dict -}}{{- end -}}
+
+{{- end -}}
+
+
+{{- define "mistral.conf.mistral" -}}
+
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of
+# the default INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+# from .default.oslo.log.debug
+{{ if not .default.oslo.log.debug }}#{{ end }}debug = {{ .default.oslo.log.debug | default "false" }}
+
+# DEPRECATED: If set to false, the logging level will be set to
+# WARNING instead of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# from .default.oslo.log.verbose
+{{ if not .default.oslo.log.verbose }}#{{ end }}verbose = {{ .default.oslo.log.verbose | default "true" }}
+
+# The name of a logging configuration file. This file is appended to
+# any existing logging configuration files. For details about logging
+# configuration files, see the Python logging module documentation.
+# Note that when logging configuration files are used then all logging
+# configuration is set in the configuration file and other logging
+# configuration options are ignored (for example,
+# logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+# from .default.oslo.log.log_config_append
+{{ if not .default.oslo.log.log_config_append }}#{{ end }}log_config_append = {{ .default.oslo.log.log_config_append | default "<None>" }}
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set.
+# (string value)
+# from .default.oslo.log.log_date_format
+{{ if not .default.oslo.log.log_date_format }}#{{ end }}log_date_format = {{ .default.oslo.log.log_date_format | default "%Y-%m-%d %H:%M:%S" }}
+
+# (Optional) Name of log file to send logging output to. If no default
+# is set, logging will go to stderr as defined by use_stderr. This
+# option is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+# from .default.oslo.log.log_file
+{{ if not .default.oslo.log.log_file }}#{{ end }}log_file = {{ .default.oslo.log.log_file | default "<None>" }}
+
+# (Optional) The base directory used for relative log_file  paths.
+# This option is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+# from .default.oslo.log.log_dir
+{{ if not .default.oslo.log.log_dir }}#{{ end }}log_dir = {{ .default.oslo.log.log_dir | default "<None>" }}
+
+# Uses logging handler designed to watch file system. When log file is
+# moved or removed this handler will open a new log file with
+# specified path instantaneously. It makes sense only if log_file
+# option is specified and Linux platform is used. This option is
+# ignored if log_config_append is set. (boolean value)
+# from .default.oslo.log.watch_log_file
+{{ if not .default.oslo.log.watch_log_file }}#{{ end }}watch_log_file = {{ .default.oslo.log.watch_log_file | default "false" }}
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and
+# will be changed later to honor RFC5424. This option is ignored if
+# log_config_append is set. (boolean value)
+# from .default.oslo.log.use_syslog
+{{ if not .default.oslo.log.use_syslog }}#{{ end }}use_syslog = {{ .default.oslo.log.use_syslog | default "false" }}
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+# from .default.oslo.log.syslog_log_facility
+{{ if not .default.oslo.log.syslog_log_facility }}#{{ end }}syslog_log_facility = {{ .default.oslo.log.syslog_log_facility | default "LOG_USER" }}
+
+# Log output to standard error. This option is ignored if
+# log_config_append is set. (boolean value)
+# from .default.oslo.log.use_stderr
+{{ if not .default.oslo.log.use_stderr }}#{{ end }}use_stderr = {{ .default.oslo.log.use_stderr | default "true" }}
+
+# Format string to use for log messages with context. (string value)
+# from .default.oslo.log.logging_context_format_string
+{{ if not .default.oslo.log.logging_context_format_string }}#{{ end }}logging_context_format_string = {{ .default.oslo.log.logging_context_format_string | default "%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s" }}
+
+# Format string to use for log messages when context is undefined.
+# (string value)
+# from .default.oslo.log.logging_default_format_string
+{{ if not .default.oslo.log.logging_default_format_string }}#{{ end }}logging_default_format_string = {{ .default.oslo.log.logging_default_format_string | default "%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s" }}
+
+# Additional data to append to log message when logging level for the
+# message is DEBUG. (string value)
+# from .default.oslo.log.logging_debug_format_suffix
+{{ if not .default.oslo.log.logging_debug_format_suffix }}#{{ end }}logging_debug_format_suffix = {{ .default.oslo.log.logging_debug_format_suffix | default "%(funcName)s %(pathname)s:%(lineno)d" }}
+
+# Prefix each line of exception output with this format. (string
+# value)
+# from .default.oslo.log.logging_exception_prefix
+{{ if not .default.oslo.log.logging_exception_prefix }}#{{ end }}logging_exception_prefix = {{ .default.oslo.log.logging_exception_prefix | default "%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s" }}
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+# from .default.oslo.log.logging_user_identity_format
+{{ if not .default.oslo.log.logging_user_identity_format }}#{{ end }}logging_user_identity_format = {{ .default.oslo.log.logging_user_identity_format | default "%(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s" }}
+
+# List of package logging levels in logger=LEVEL pairs. This option is
+# ignored if log_config_append is set. (list value)
+# from .default.oslo.log.default_log_levels
+{{ if not .default.oslo.log.default_log_levels }}#{{ end }}default_log_levels = {{ .default.oslo.log.default_log_levels | default "amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO" }}
+
+# Enables or disables publication of error events. (boolean value)
+# from .default.oslo.log.publish_errors
+{{ if not .default.oslo.log.publish_errors }}#{{ end }}publish_errors = {{ .default.oslo.log.publish_errors | default "false" }}
+
+# The format for an instance that is passed with the log message.
+# (string value)
+# from .default.oslo.log.instance_format
+{{ if not .default.oslo.log.instance_format }}#{{ end }}instance_format = {{ .default.oslo.log.instance_format | default "\"[instance: %(uuid)s] \"" }}
+
+# The format for an instance UUID that is passed with the log message.
+# (string value)
+# from .default.oslo.log.instance_uuid_format
+{{ if not .default.oslo.log.instance_uuid_format }}#{{ end }}instance_uuid_format = {{ .default.oslo.log.instance_uuid_format | default "\"[instance: %(uuid)s] \"" }}
+
+# Enables or disables fatal status of deprecations. (boolean value)
+# from .default.oslo.log.fatal_deprecations
+{{ if not .default.oslo.log.fatal_deprecations }}#{{ end }}fatal_deprecations = {{ .default.oslo.log.fatal_deprecations | default "false" }}
+
+#
+# From oslo.messaging
+#
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+# from .default.oslo.messaging.rpc_conn_pool_size
+{{ if not .default.oslo.messaging.rpc_conn_pool_size }}#{{ end }}rpc_conn_pool_size = {{ .default.oslo.messaging.rpc_conn_pool_size | default "30" }}
+
+# The pool size limit for connections expiration policy (integer
+# value)
+# from .default.oslo.messaging.conn_pool_min_size
+{{ if not .default.oslo.messaging.conn_pool_min_size }}#{{ end }}conn_pool_min_size = {{ .default.oslo.messaging.conn_pool_min_size | default "2" }}
+
+# The time-to-live in sec of idle connections in the pool (integer
+# value)
+# from .default.oslo.messaging.conn_pool_ttl
+{{ if not .default.oslo.messaging.conn_pool_ttl }}#{{ end }}conn_pool_ttl = {{ .default.oslo.messaging.conn_pool_ttl | default "1200" }}
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve to this
+# address. (string value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_bind_address
+# from .default.oslo.messaging.rpc_zmq_bind_address
+{{ if not .default.oslo.messaging.rpc_zmq_bind_address }}#{{ end }}rpc_zmq_bind_address = {{ .default.oslo.messaging.rpc_zmq_bind_address | default "*" }}
+
+# MatchMaker driver. (string value)
+# Allowed values: redis, dummy
+# Deprecated group/name - [DEFAULT]/rpc_zmq_matchmaker
+# from .default.oslo.messaging.rpc_zmq_matchmaker
+{{ if not .default.oslo.messaging.rpc_zmq_matchmaker }}#{{ end }}rpc_zmq_matchmaker = {{ .default.oslo.messaging.rpc_zmq_matchmaker | default "redis" }}
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_contexts
+# from .default.oslo.messaging.rpc_zmq_contexts
+{{ if not .default.oslo.messaging.rpc_zmq_contexts }}#{{ end }}rpc_zmq_contexts = {{ .default.oslo.messaging.rpc_zmq_contexts | default "1" }}
+
+# Maximum number of ingress messages to locally buffer per topic.
+# Default is unlimited. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_topic_backlog
+# from .default.oslo.messaging.rpc_zmq_topic_backlog
+{{ if not .default.oslo.messaging.rpc_zmq_topic_backlog }}#{{ end }}rpc_zmq_topic_backlog = {{ .default.oslo.messaging.rpc_zmq_topic_backlog | default "<None>" }}
+
+# Directory for holding IPC sockets. (string value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_ipc_dir
+# from .default.oslo.messaging.rpc_zmq_ipc_dir
+{{ if not .default.oslo.messaging.rpc_zmq_ipc_dir }}#{{ end }}rpc_zmq_ipc_dir = {{ .default.oslo.messaging.rpc_zmq_ipc_dir | default "/var/run/openstack" }}
+
+# Name of this node. Must be a valid hostname, FQDN, or IP address.
+# Must match "host" option, if running Nova. (string value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_host
+# from .default.oslo.messaging.rpc_zmq_host
+{{ if not .default.oslo.messaging.rpc_zmq_host }}#{{ end }}rpc_zmq_host = {{ .default.oslo.messaging.rpc_zmq_host | default "localhost" }}
+
+# Seconds to wait before a cast expires (TTL). The default value of -1
+# specifies an infinite linger period. The value of 0 specifies no
+# linger period. Pending messages shall be discarded immediately when
+# the socket is closed. Only supported by impl_zmq. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_cast_timeout
+# from .default.oslo.messaging.rpc_cast_timeout
+{{ if not .default.oslo.messaging.rpc_cast_timeout }}#{{ end }}rpc_cast_timeout = {{ .default.oslo.messaging.rpc_cast_timeout | default "-1" }}
+
+# The default number of seconds that poll should wait. Poll raises
+# timeout exception when timeout expired. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_poll_timeout
+# from .default.oslo.messaging.rpc_poll_timeout
+{{ if not .default.oslo.messaging.rpc_poll_timeout }}#{{ end }}rpc_poll_timeout = {{ .default.oslo.messaging.rpc_poll_timeout | default "1" }}
+
+# Expiration timeout in seconds of a name service record about
+# existing target ( < 0 means no timeout). (integer value)
+# Deprecated group/name - [DEFAULT]/zmq_target_expire
+# from .default.oslo.messaging.zmq_target_expire
+{{ if not .default.oslo.messaging.zmq_target_expire }}#{{ end }}zmq_target_expire = {{ .default.oslo.messaging.zmq_target_expire | default "300" }}
+
+# Update period in seconds of a name service record about existing
+# target. (integer value)
+# Deprecated group/name - [DEFAULT]/zmq_target_update
+# from .default.oslo.messaging.zmq_target_update
+{{ if not .default.oslo.messaging.zmq_target_update }}#{{ end }}zmq_target_update = {{ .default.oslo.messaging.zmq_target_update | default "180" }}
+
+# Use PUB/SUB pattern for fanout methods. PUB/SUB always uses proxy.
+# (boolean value)
+# Deprecated group/name - [DEFAULT]/use_pub_sub
+# from .default.oslo.messaging.use_pub_sub
+{{ if not .default.oslo.messaging.use_pub_sub }}#{{ end }}use_pub_sub = {{ .default.oslo.messaging.use_pub_sub | default "true" }}
+
+# Use ROUTER remote proxy. (boolean value)
+# Deprecated group/name - [DEFAULT]/use_router_proxy
+# from .default.oslo.messaging.use_router_proxy
+{{ if not .default.oslo.messaging.use_router_proxy }}#{{ end }}use_router_proxy = {{ .default.oslo.messaging.use_router_proxy | default "true" }}
+
+# Minimal port number for random ports range. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# Deprecated group/name - [DEFAULT]/rpc_zmq_min_port
+# from .default.oslo.messaging.rpc_zmq_min_port
+{{ if not .default.oslo.messaging.rpc_zmq_min_port }}#{{ end }}rpc_zmq_min_port = {{ .default.oslo.messaging.rpc_zmq_min_port | default "49153" }}
+
+# Maximal port number for random ports range. (integer value)
+# Minimum value: 1
+# Maximum value: 65536
+# Deprecated group/name - [DEFAULT]/rpc_zmq_max_port
+# from .default.oslo.messaging.rpc_zmq_max_port
+{{ if not .default.oslo.messaging.rpc_zmq_max_port }}#{{ end }}rpc_zmq_max_port = {{ .default.oslo.messaging.rpc_zmq_max_port | default "65536" }}
+
+# Number of retries to find free port number before fail with
+# ZMQBindError. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_bind_port_retries
+# from .default.oslo.messaging.rpc_zmq_bind_port_retries
+{{ if not .default.oslo.messaging.rpc_zmq_bind_port_retries }}#{{ end }}rpc_zmq_bind_port_retries = {{ .default.oslo.messaging.rpc_zmq_bind_port_retries | default "100" }}
+
+# Default serialization mechanism for serializing/deserializing
+# outgoing/incoming messages (string value)
+# Allowed values: json, msgpack
+# Deprecated group/name - [DEFAULT]/rpc_zmq_serialization
+# from .default.oslo.messaging.rpc_zmq_serialization
+{{ if not .default.oslo.messaging.rpc_zmq_serialization }}#{{ end }}rpc_zmq_serialization = {{ .default.oslo.messaging.rpc_zmq_serialization | default "json" }}
+
+# This option configures round-robin mode in zmq socket. True means
+# not keeping a queue when server side disconnects. False means to
+# keep queue and messages even if server is disconnected, when the
+# server appears we send all accumulated messages to it. (boolean
+# value)
+# from .default.oslo.messaging.zmq_immediate
+{{ if not .default.oslo.messaging.zmq_immediate }}#{{ end }}zmq_immediate = {{ .default.oslo.messaging.zmq_immediate | default "false" }}
+
+# Size of executor thread pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_thread_pool_size
+# from .default.oslo.messaging.executor_thread_pool_size
+{{ if not .default.oslo.messaging.executor_thread_pool_size }}#{{ end }}executor_thread_pool_size = {{ .default.oslo.messaging.executor_thread_pool_size | default "64" }}
+
+# Seconds to wait for a response from a call. (integer value)
+# from .default.oslo.messaging.rpc_response_timeout
+{{ if not .default.oslo.messaging.rpc_response_timeout }}#{{ end }}rpc_response_timeout = {{ .default.oslo.messaging.rpc_response_timeout | default "60" }}
+
+# A URL representing the messaging driver to use and its full
+# configuration. (string value)
+# from .default.oslo.messaging.transport_url
+{{ if not .default.oslo.messaging.transport_url }}#{{ end }}transport_url = {{ .default.oslo.messaging.transport_url | default "<None>" }}
+
+# DEPRECATED: The messaging driver to use, defaults to rabbit. Other
+# drivers include amqp and zmq. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .default.oslo.messaging.rpc_backend
+{{ if not .default.oslo.messaging.rpc_backend }}#{{ end }}rpc_backend = {{ .default.oslo.messaging.rpc_backend | default "rabbit" }}
+
+# The default exchange under which topics are scoped. May be
+# overridden by an exchange name specified in the transport_url
+# option. (string value)
+# from .default.oslo.messaging.control_exchange
+{{ if not .default.oslo.messaging.control_exchange }}#{{ end }}control_exchange = {{ .default.oslo.messaging.control_exchange | default "openstack" }}
+
+
+[api]
+
+#
+# From mistral.config
+#
+
+# Mistral API server host (string value)
+# from .api.mistral.config.host
+{{ if not .api.mistral.config.host }}#{{ end }}host = {{ .api.mistral.config.host | default "0.0.0.0" }}
+
+# Mistral API server port (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# from .api.mistral.config.port
+{{ if not .api.mistral.config.port }}#{{ end }}port = {{ .api.mistral.config.port | default "8989" }}
+
+# Enables the ability to delete action_execution which has no
+# relationship with workflows. (boolean value)
+# from .api.mistral.config.allow_action_execution_deletion
+{{ if not .api.mistral.config.allow_action_execution_deletion }}#{{ end }}allow_action_execution_deletion = {{ .api.mistral.config.allow_action_execution_deletion | default "false" }}
+
+# Enable the integrated stand-alone API to service requestsvia HTTPS
+# instead of HTTP. (boolean value)
+# from .api.mistral.config.enable_ssl_api
+{{ if not .api.mistral.config.enable_ssl_api }}#{{ end }}enable_ssl_api = {{ .api.mistral.config.enable_ssl_api | default "false" }}
+
+# Number of workers for Mistral API service default is equal to the
+# number of CPUs available if that can be determined, else a default
+# worker count of 1 is returned. (integer value)
+# from .api.mistral.config.api_workers
+{{ if not .api.mistral.config.api_workers }}#{{ end }}api_workers = {{ .api.mistral.config.api_workers | default "<None>" }}
+
+
+[coordination]
+
+#
+# From mistral.config
+#
+
+# The backend URL to be used for coordination (string value)
+# from .coordination.mistral.config.backend_url
+{{ if not .coordination.mistral.config.backend_url }}#{{ end }}backend_url = {{ .coordination.mistral.config.backend_url | default "<None>" }}
+
+# Number of seconds between heartbeats for coordination. (floating
+# point value)
+# from .coordination.mistral.config.heartbeat_interval
+{{ if not .coordination.mistral.config.heartbeat_interval }}#{{ end }}heartbeat_interval = {{ .coordination.mistral.config.heartbeat_interval | default "5.0" }}
+
+
+[cors]
+
+#
+# From oslo.middleware.cors
+#
+
+# Indicate whether this resource may be shared with the domain
+# received in the requests "origin" header. Format:
+# "<protocol>://<host>[:<port>]", no trailing slash. Example:
+# https://horizon.example.com (list value)
+# from .cors.oslo.middleware.cors.allowed_origin
+{{ if not .cors.oslo.middleware.cors.allowed_origin }}#{{ end }}allowed_origin = {{ .cors.oslo.middleware.cors.allowed_origin | default "<None>" }}
+
+# Indicate that the actual request can include user credentials
+# (boolean value)
+# from .cors.oslo.middleware.cors.allow_credentials
+{{ if not .cors.oslo.middleware.cors.allow_credentials }}#{{ end }}allow_credentials = {{ .cors.oslo.middleware.cors.allow_credentials | default "true" }}
+
+# Indicate which headers are safe to expose to the API. Defaults to
+# HTTP Simple Headers. (list value)
+# from .cors.oslo.middleware.cors.expose_headers
+{{ if not .cors.oslo.middleware.cors.expose_headers }}#{{ end }}expose_headers = {{ .cors.oslo.middleware.cors.expose_headers | default "X-Auth-Token,X-Subject-Token,X-Service-Token,X-Project-Id,X-User-Name,X-Project-Name" }}
+
+# Maximum cache age of CORS preflight requests. (integer value)
+# from .cors.oslo.middleware.cors.max_age
+{{ if not .cors.oslo.middleware.cors.max_age }}#{{ end }}max_age = {{ .cors.oslo.middleware.cors.max_age | default "3600" }}
+
+# Indicate which methods can be used during the actual request. (list
+# value)
+# from .cors.oslo.middleware.cors.allow_methods
+{{ if not .cors.oslo.middleware.cors.allow_methods }}#{{ end }}allow_methods = {{ .cors.oslo.middleware.cors.allow_methods | default "GET,PUT,POST,DELETE,PATCH" }}
+
+# Indicate which header field names may be used during the actual
+# request. (list value)
+# from .cors.oslo.middleware.cors.allow_headers
+{{ if not .cors.oslo.middleware.cors.allow_headers }}#{{ end }}allow_headers = {{ .cors.oslo.middleware.cors.allow_headers | default "X-Auth-Token,X-Identity-Status,X-Roles,X-Service-Catalog,X-User-Id,X-Tenant-Id,X-Project-Id,X-User-Name,X-Project-Name" }}
+
+
+[cors.subdomain]
+
+#
+# From oslo.middleware.cors
+#
+
+# Indicate whether this resource may be shared with the domain
+# received in the requests "origin" header. Format:
+# "<protocol>://<host>[:<port>]", no trailing slash. Example:
+# https://horizon.example.com (list value)
+# from .cors.subdomain.oslo.middleware.cors.allowed_origin
+{{ if not .cors.subdomain.oslo.middleware.cors.allowed_origin }}#{{ end }}allowed_origin = {{ .cors.subdomain.oslo.middleware.cors.allowed_origin | default "<None>" }}
+
+# Indicate that the actual request can include user credentials
+# (boolean value)
+# from .cors.subdomain.oslo.middleware.cors.allow_credentials
+{{ if not .cors.subdomain.oslo.middleware.cors.allow_credentials }}#{{ end }}allow_credentials = {{ .cors.subdomain.oslo.middleware.cors.allow_credentials | default "true" }}
+
+# Indicate which headers are safe to expose to the API. Defaults to
+# HTTP Simple Headers. (list value)
+# from .cors.subdomain.oslo.middleware.cors.expose_headers
+{{ if not .cors.subdomain.oslo.middleware.cors.expose_headers }}#{{ end }}expose_headers = {{ .cors.subdomain.oslo.middleware.cors.expose_headers | default "X-Auth-Token,X-Subject-Token,X-Service-Token,X-Project-Id,X-User-Name,X-Project-Name" }}
+
+# Maximum cache age of CORS preflight requests. (integer value)
+# from .cors.subdomain.oslo.middleware.cors.max_age
+{{ if not .cors.subdomain.oslo.middleware.cors.max_age }}#{{ end }}max_age = {{ .cors.subdomain.oslo.middleware.cors.max_age | default "3600" }}
+
+# Indicate which methods can be used during the actual request. (list
+# value)
+# from .cors.subdomain.oslo.middleware.cors.allow_methods
+{{ if not .cors.subdomain.oslo.middleware.cors.allow_methods }}#{{ end }}allow_methods = {{ .cors.subdomain.oslo.middleware.cors.allow_methods | default "GET,PUT,POST,DELETE,PATCH" }}
+
+# Indicate which header field names may be used during the actual
+# request. (list value)
+# from .cors.subdomain.oslo.middleware.cors.allow_headers
+{{ if not .cors.subdomain.oslo.middleware.cors.allow_headers }}#{{ end }}allow_headers = {{ .cors.subdomain.oslo.middleware.cors.allow_headers | default "X-Auth-Token,X-Identity-Status,X-Roles,X-Service-Catalog,X-User-Id,X-Tenant-Id,X-Project-Id,X-User-Name,X-Project-Name" }}
+
+
+[database]
+
+#
+# From oslo.db
+#
+
+# DEPRECATED: The file name to use with SQLite. (string value)
+# Deprecated group/name - [DEFAULT]/sqlite_db
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Should use config option connection or slave_connection to
+# connect the database.
+# from .database.oslo.db.sqlite_db
+{{ if not .database.oslo.db.sqlite_db }}#{{ end }}sqlite_db = {{ .database.oslo.db.sqlite_db | default "oslo.sqlite" }}
+
+# If True, SQLite uses synchronous mode. (boolean value)
+# Deprecated group/name - [DEFAULT]/sqlite_synchronous
+# from .database.oslo.db.sqlite_synchronous
+{{ if not .database.oslo.db.sqlite_synchronous }}#{{ end }}sqlite_synchronous = {{ .database.oslo.db.sqlite_synchronous | default "true" }}
+
+# The back end to use for the database. (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+# from .database.oslo.db.backend
+{{ if not .database.oslo.db.backend }}#{{ end }}backend = {{ .database.oslo.db.backend | default "sqlalchemy" }}
+
+# The SQLAlchemy connection string to use to connect to the database.
+# (string value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+# from .database.oslo.db.connection
+{{ if not .database.oslo.db.connection }}#{{ end }}connection = {{ .database.oslo.db.connection | default "<None>" }}
+
+# The SQLAlchemy connection string to use to connect to the slave
+# database. (string value)
+# from .database.oslo.db.slave_connection
+{{ if not .database.oslo.db.slave_connection }}#{{ end }}slave_connection = {{ .database.oslo.db.slave_connection | default "<None>" }}
+
+# The SQL mode to be used for MySQL sessions. This option, including
+# the default, overrides any server-set SQL mode. To use whatever SQL
+# mode is set by the server configuration, set this to no value.
+# Example: mysql_sql_mode= (string value)
+# from .database.oslo.db.mysql_sql_mode
+{{ if not .database.oslo.db.mysql_sql_mode }}#{{ end }}mysql_sql_mode = {{ .database.oslo.db.mysql_sql_mode | default "TRADITIONAL" }}
+
+# Timeout before idle SQL connections are reaped. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+# from .database.oslo.db.idle_timeout
+{{ if not .database.oslo.db.idle_timeout }}#{{ end }}idle_timeout = {{ .database.oslo.db.idle_timeout | default "3600" }}
+
+# Minimum number of SQL connections to keep open in a pool. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+# from .database.oslo.db.min_pool_size
+{{ if not .database.oslo.db.min_pool_size }}#{{ end }}min_pool_size = {{ .database.oslo.db.min_pool_size | default "1" }}
+
+# Maximum number of SQL connections to keep open in a pool. Setting a
+# value of 0 indicates no limit. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+# from .database.oslo.db.max_pool_size
+{{ if not .database.oslo.db.max_pool_size }}#{{ end }}max_pool_size = {{ .database.oslo.db.max_pool_size | default "5" }}
+
+# Maximum number of database connection retries during startup. Set to
+# -1 to specify an infinite retry count. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+# from .database.oslo.db.max_retries
+{{ if not .database.oslo.db.max_retries }}#{{ end }}max_retries = {{ .database.oslo.db.max_retries | default "10" }}
+
+# Interval between retries of opening a SQL connection. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+# from .database.oslo.db.retry_interval
+{{ if not .database.oslo.db.retry_interval }}#{{ end }}retry_interval = {{ .database.oslo.db.retry_interval | default "10" }}
+
+# If set, use this value for max_overflow with SQLAlchemy. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+# from .database.oslo.db.max_overflow
+{{ if not .database.oslo.db.max_overflow }}#{{ end }}max_overflow = {{ .database.oslo.db.max_overflow | default "50" }}
+
+# Verbosity of SQL debugging information: 0=None, 100=Everything.
+# (integer value)
+# Minimum value: 0
+# Maximum value: 100
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+# from .database.oslo.db.connection_debug
+{{ if not .database.oslo.db.connection_debug }}#{{ end }}connection_debug = {{ .database.oslo.db.connection_debug | default "0" }}
+
+# Add Python stack traces to SQL as comment strings. (boolean value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+# from .database.oslo.db.connection_trace
+{{ if not .database.oslo.db.connection_trace }}#{{ end }}connection_trace = {{ .database.oslo.db.connection_trace | default "false" }}
+
+# If set, use this value for pool_timeout with SQLAlchemy. (integer
+# value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+# from .database.oslo.db.pool_timeout
+{{ if not .database.oslo.db.pool_timeout }}#{{ end }}pool_timeout = {{ .database.oslo.db.pool_timeout | default "<None>" }}
+
+# Enable the experimental use of database reconnect on connection
+# lost. (boolean value)
+# from .database.oslo.db.use_db_reconnect
+{{ if not .database.oslo.db.use_db_reconnect }}#{{ end }}use_db_reconnect = {{ .database.oslo.db.use_db_reconnect | default "false" }}
+
+# Seconds between retries of a database transaction. (integer value)
+# from .database.oslo.db.db_retry_interval
+{{ if not .database.oslo.db.db_retry_interval }}#{{ end }}db_retry_interval = {{ .database.oslo.db.db_retry_interval | default "1" }}
+
+# If True, increases the interval between retries of a database
+# operation up to db_max_retry_interval. (boolean value)
+# from .database.oslo.db.db_inc_retry_interval
+{{ if not .database.oslo.db.db_inc_retry_interval }}#{{ end }}db_inc_retry_interval = {{ .database.oslo.db.db_inc_retry_interval | default "true" }}
+
+# If db_inc_retry_interval is set, the maximum seconds between retries
+# of a database operation. (integer value)
+# from .database.oslo.db.db_max_retry_interval
+{{ if not .database.oslo.db.db_max_retry_interval }}#{{ end }}db_max_retry_interval = {{ .database.oslo.db.db_max_retry_interval | default "10" }}
+
+# Maximum retries in case of connection error or deadlock error before
+# error is raised. Set to -1 to specify an infinite retry count.
+# (integer value)
+# from .database.oslo.db.db_max_retries
+{{ if not .database.oslo.db.db_max_retries }}#{{ end }}db_max_retries = {{ .database.oslo.db.db_max_retries | default "20" }}
+
+
+[engine]
+
+#
+# From mistral.config
+#
+
+# Mistral engine plugin (string value)
+# from .engine.mistral.config.engine
+{{ if not .engine.mistral.config.engine }}#{{ end }}engine = {{ .engine.mistral.config.engine | default "default" }}
+
+# Name of the engine node. This can be an opaque identifier. It is not
+# necessarily a hostname, FQDN, or IP address. (string value)
+# from .engine.mistral.config.host
+{{ if not .engine.mistral.config.host }}#{{ end }}host = {{ .engine.mistral.config.host | default "0.0.0.0" }}
+
+# The message topic that the engine listens on. (string value)
+# from .engine.mistral.config.topic
+{{ if not .engine.mistral.config.topic }}#{{ end }}topic = {{ .engine.mistral.config.topic | default "mistral_engine" }}
+
+# The version of the engine. (string value)
+# from .engine.mistral.config.version
+{{ if not .engine.mistral.config.version }}#{{ end }}version = {{ .engine.mistral.config.version | default "1.0" }}
+
+# The default maximum size in KB of large text fields of runtime
+# execution objects. Use -1 for no limit. (integer value)
+# from .engine.mistral.config.execution_field_size_limit_kb
+{{ if not .engine.mistral.config.execution_field_size_limit_kb }}#{{ end }}execution_field_size_limit_kb = {{ .engine.mistral.config.execution_field_size_limit_kb | default "1024" }}
+
+
+[event_engine]
+
+#
+# From mistral.config
+#
+
+# Name of the event engine node. This can be an opaque identifier. It
+# is not necessarily a hostname, FQDN, or IP address. (string value)
+# from .event_engine.mistral.config.host
+{{ if not .event_engine.mistral.config.host }}#{{ end }}host = {{ .event_engine.mistral.config.host | default "0.0.0.0" }}
+
+# The message topic that the event engine listens on. (string value)
+# from .event_engine.mistral.config.topic
+{{ if not .event_engine.mistral.config.topic }}#{{ end }}topic = {{ .event_engine.mistral.config.topic | default "mistral_event_engine" }}
+
+# Configuration file for event definitions. (string value)
+# from .event_engine.mistral.config.event_definitions_cfg_file
+{{ if not .event_engine.mistral.config.event_definitions_cfg_file }}#{{ end }}event_definitions_cfg_file = {{ .event_engine.mistral.config.event_definitions_cfg_file | default "/etc/mistral/event_definitions.yaml" }}
+
+
+[execution_expiration_policy]
+
+#
+# From mistral.config
+#
+
+# How often will the executions be evaluated (in minutes). For example
+# for value 120 the interval will be 2 hours (every 2 hours). (integer
+# value)
+# from .execution_expiration_policy.mistral.config.evaluation_interval
+{{ if not .execution_expiration_policy.mistral.config.evaluation_interval }}#{{ end }}evaluation_interval = {{ .execution_expiration_policy.mistral.config.evaluation_interval | default "<None>" }}
+
+# Evaluate from which time remove executions in minutes. For example
+# when older_than = 60, remove all executions that finished a 60
+# minutes ago or more. Minimum value is 1. Note that only final state
+# execution will remove ( SUCCESS / ERROR ). (integer value)
+# from .execution_expiration_policy.mistral.config.older_than
+{{ if not .execution_expiration_policy.mistral.config.older_than }}#{{ end }}older_than = {{ .execution_expiration_policy.mistral.config.older_than | default "<None>" }}
+
+
+[executor]
+
+#
+# From mistral.config
+#
+
+# Name of the executor node. This can be an opaque identifier. It is
+# not necessarily a hostname, FQDN, or IP address. (string value)
+# from .executor.mistral.config.host
+{{ if not .executor.mistral.config.host }}#{{ end }}host = {{ .executor.mistral.config.host | default "0.0.0.0" }}
+
+# The message topic that the executor listens on. (string value)
+# from .executor.mistral.config.topic
+{{ if not .executor.mistral.config.topic }}#{{ end }}topic = {{ .executor.mistral.config.topic | default "mistral_executor" }}
+
+# The version of the executor. (string value)
+# from .executor.mistral.config.version
+{{ if not .executor.mistral.config.version }}#{{ end }}version = {{ .executor.mistral.config.version | default "1.0" }}
+
+
+[keycloak_oidc]
+
+#
+# From mistral.config
+#
+
+# Keycloak base url (e.g. https://my.keycloak:8443/auth) (string
+# value)
+# from .keycloak_oidc.mistral.config.auth_url
+{{ if not .keycloak_oidc.mistral.config.auth_url }}#{{ end }}auth_url = {{ .keycloak_oidc.mistral.config.auth_url | default "<None>" }}
+
+# If True, SSL/TLS certificate verification is disabled (string value)
+# from .keycloak_oidc.mistral.config.insecure
+{{ if not .keycloak_oidc.mistral.config.insecure }}#{{ end }}insecure = {{ .keycloak_oidc.mistral.config.insecure | default "False" }}
+
+
+[keystone_authtoken]
+
+# FIXME(alanmeadows) - added the next several lines because oslo gen config refuses to generate the line items required in keystonemiddleware
+# for authentication - while it does support an "auth_section" parameter to locate these elsewhere, it would be a strange divergence
+# from how neutron keystone authentication is stored today - ocata and later appear to use a "service" user section which can house these details
+# and does successfully generate beyond newton, so likely this whole section will be removed the next time we generate this file
+
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.auth_url }}#{{ end }}auth_url = {{ .keystone_authtoken.keystonemiddleware.auth_token.auth_url | default "<None>" }}
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.region_name }}#{{ end }}region_name = {{ .keystone_authtoken.keystonemiddleware.auth_token.region_name | default "<None>" }}
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.project_name }}#{{ end }}project_name = {{ .keystone_authtoken.keystonemiddleware.auth_token.project_name | default "<None>" }}
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.project_domain_name }}#{{ end }}project_domain_name = {{ .keystone_authtoken.keystonemiddleware.auth_token.project_domain_name | default "<None>" }}
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.user_domain_name }}#{{ end }}user_domain_name = {{ .keystone_authtoken.keystonemiddleware.auth_token.user_domain_name | default "<None>" }}
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.username }}#{{ end }}username = {{ .keystone_authtoken.keystonemiddleware.auth_token.username | default "<None>" }}
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.password }}#{{ end }}password = {{ .keystone_authtoken.keystonemiddleware.auth_token.password | default "<None>" }}
+
+# FIXME(alanmeadows) - added for some newton images using older keystoneauth1 libs but are still "newton"
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.auth_url }}#{{ end }}auth_url = {{ .keystone_authtoken.keystonemiddleware.auth_token.auth_url | default "<None>" }}
+
+#
+# From keystonemiddleware.auth_token
+#
+
+# Complete "public" Identity API endpoint. This endpoint should not be
+# an "admin" endpoint, as it should be accessible by all end users.
+# Unauthenticated clients are redirected to this endpoint to
+# authenticate. Although this endpoint should  ideally be unversioned,
+# client support in the wild varies.  If you're using a versioned v2
+# endpoint here, then this  should *not* be the same endpoint the
+# service user utilizes  for validating tokens, because normal end
+# users may not be  able to reach that endpoint. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.auth_uri
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.auth_uri }}#{{ end }}auth_uri = {{ .keystone_authtoken.keystonemiddleware.auth_token.auth_uri | default "<None>" }}
+
+# API version of the admin Identity API endpoint. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.auth_version
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.auth_version }}#{{ end }}auth_version = {{ .keystone_authtoken.keystonemiddleware.auth_token.auth_version | default "<None>" }}
+
+# Do not handle authorization requests within the middleware, but
+# delegate the authorization decision to downstream WSGI components.
+# (boolean value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.delay_auth_decision
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.delay_auth_decision }}#{{ end }}delay_auth_decision = {{ .keystone_authtoken.keystonemiddleware.auth_token.delay_auth_decision | default "false" }}
+
+# Request timeout value for communicating with Identity API server.
+# (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.http_connect_timeout
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.http_connect_timeout }}#{{ end }}http_connect_timeout = {{ .keystone_authtoken.keystonemiddleware.auth_token.http_connect_timeout | default "<None>" }}
+
+# How many times are we trying to reconnect when communicating with
+# Identity API Server. (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.http_request_max_retries
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.http_request_max_retries }}#{{ end }}http_request_max_retries = {{ .keystone_authtoken.keystonemiddleware.auth_token.http_request_max_retries | default "3" }}
+
+# Request environment key where the Swift cache object is stored. When
+# auth_token middleware is deployed with a Swift cache, use this
+# option to have the middleware share a caching backend with swift.
+# Otherwise, use the ``memcached_servers`` option instead. (string
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.cache
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.cache }}#{{ end }}cache = {{ .keystone_authtoken.keystonemiddleware.auth_token.cache | default "<None>" }}
+
+# Required if identity server requires client certificate (string
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.certfile
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.certfile }}#{{ end }}certfile = {{ .keystone_authtoken.keystonemiddleware.auth_token.certfile | default "<None>" }}
+
+# Required if identity server requires client certificate (string
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.keyfile
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.keyfile }}#{{ end }}keyfile = {{ .keystone_authtoken.keystonemiddleware.auth_token.keyfile | default "<None>" }}
+
+# A PEM encoded Certificate Authority to use when verifying HTTPs
+# connections. Defaults to system CAs. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.cafile
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.cafile }}#{{ end }}cafile = {{ .keystone_authtoken.keystonemiddleware.auth_token.cafile | default "<None>" }}
+
+# Verify HTTPS connections. (boolean value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.insecure
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.insecure }}#{{ end }}insecure = {{ .keystone_authtoken.keystonemiddleware.auth_token.insecure | default "false" }}
+
+# The region in which the identity server can be found. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.region_name
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.region_name }}#{{ end }}region_name = {{ .keystone_authtoken.keystonemiddleware.auth_token.region_name | default "<None>" }}
+
+# Directory used to cache files related to PKI tokens. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.signing_dir
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.signing_dir }}#{{ end }}signing_dir = {{ .keystone_authtoken.keystonemiddleware.auth_token.signing_dir | default "<None>" }}
+
+# Optionally specify a list of memcached server(s) to use for caching.
+# If left undefined, tokens will instead be cached in-process. (list
+# value)
+# Deprecated group/name - [keystone_authtoken]/memcache_servers
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcached_servers
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcached_servers }}#{{ end }}memcached_servers = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcached_servers | default "<None>" }}
+
+# In order to prevent excessive effort spent validating tokens, the
+# middleware caches previously-seen tokens for a configurable duration
+# (in seconds). Set to -1 to disable caching completely. (integer
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.token_cache_time
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.token_cache_time }}#{{ end }}token_cache_time = {{ .keystone_authtoken.keystonemiddleware.auth_token.token_cache_time | default "300" }}
+
+# Determines the frequency at which the list of revoked tokens is
+# retrieved from the Identity service (in seconds). A high number of
+# revocation events combined with a low cache duration may
+# significantly reduce performance. Only valid for PKI tokens.
+# (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.revocation_cache_time
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.revocation_cache_time }}#{{ end }}revocation_cache_time = {{ .keystone_authtoken.keystonemiddleware.auth_token.revocation_cache_time | default "10" }}
+
+# (Optional) If defined, indicate whether token data should be
+# authenticated or authenticated and encrypted. If MAC, token data is
+# authenticated (with HMAC) in the cache. If ENCRYPT, token data is
+# encrypted and authenticated in the cache. If the value is not one of
+# these options or empty, auth_token will raise an exception on
+# initialization. (string value)
+# Allowed values: None, MAC, ENCRYPT
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_security_strategy
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_security_strategy }}#{{ end }}memcache_security_strategy = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_security_strategy | default "None" }}
+
+# (Optional, mandatory if memcache_security_strategy is defined) This
+# string is used for key derivation. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_secret_key
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_secret_key }}#{{ end }}memcache_secret_key = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_secret_key | default "<None>" }}
+
+# (Optional) Number of seconds memcached server is considered dead
+# before it is tried again. (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_dead_retry
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_dead_retry }}#{{ end }}memcache_pool_dead_retry = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_dead_retry | default "300" }}
+
+# (Optional) Maximum total number of open connections to every
+# memcached server. (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_maxsize
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_maxsize }}#{{ end }}memcache_pool_maxsize = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_maxsize | default "10" }}
+
+# (Optional) Socket timeout in seconds for communicating with a
+# memcached server. (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_socket_timeout
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_socket_timeout }}#{{ end }}memcache_pool_socket_timeout = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_socket_timeout | default "3" }}
+
+# (Optional) Number of seconds a connection to memcached is held
+# unused in the pool before it is closed. (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_unused_timeout
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_unused_timeout }}#{{ end }}memcache_pool_unused_timeout = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_unused_timeout | default "60" }}
+
+# (Optional) Number of seconds that an operation will wait to get a
+# memcached client connection from the pool. (integer value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_conn_get_timeout
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_conn_get_timeout }}#{{ end }}memcache_pool_conn_get_timeout = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_pool_conn_get_timeout | default "10" }}
+
+# (Optional) Use the advanced (eventlet safe) memcached client pool.
+# The advanced pool will only work under python 2.x. (boolean value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.memcache_use_advanced_pool
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.memcache_use_advanced_pool }}#{{ end }}memcache_use_advanced_pool = {{ .keystone_authtoken.keystonemiddleware.auth_token.memcache_use_advanced_pool | default "false" }}
+
+# (Optional) Indicate whether to set the X-Service-Catalog header. If
+# False, middleware will not ask for service catalog on token
+# validation and will not set the X-Service-Catalog header. (boolean
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.include_service_catalog
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.include_service_catalog }}#{{ end }}include_service_catalog = {{ .keystone_authtoken.keystonemiddleware.auth_token.include_service_catalog | default "true" }}
+
+# Used to control the use and type of token binding. Can be set to:
+# "disabled" to not check token binding. "permissive" (default) to
+# validate binding information if the bind type is of a form known to
+# the server and ignore it if not. "strict" like "permissive" but if
+# the bind type is unknown the token will be rejected. "required" any
+# form of token binding is needed to be allowed. Finally the name of a
+# binding method that must be present in tokens. (string value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.enforce_token_bind
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.enforce_token_bind }}#{{ end }}enforce_token_bind = {{ .keystone_authtoken.keystonemiddleware.auth_token.enforce_token_bind | default "permissive" }}
+
+# If true, the revocation list will be checked for cached tokens. This
+# requires that PKI tokens are configured on the identity server.
+# (boolean value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.check_revocations_for_cached
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.check_revocations_for_cached }}#{{ end }}check_revocations_for_cached = {{ .keystone_authtoken.keystonemiddleware.auth_token.check_revocations_for_cached | default "false" }}
+
+# Hash algorithms to use for hashing PKI tokens. This may be a single
+# algorithm or multiple. The algorithms are those supported by Python
+# standard hashlib.new(). The hashes will be tried in the order given,
+# so put the preferred one first for performance. The result of the
+# first hash will be stored in the cache. This will typically be set
+# to multiple values only while migrating from a less secure algorithm
+# to a more secure one. Once all the old tokens are expired this
+# option should be set to a single value for better performance. (list
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.hash_algorithms
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.hash_algorithms }}#{{ end }}hash_algorithms = {{ .keystone_authtoken.keystonemiddleware.auth_token.hash_algorithms | default "md5" }}
+
+# Authentication type to load (string value)
+# Deprecated group/name - [keystone_authtoken]/auth_plugin
+# from .keystone_authtoken.keystonemiddleware.auth_token.auth_type
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.auth_type }}#{{ end }}auth_type = {{ .keystone_authtoken.keystonemiddleware.auth_token.auth_type | default "<None>" }}
+
+# Config Section from which to load plugin specific options (string
+# value)
+# from .keystone_authtoken.keystonemiddleware.auth_token.auth_section
+{{ if not .keystone_authtoken.keystonemiddleware.auth_token.auth_section }}#{{ end }}auth_section = {{ .keystone_authtoken.keystonemiddleware.auth_token.auth_section | default "<None>" }}
+
+
+[matchmaker_redis]
+
+#
+# From oslo.messaging
+#
+
+# DEPRECATED: Host to locate redis. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .matchmaker_redis.oslo.messaging.host
+{{ if not .matchmaker_redis.oslo.messaging.host }}#{{ end }}host = {{ .matchmaker_redis.oslo.messaging.host | default "127.0.0.1" }}
+
+# DEPRECATED: Use this port to connect to redis host. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .matchmaker_redis.oslo.messaging.port
+{{ if not .matchmaker_redis.oslo.messaging.port }}#{{ end }}port = {{ .matchmaker_redis.oslo.messaging.port | default "6379" }}
+
+# DEPRECATED: Password for Redis server (optional). (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .matchmaker_redis.oslo.messaging.password
+{{ if not .matchmaker_redis.oslo.messaging.password }}#{{ end }}password = {{ .matchmaker_redis.oslo.messaging.password | default "" }}
+
+# DEPRECATED: List of Redis Sentinel hosts (fault tolerance mode) e.g.
+# [host:port, host1:port ... ] (list value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .matchmaker_redis.oslo.messaging.sentinel_hosts
+{{ if not .matchmaker_redis.oslo.messaging.sentinel_hosts }}#{{ end }}sentinel_hosts = {{ .matchmaker_redis.oslo.messaging.sentinel_hosts | default "" }}
+
+# Redis replica set name. (string value)
+# from .matchmaker_redis.oslo.messaging.sentinel_group_name
+{{ if not .matchmaker_redis.oslo.messaging.sentinel_group_name }}#{{ end }}sentinel_group_name = {{ .matchmaker_redis.oslo.messaging.sentinel_group_name | default "oslo-messaging-zeromq" }}
+
+# Time in ms to wait between connection attempts. (integer value)
+# from .matchmaker_redis.oslo.messaging.wait_timeout
+{{ if not .matchmaker_redis.oslo.messaging.wait_timeout }}#{{ end }}wait_timeout = {{ .matchmaker_redis.oslo.messaging.wait_timeout | default "2000" }}
+
+# Time in ms to wait before the transaction is killed. (integer value)
+# from .matchmaker_redis.oslo.messaging.check_timeout
+{{ if not .matchmaker_redis.oslo.messaging.check_timeout }}#{{ end }}check_timeout = {{ .matchmaker_redis.oslo.messaging.check_timeout | default "20000" }}
+
+# Timeout in ms on blocking socket operations (integer value)
+# from .matchmaker_redis.oslo.messaging.socket_timeout
+{{ if not .matchmaker_redis.oslo.messaging.socket_timeout }}#{{ end }}socket_timeout = {{ .matchmaker_redis.oslo.messaging.socket_timeout | default "10000" }}
+
+
+[oslo_messaging_amqp]
+
+#
+# From oslo.messaging
+#
+
+# Name for the AMQP container. must be globally unique. Defaults to a
+# generated UUID (string value)
+# Deprecated group/name - [amqp1]/container_name
+# from .oslo_messaging_amqp.oslo.messaging.container_name
+{{ if not .oslo_messaging_amqp.oslo.messaging.container_name }}#{{ end }}container_name = {{ .oslo_messaging_amqp.oslo.messaging.container_name | default "<None>" }}
+
+# Timeout for inactive connections (in seconds) (integer value)
+# Deprecated group/name - [amqp1]/idle_timeout
+# from .oslo_messaging_amqp.oslo.messaging.idle_timeout
+{{ if not .oslo_messaging_amqp.oslo.messaging.idle_timeout }}#{{ end }}idle_timeout = {{ .oslo_messaging_amqp.oslo.messaging.idle_timeout | default "0" }}
+
+# Debug: dump AMQP frames to stdout (boolean value)
+# Deprecated group/name - [amqp1]/trace
+# from .oslo_messaging_amqp.oslo.messaging.trace
+{{ if not .oslo_messaging_amqp.oslo.messaging.trace }}#{{ end }}trace = {{ .oslo_messaging_amqp.oslo.messaging.trace | default "false" }}
+
+# CA certificate PEM file to verify server certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_ca_file
+# from .oslo_messaging_amqp.oslo.messaging.ssl_ca_file
+{{ if not .oslo_messaging_amqp.oslo.messaging.ssl_ca_file }}#{{ end }}ssl_ca_file = {{ .oslo_messaging_amqp.oslo.messaging.ssl_ca_file | default "" }}
+
+# Identifying certificate PEM file to present to clients (string
+# value)
+# Deprecated group/name - [amqp1]/ssl_cert_file
+# from .oslo_messaging_amqp.oslo.messaging.ssl_cert_file
+{{ if not .oslo_messaging_amqp.oslo.messaging.ssl_cert_file }}#{{ end }}ssl_cert_file = {{ .oslo_messaging_amqp.oslo.messaging.ssl_cert_file | default "" }}
+
+# Private key PEM file used to sign cert_file certificate (string
+# value)
+# Deprecated group/name - [amqp1]/ssl_key_file
+# from .oslo_messaging_amqp.oslo.messaging.ssl_key_file
+{{ if not .oslo_messaging_amqp.oslo.messaging.ssl_key_file }}#{{ end }}ssl_key_file = {{ .oslo_messaging_amqp.oslo.messaging.ssl_key_file | default "" }}
+
+# Password for decrypting ssl_key_file (if encrypted) (string value)
+# Deprecated group/name - [amqp1]/ssl_key_password
+# from .oslo_messaging_amqp.oslo.messaging.ssl_key_password
+{{ if not .oslo_messaging_amqp.oslo.messaging.ssl_key_password }}#{{ end }}ssl_key_password = {{ .oslo_messaging_amqp.oslo.messaging.ssl_key_password | default "<None>" }}
+
+# Accept clients using either SSL or plain TCP (boolean value)
+# Deprecated group/name - [amqp1]/allow_insecure_clients
+# from .oslo_messaging_amqp.oslo.messaging.allow_insecure_clients
+{{ if not .oslo_messaging_amqp.oslo.messaging.allow_insecure_clients }}#{{ end }}allow_insecure_clients = {{ .oslo_messaging_amqp.oslo.messaging.allow_insecure_clients | default "false" }}
+
+# Space separated list of acceptable SASL mechanisms (string value)
+# Deprecated group/name - [amqp1]/sasl_mechanisms
+# from .oslo_messaging_amqp.oslo.messaging.sasl_mechanisms
+{{ if not .oslo_messaging_amqp.oslo.messaging.sasl_mechanisms }}#{{ end }}sasl_mechanisms = {{ .oslo_messaging_amqp.oslo.messaging.sasl_mechanisms | default "" }}
+
+# Path to directory that contains the SASL configuration (string
+# value)
+# Deprecated group/name - [amqp1]/sasl_config_dir
+# from .oslo_messaging_amqp.oslo.messaging.sasl_config_dir
+{{ if not .oslo_messaging_amqp.oslo.messaging.sasl_config_dir }}#{{ end }}sasl_config_dir = {{ .oslo_messaging_amqp.oslo.messaging.sasl_config_dir | default "" }}
+
+# Name of configuration file (without .conf suffix) (string value)
+# Deprecated group/name - [amqp1]/sasl_config_name
+# from .oslo_messaging_amqp.oslo.messaging.sasl_config_name
+{{ if not .oslo_messaging_amqp.oslo.messaging.sasl_config_name }}#{{ end }}sasl_config_name = {{ .oslo_messaging_amqp.oslo.messaging.sasl_config_name | default "" }}
+
+# User name for message broker authentication (string value)
+# Deprecated group/name - [amqp1]/username
+# from .oslo_messaging_amqp.oslo.messaging.username
+{{ if not .oslo_messaging_amqp.oslo.messaging.username }}#{{ end }}username = {{ .oslo_messaging_amqp.oslo.messaging.username | default "" }}
+
+# Password for message broker authentication (string value)
+# Deprecated group/name - [amqp1]/password
+# from .oslo_messaging_amqp.oslo.messaging.password
+{{ if not .oslo_messaging_amqp.oslo.messaging.password }}#{{ end }}password = {{ .oslo_messaging_amqp.oslo.messaging.password | default "" }}
+
+# Seconds to pause before attempting to re-connect. (integer value)
+# Minimum value: 1
+# from .oslo_messaging_amqp.oslo.messaging.connection_retry_interval
+{{ if not .oslo_messaging_amqp.oslo.messaging.connection_retry_interval }}#{{ end }}connection_retry_interval = {{ .oslo_messaging_amqp.oslo.messaging.connection_retry_interval | default "1" }}
+
+# Increase the connection_retry_interval by this many seconds after
+# each unsuccessful failover attempt. (integer value)
+# Minimum value: 0
+# from .oslo_messaging_amqp.oslo.messaging.connection_retry_backoff
+{{ if not .oslo_messaging_amqp.oslo.messaging.connection_retry_backoff }}#{{ end }}connection_retry_backoff = {{ .oslo_messaging_amqp.oslo.messaging.connection_retry_backoff | default "2" }}
+
+# Maximum limit for connection_retry_interval +
+# connection_retry_backoff (integer value)
+# Minimum value: 1
+# from .oslo_messaging_amqp.oslo.messaging.connection_retry_interval_max
+{{ if not .oslo_messaging_amqp.oslo.messaging.connection_retry_interval_max }}#{{ end }}connection_retry_interval_max = {{ .oslo_messaging_amqp.oslo.messaging.connection_retry_interval_max | default "30" }}
+
+# Time to pause between re-connecting an AMQP 1.0 link that failed due
+# to a recoverable error. (integer value)
+# Minimum value: 1
+# from .oslo_messaging_amqp.oslo.messaging.link_retry_delay
+{{ if not .oslo_messaging_amqp.oslo.messaging.link_retry_delay }}#{{ end }}link_retry_delay = {{ .oslo_messaging_amqp.oslo.messaging.link_retry_delay | default "10" }}
+
+# The deadline for an rpc reply message delivery. Only used when
+# caller does not provide a timeout expiry. (integer value)
+# Minimum value: 5
+# from .oslo_messaging_amqp.oslo.messaging.default_reply_timeout
+{{ if not .oslo_messaging_amqp.oslo.messaging.default_reply_timeout }}#{{ end }}default_reply_timeout = {{ .oslo_messaging_amqp.oslo.messaging.default_reply_timeout | default "30" }}
+
+# The deadline for an rpc cast or call message delivery. Only used
+# when caller does not provide a timeout expiry. (integer value)
+# Minimum value: 5
+# from .oslo_messaging_amqp.oslo.messaging.default_send_timeout
+{{ if not .oslo_messaging_amqp.oslo.messaging.default_send_timeout }}#{{ end }}default_send_timeout = {{ .oslo_messaging_amqp.oslo.messaging.default_send_timeout | default "30" }}
+
+# The deadline for a sent notification message delivery. Only used
+# when caller does not provide a timeout expiry. (integer value)
+# Minimum value: 5
+# from .oslo_messaging_amqp.oslo.messaging.default_notify_timeout
+{{ if not .oslo_messaging_amqp.oslo.messaging.default_notify_timeout }}#{{ end }}default_notify_timeout = {{ .oslo_messaging_amqp.oslo.messaging.default_notify_timeout | default "30" }}
+
+# Indicates the addressing mode used by the driver.
+# Permitted values:
+# 'legacy'   - use legacy non-routable addressing
+# 'routable' - use routable addresses
+# 'dynamic'  - use legacy addresses if the message bus does not
+# support routing otherwise use routable addressing (string value)
+# from .oslo_messaging_amqp.oslo.messaging.addressing_mode
+{{ if not .oslo_messaging_amqp.oslo.messaging.addressing_mode }}#{{ end }}addressing_mode = {{ .oslo_messaging_amqp.oslo.messaging.addressing_mode | default "dynamic" }}
+
+# address prefix used when sending to a specific server (string value)
+# Deprecated group/name - [amqp1]/server_request_prefix
+# from .oslo_messaging_amqp.oslo.messaging.server_request_prefix
+{{ if not .oslo_messaging_amqp.oslo.messaging.server_request_prefix }}#{{ end }}server_request_prefix = {{ .oslo_messaging_amqp.oslo.messaging.server_request_prefix | default "exclusive" }}
+
+# address prefix used when broadcasting to all servers (string value)
+# Deprecated group/name - [amqp1]/broadcast_prefix
+# from .oslo_messaging_amqp.oslo.messaging.broadcast_prefix
+{{ if not .oslo_messaging_amqp.oslo.messaging.broadcast_prefix }}#{{ end }}broadcast_prefix = {{ .oslo_messaging_amqp.oslo.messaging.broadcast_prefix | default "broadcast" }}
+
+# address prefix when sending to any server in group (string value)
+# Deprecated group/name - [amqp1]/group_request_prefix
+# from .oslo_messaging_amqp.oslo.messaging.group_request_prefix
+{{ if not .oslo_messaging_amqp.oslo.messaging.group_request_prefix }}#{{ end }}group_request_prefix = {{ .oslo_messaging_amqp.oslo.messaging.group_request_prefix | default "unicast" }}
+
+# Address prefix for all generated RPC addresses (string value)
+# from .oslo_messaging_amqp.oslo.messaging.rpc_address_prefix
+{{ if not .oslo_messaging_amqp.oslo.messaging.rpc_address_prefix }}#{{ end }}rpc_address_prefix = {{ .oslo_messaging_amqp.oslo.messaging.rpc_address_prefix | default "openstack.org/om/rpc" }}
+
+# Address prefix for all generated Notification addresses (string
+# value)
+# from .oslo_messaging_amqp.oslo.messaging.notify_address_prefix
+{{ if not .oslo_messaging_amqp.oslo.messaging.notify_address_prefix }}#{{ end }}notify_address_prefix = {{ .oslo_messaging_amqp.oslo.messaging.notify_address_prefix | default "openstack.org/om/notify" }}
+
+# Appended to the address prefix when sending a fanout message. Used
+# by the message bus to identify fanout messages. (string value)
+# from .oslo_messaging_amqp.oslo.messaging.multicast_address
+{{ if not .oslo_messaging_amqp.oslo.messaging.multicast_address }}#{{ end }}multicast_address = {{ .oslo_messaging_amqp.oslo.messaging.multicast_address | default "multicast" }}
+
+# Appended to the address prefix when sending to a particular
+# RPC/Notification server. Used by the message bus to identify
+# messages sent to a single destination. (string value)
+# from .oslo_messaging_amqp.oslo.messaging.unicast_address
+{{ if not .oslo_messaging_amqp.oslo.messaging.unicast_address }}#{{ end }}unicast_address = {{ .oslo_messaging_amqp.oslo.messaging.unicast_address | default "unicast" }}
+
+# Appended to the address prefix when sending to a group of consumers.
+# Used by the message bus to identify messages that should be
+# delivered in a round-robin fashion across consumers. (string value)
+# from .oslo_messaging_amqp.oslo.messaging.anycast_address
+{{ if not .oslo_messaging_amqp.oslo.messaging.anycast_address }}#{{ end }}anycast_address = {{ .oslo_messaging_amqp.oslo.messaging.anycast_address | default "anycast" }}
+
+# Exchange name used in notification addresses.
+# Exchange name resolution precedence:
+# Target.exchange if set
+# else default_notification_exchange if set
+# else control_exchange if set
+# else 'notify' (string value)
+# from .oslo_messaging_amqp.oslo.messaging.default_notification_exchange
+{{ if not .oslo_messaging_amqp.oslo.messaging.default_notification_exchange }}#{{ end }}default_notification_exchange = {{ .oslo_messaging_amqp.oslo.messaging.default_notification_exchange | default "<None>" }}
+
+# Exchange name used in RPC addresses.
+# Exchange name resolution precedence:
+# Target.exchange if set
+# else default_rpc_exchange if set
+# else control_exchange if set
+# else 'rpc' (string value)
+# from .oslo_messaging_amqp.oslo.messaging.default_rpc_exchange
+{{ if not .oslo_messaging_amqp.oslo.messaging.default_rpc_exchange }}#{{ end }}default_rpc_exchange = {{ .oslo_messaging_amqp.oslo.messaging.default_rpc_exchange | default "<None>" }}
+
+# Window size for incoming RPC Reply messages. (integer value)
+# Minimum value: 1
+# from .oslo_messaging_amqp.oslo.messaging.reply_link_credit
+{{ if not .oslo_messaging_amqp.oslo.messaging.reply_link_credit }}#{{ end }}reply_link_credit = {{ .oslo_messaging_amqp.oslo.messaging.reply_link_credit | default "200" }}
+
+# Window size for incoming RPC Request messages (integer value)
+# Minimum value: 1
+# from .oslo_messaging_amqp.oslo.messaging.rpc_server_credit
+{{ if not .oslo_messaging_amqp.oslo.messaging.rpc_server_credit }}#{{ end }}rpc_server_credit = {{ .oslo_messaging_amqp.oslo.messaging.rpc_server_credit | default "100" }}
+
+# Window size for incoming Notification messages (integer value)
+# Minimum value: 1
+# from .oslo_messaging_amqp.oslo.messaging.notify_server_credit
+{{ if not .oslo_messaging_amqp.oslo.messaging.notify_server_credit }}#{{ end }}notify_server_credit = {{ .oslo_messaging_amqp.oslo.messaging.notify_server_credit | default "100" }}
+
+
+[oslo_messaging_notifications]
+
+#
+# From oslo.messaging
+#
+
+# The Drivers(s) to handle sending notifications. Possible values are
+# messaging, messagingv2, routing, log, test, noop (multi valued)
+# Deprecated group/name - [DEFAULT]/notification_driver
+# from .oslo_messaging_notifications.oslo.messaging.driver (multiopt)
+{{ if not .oslo_messaging_notifications.oslo.messaging.driver }}#driver = {{ .oslo_messaging_notifications.oslo.messaging.driver | default "" }}{{ else }}{{ range .oslo_messaging_notifications.oslo.messaging.driver }}driver = {{ . }}{{ end }}{{ end }}
+
+# A URL representing the messaging driver to use for notifications. If
+# not set, we fall back to the same configuration used for RPC.
+# (string value)
+# Deprecated group/name - [DEFAULT]/notification_transport_url
+# from .oslo_messaging_notifications.oslo.messaging.transport_url
+{{ if not .oslo_messaging_notifications.oslo.messaging.transport_url }}#{{ end }}transport_url = {{ .oslo_messaging_notifications.oslo.messaging.transport_url | default "<None>" }}
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+# Deprecated group/name - [DEFAULT]/notification_topics
+# from .oslo_messaging_notifications.oslo.messaging.topics
+{{ if not .oslo_messaging_notifications.oslo.messaging.topics }}#{{ end }}topics = {{ .oslo_messaging_notifications.oslo.messaging.topics | default "notifications" }}
+
+
+[oslo_messaging_rabbit]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_durable_queues
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+# from .oslo_messaging_rabbit.oslo.messaging.amqp_durable_queues
+{{ if not .oslo_messaging_rabbit.oslo.messaging.amqp_durable_queues }}#{{ end }}amqp_durable_queues = {{ .oslo_messaging_rabbit.oslo.messaging.amqp_durable_queues | default "false" }}
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+# from .oslo_messaging_rabbit.oslo.messaging.amqp_auto_delete
+{{ if not .oslo_messaging_rabbit.oslo.messaging.amqp_auto_delete }}#{{ end }}amqp_auto_delete = {{ .oslo_messaging_rabbit.oslo.messaging.amqp_auto_delete | default "false" }}
+
+# SSL version to use (valid only if SSL enabled). Valid values are
+# TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be
+# available on some distributions. (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_version
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_version
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_version }}#{{ end }}kombu_ssl_version = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_version | default "" }}
+
+# SSL key file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_keyfile
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_keyfile }}#{{ end }}kombu_ssl_keyfile = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_keyfile | default "" }}
+
+# SSL cert file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_certfile
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_certfile
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_certfile }}#{{ end }}kombu_ssl_certfile = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_certfile | default "" }}
+
+# SSL certification authority file (valid only if SSL enabled).
+# (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_ca_certs
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_ca_certs }}#{{ end }}kombu_ssl_ca_certs = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_ssl_ca_certs | default "" }}
+
+# How long to wait before reconnecting in response to an AMQP consumer
+# cancel notification. (floating point value)
+# Deprecated group/name - [DEFAULT]/kombu_reconnect_delay
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_reconnect_delay
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_reconnect_delay }}#{{ end }}kombu_reconnect_delay = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_reconnect_delay | default "1.0" }}
+
+# EXPERIMENTAL: Possible values are: gzip, bz2. If not set compression
+# will not be used. This option may not be available in future
+# versions. (string value)
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_compression
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_compression }}#{{ end }}kombu_compression = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_compression | default "<None>" }}
+
+# How long to wait a missing client before abandoning to send it its
+# replies. This value should not be longer than rpc_response_timeout.
+# (integer value)
+# Deprecated group/name - [oslo_messaging_rabbit]/kombu_reconnect_timeout
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_missing_consumer_retry_timeout
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_missing_consumer_retry_timeout }}#{{ end }}kombu_missing_consumer_retry_timeout = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_missing_consumer_retry_timeout | default "60" }}
+
+# Determines how the next RabbitMQ node is chosen in case the one we
+# are currently connected to becomes unavailable. Takes effect only if
+# more than one RabbitMQ node is provided in config. (string value)
+# Allowed values: round-robin, shuffle
+# from .oslo_messaging_rabbit.oslo.messaging.kombu_failover_strategy
+{{ if not .oslo_messaging_rabbit.oslo.messaging.kombu_failover_strategy }}#{{ end }}kombu_failover_strategy = {{ .oslo_messaging_rabbit.oslo.messaging.kombu_failover_strategy | default "round-robin" }}
+
+# DEPRECATED: The RabbitMQ broker address where a single node is used.
+# (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_host
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_host
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_host }}#{{ end }}rabbit_host = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_host | default "localhost" }}
+
+# DEPRECATED: The RabbitMQ broker port where a single node is used.
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# Deprecated group/name - [DEFAULT]/rabbit_port
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_port
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_port }}#{{ end }}rabbit_port = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_port | default "5672" }}
+
+# DEPRECATED: RabbitMQ HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/rabbit_hosts
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_hosts
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_hosts }}#{{ end }}rabbit_hosts = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_hosts | default "$rabbit_host:$rabbit_port" }}
+
+# Connect over SSL for RabbitMQ. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_use_ssl
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_use_ssl
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_use_ssl }}#{{ end }}rabbit_use_ssl = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_use_ssl | default "false" }}
+
+# DEPRECATED: The RabbitMQ userid. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_userid
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_userid
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_userid }}#{{ end }}rabbit_userid = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_userid | default "guest" }}
+
+# DEPRECATED: The RabbitMQ password. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_password
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_password
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_password }}#{{ end }}rabbit_password = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_password | default "guest" }}
+
+# The RabbitMQ login method. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_login_method
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_login_method
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_login_method }}#{{ end }}rabbit_login_method = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_login_method | default "AMQPLAIN" }}
+
+# DEPRECATED: The RabbitMQ virtual host. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_virtual_host
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Replaced by [DEFAULT]/transport_url
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_virtual_host
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_virtual_host }}#{{ end }}rabbit_virtual_host = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_virtual_host | default "/" }}
+
+# How frequently to retry connecting with RabbitMQ. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_retry_interval
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_retry_interval }}#{{ end }}rabbit_retry_interval = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_retry_interval | default "1" }}
+
+# How long to backoff for between retries when connecting to RabbitMQ.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_retry_backoff
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_retry_backoff
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_retry_backoff }}#{{ end }}rabbit_retry_backoff = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_retry_backoff | default "2" }}
+
+# Maximum interval of RabbitMQ connection retries. Default is 30
+# seconds. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_interval_max
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_interval_max }}#{{ end }}rabbit_interval_max = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_interval_max | default "30" }}
+
+# DEPRECATED: Maximum number of RabbitMQ connection retries. Default
+# is 0 (infinite retry count). (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_max_retries
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_max_retries
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_max_retries }}#{{ end }}rabbit_max_retries = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_max_retries | default "0" }}
+
+# Try to use HA queues in RabbitMQ (x-ha-policy: all). If you change
+# this option, you must wipe the RabbitMQ database. In RabbitMQ 3.0,
+# queue mirroring is no longer controlled by the x-ha-policy argument
+# when declaring a queue. If you just want to make sure that all
+# queues (except  those with auto-generated names) are mirrored across
+# all nodes, run: "rabbitmqctl set_policy HA '^(?!amq\.).*' '{"ha-
+# mode": "all"}' " (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_ha_queues
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_ha_queues
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_ha_queues }}#{{ end }}rabbit_ha_queues = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_ha_queues | default "false" }}
+
+# Positive integer representing duration in seconds for queue TTL
+# (x-expires). Queues which are unused for the duration of the TTL are
+# automatically deleted. The parameter affects only reply and fanout
+# queues. (integer value)
+# Minimum value: 1
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_transient_queues_ttl
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_transient_queues_ttl }}#{{ end }}rabbit_transient_queues_ttl = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_transient_queues_ttl | default "1800" }}
+
+# Specifies the number of messages to prefetch. Setting to zero allows
+# unlimited messages. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.rabbit_qos_prefetch_count
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rabbit_qos_prefetch_count }}#{{ end }}rabbit_qos_prefetch_count = {{ .oslo_messaging_rabbit.oslo.messaging.rabbit_qos_prefetch_count | default "0" }}
+
+# Number of seconds after which the Rabbit broker is considered down
+# if heartbeat's keep-alive fails (0 disable the heartbeat).
+# EXPERIMENTAL (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.heartbeat_timeout_threshold
+{{ if not .oslo_messaging_rabbit.oslo.messaging.heartbeat_timeout_threshold }}#{{ end }}heartbeat_timeout_threshold = {{ .oslo_messaging_rabbit.oslo.messaging.heartbeat_timeout_threshold | default "60" }}
+
+# How often times during the heartbeat_timeout_threshold we check the
+# heartbeat. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.heartbeat_rate
+{{ if not .oslo_messaging_rabbit.oslo.messaging.heartbeat_rate }}#{{ end }}heartbeat_rate = {{ .oslo_messaging_rabbit.oslo.messaging.heartbeat_rate | default "2" }}
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake
+# (boolean value)
+# Deprecated group/name - [DEFAULT]/fake_rabbit
+# from .oslo_messaging_rabbit.oslo.messaging.fake_rabbit
+{{ if not .oslo_messaging_rabbit.oslo.messaging.fake_rabbit }}#{{ end }}fake_rabbit = {{ .oslo_messaging_rabbit.oslo.messaging.fake_rabbit | default "false" }}
+
+# Maximum number of channels to allow (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.channel_max
+{{ if not .oslo_messaging_rabbit.oslo.messaging.channel_max }}#{{ end }}channel_max = {{ .oslo_messaging_rabbit.oslo.messaging.channel_max | default "<None>" }}
+
+# The maximum byte size for an AMQP frame (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.frame_max
+{{ if not .oslo_messaging_rabbit.oslo.messaging.frame_max }}#{{ end }}frame_max = {{ .oslo_messaging_rabbit.oslo.messaging.frame_max | default "<None>" }}
+
+# How often to send heartbeats for consumer's connections (integer
+# value)
+# from .oslo_messaging_rabbit.oslo.messaging.heartbeat_interval
+{{ if not .oslo_messaging_rabbit.oslo.messaging.heartbeat_interval }}#{{ end }}heartbeat_interval = {{ .oslo_messaging_rabbit.oslo.messaging.heartbeat_interval | default "3" }}
+
+# Enable SSL (boolean value)
+# from .oslo_messaging_rabbit.oslo.messaging.ssl
+{{ if not .oslo_messaging_rabbit.oslo.messaging.ssl }}#{{ end }}ssl = {{ .oslo_messaging_rabbit.oslo.messaging.ssl | default "<None>" }}
+
+# Arguments passed to ssl.wrap_socket (dict value)
+# from .oslo_messaging_rabbit.oslo.messaging.ssl_options
+{{ if not .oslo_messaging_rabbit.oslo.messaging.ssl_options }}#{{ end }}ssl_options = {{ .oslo_messaging_rabbit.oslo.messaging.ssl_options | default "<None>" }}
+
+# Set socket timeout in seconds for connection's socket (floating
+# point value)
+# from .oslo_messaging_rabbit.oslo.messaging.socket_timeout
+{{ if not .oslo_messaging_rabbit.oslo.messaging.socket_timeout }}#{{ end }}socket_timeout = {{ .oslo_messaging_rabbit.oslo.messaging.socket_timeout | default "0.25" }}
+
+# Set TCP_USER_TIMEOUT in seconds for connection's socket (floating
+# point value)
+# from .oslo_messaging_rabbit.oslo.messaging.tcp_user_timeout
+{{ if not .oslo_messaging_rabbit.oslo.messaging.tcp_user_timeout }}#{{ end }}tcp_user_timeout = {{ .oslo_messaging_rabbit.oslo.messaging.tcp_user_timeout | default "0.25" }}
+
+# Set delay for reconnection to some host which has connection error
+# (floating point value)
+# from .oslo_messaging_rabbit.oslo.messaging.host_connection_reconnect_delay
+{{ if not .oslo_messaging_rabbit.oslo.messaging.host_connection_reconnect_delay }}#{{ end }}host_connection_reconnect_delay = {{ .oslo_messaging_rabbit.oslo.messaging.host_connection_reconnect_delay | default "0.25" }}
+
+# Connection factory implementation (string value)
+# Allowed values: new, single, read_write
+# from .oslo_messaging_rabbit.oslo.messaging.connection_factory
+{{ if not .oslo_messaging_rabbit.oslo.messaging.connection_factory }}#{{ end }}connection_factory = {{ .oslo_messaging_rabbit.oslo.messaging.connection_factory | default "single" }}
+
+# Maximum number of connections to keep queued. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.pool_max_size
+{{ if not .oslo_messaging_rabbit.oslo.messaging.pool_max_size }}#{{ end }}pool_max_size = {{ .oslo_messaging_rabbit.oslo.messaging.pool_max_size | default "30" }}
+
+# Maximum number of connections to create above `pool_max_size`.
+# (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.pool_max_overflow
+{{ if not .oslo_messaging_rabbit.oslo.messaging.pool_max_overflow }}#{{ end }}pool_max_overflow = {{ .oslo_messaging_rabbit.oslo.messaging.pool_max_overflow | default "0" }}
+
+# Default number of seconds to wait for a connections to available
+# (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.pool_timeout
+{{ if not .oslo_messaging_rabbit.oslo.messaging.pool_timeout }}#{{ end }}pool_timeout = {{ .oslo_messaging_rabbit.oslo.messaging.pool_timeout | default "30" }}
+
+# Lifetime of a connection (since creation) in seconds or None for no
+# recycling. Expired connections are closed on acquire. (integer
+# value)
+# from .oslo_messaging_rabbit.oslo.messaging.pool_recycle
+{{ if not .oslo_messaging_rabbit.oslo.messaging.pool_recycle }}#{{ end }}pool_recycle = {{ .oslo_messaging_rabbit.oslo.messaging.pool_recycle | default "600" }}
+
+# Threshold at which inactive (since release) connections are
+# considered stale in seconds or None for no staleness. Stale
+# connections are closed on acquire. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.pool_stale
+{{ if not .oslo_messaging_rabbit.oslo.messaging.pool_stale }}#{{ end }}pool_stale = {{ .oslo_messaging_rabbit.oslo.messaging.pool_stale | default "60" }}
+
+# Persist notification messages. (boolean value)
+# from .oslo_messaging_rabbit.oslo.messaging.notification_persistence
+{{ if not .oslo_messaging_rabbit.oslo.messaging.notification_persistence }}#{{ end }}notification_persistence = {{ .oslo_messaging_rabbit.oslo.messaging.notification_persistence | default "false" }}
+
+# Exchange name for sending notifications (string value)
+# from .oslo_messaging_rabbit.oslo.messaging.default_notification_exchange
+{{ if not .oslo_messaging_rabbit.oslo.messaging.default_notification_exchange }}#{{ end }}default_notification_exchange = {{ .oslo_messaging_rabbit.oslo.messaging.default_notification_exchange | default "${control_exchange}_notification" }}
+
+# Max number of not acknowledged message which RabbitMQ can send to
+# notification listener. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.notification_listener_prefetch_count
+{{ if not .oslo_messaging_rabbit.oslo.messaging.notification_listener_prefetch_count }}#{{ end }}notification_listener_prefetch_count = {{ .oslo_messaging_rabbit.oslo.messaging.notification_listener_prefetch_count | default "100" }}
+
+# Reconnecting retry count in case of connectivity problem during
+# sending notification, -1 means infinite retry. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.default_notification_retry_attempts
+{{ if not .oslo_messaging_rabbit.oslo.messaging.default_notification_retry_attempts }}#{{ end }}default_notification_retry_attempts = {{ .oslo_messaging_rabbit.oslo.messaging.default_notification_retry_attempts | default "-1" }}
+
+# Reconnecting retry delay in case of connectivity problem during
+# sending notification message (floating point value)
+# from .oslo_messaging_rabbit.oslo.messaging.notification_retry_delay
+{{ if not .oslo_messaging_rabbit.oslo.messaging.notification_retry_delay }}#{{ end }}notification_retry_delay = {{ .oslo_messaging_rabbit.oslo.messaging.notification_retry_delay | default "0.25" }}
+
+# Time to live for rpc queues without consumers in seconds. (integer
+# value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_queue_expiration
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_queue_expiration }}#{{ end }}rpc_queue_expiration = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_queue_expiration | default "60" }}
+
+# Exchange name for sending RPC messages (string value)
+# from .oslo_messaging_rabbit.oslo.messaging.default_rpc_exchange
+{{ if not .oslo_messaging_rabbit.oslo.messaging.default_rpc_exchange }}#{{ end }}default_rpc_exchange = {{ .oslo_messaging_rabbit.oslo.messaging.default_rpc_exchange | default "${control_exchange}_rpc" }}
+
+# Exchange name for receiving RPC replies (string value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_reply_exchange
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_reply_exchange }}#{{ end }}rpc_reply_exchange = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_reply_exchange | default "${control_exchange}_rpc_reply" }}
+
+# Max number of not acknowledged message which RabbitMQ can send to
+# rpc listener. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_listener_prefetch_count
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_listener_prefetch_count }}#{{ end }}rpc_listener_prefetch_count = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_listener_prefetch_count | default "100" }}
+
+# Max number of not acknowledged message which RabbitMQ can send to
+# rpc reply listener. (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_reply_listener_prefetch_count
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_reply_listener_prefetch_count }}#{{ end }}rpc_reply_listener_prefetch_count = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_reply_listener_prefetch_count | default "100" }}
+
+# Reconnecting retry count in case of connectivity problem during
+# sending reply. -1 means infinite retry during rpc_timeout (integer
+# value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_reply_retry_attempts
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_reply_retry_attempts }}#{{ end }}rpc_reply_retry_attempts = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_reply_retry_attempts | default "-1" }}
+
+# Reconnecting retry delay in case of connectivity problem during
+# sending reply. (floating point value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_reply_retry_delay
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_reply_retry_delay }}#{{ end }}rpc_reply_retry_delay = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_reply_retry_delay | default "0.25" }}
+
+# Reconnecting retry count in case of connectivity problem during
+# sending RPC message, -1 means infinite retry. If actual retry
+# attempts in not 0 the rpc request could be processed more then one
+# time (integer value)
+# from .oslo_messaging_rabbit.oslo.messaging.default_rpc_retry_attempts
+{{ if not .oslo_messaging_rabbit.oslo.messaging.default_rpc_retry_attempts }}#{{ end }}default_rpc_retry_attempts = {{ .oslo_messaging_rabbit.oslo.messaging.default_rpc_retry_attempts | default "-1" }}
+
+# Reconnecting retry delay in case of connectivity problem during
+# sending RPC message (floating point value)
+# from .oslo_messaging_rabbit.oslo.messaging.rpc_retry_delay
+{{ if not .oslo_messaging_rabbit.oslo.messaging.rpc_retry_delay }}#{{ end }}rpc_retry_delay = {{ .oslo_messaging_rabbit.oslo.messaging.rpc_retry_delay | default "0.25" }}
+
+
+[oslo_messaging_zmq]
+
+#
+# From oslo.messaging
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve to this
+# address. (string value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_bind_address
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_bind_address
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_bind_address }}#{{ end }}rpc_zmq_bind_address = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_bind_address | default "*" }}
+
+# MatchMaker driver. (string value)
+# Allowed values: redis, dummy
+# Deprecated group/name - [DEFAULT]/rpc_zmq_matchmaker
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_matchmaker
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_matchmaker }}#{{ end }}rpc_zmq_matchmaker = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_matchmaker | default "redis" }}
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_contexts
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_contexts
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_contexts }}#{{ end }}rpc_zmq_contexts = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_contexts | default "1" }}
+
+# Maximum number of ingress messages to locally buffer per topic.
+# Default is unlimited. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_topic_backlog
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_topic_backlog
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_topic_backlog }}#{{ end }}rpc_zmq_topic_backlog = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_topic_backlog | default "<None>" }}
+
+# Directory for holding IPC sockets. (string value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_ipc_dir
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_ipc_dir
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_ipc_dir }}#{{ end }}rpc_zmq_ipc_dir = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_ipc_dir | default "/var/run/openstack" }}
+
+# Name of this node. Must be a valid hostname, FQDN, or IP address.
+# Must match "host" option, if running Nova. (string value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_host
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_host
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_host }}#{{ end }}rpc_zmq_host = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_host | default "localhost" }}
+
+# Seconds to wait before a cast expires (TTL). The default value of -1
+# specifies an infinite linger period. The value of 0 specifies no
+# linger period. Pending messages shall be discarded immediately when
+# the socket is closed. Only supported by impl_zmq. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_cast_timeout
+# from .oslo_messaging_zmq.oslo.messaging.rpc_cast_timeout
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_cast_timeout }}#{{ end }}rpc_cast_timeout = {{ .oslo_messaging_zmq.oslo.messaging.rpc_cast_timeout | default "-1" }}
+
+# The default number of seconds that poll should wait. Poll raises
+# timeout exception when timeout expired. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_poll_timeout
+# from .oslo_messaging_zmq.oslo.messaging.rpc_poll_timeout
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_poll_timeout }}#{{ end }}rpc_poll_timeout = {{ .oslo_messaging_zmq.oslo.messaging.rpc_poll_timeout | default "1" }}
+
+# Expiration timeout in seconds of a name service record about
+# existing target ( < 0 means no timeout). (integer value)
+# Deprecated group/name - [DEFAULT]/zmq_target_expire
+# from .oslo_messaging_zmq.oslo.messaging.zmq_target_expire
+{{ if not .oslo_messaging_zmq.oslo.messaging.zmq_target_expire }}#{{ end }}zmq_target_expire = {{ .oslo_messaging_zmq.oslo.messaging.zmq_target_expire | default "300" }}
+
+# Update period in seconds of a name service record about existing
+# target. (integer value)
+# Deprecated group/name - [DEFAULT]/zmq_target_update
+# from .oslo_messaging_zmq.oslo.messaging.zmq_target_update
+{{ if not .oslo_messaging_zmq.oslo.messaging.zmq_target_update }}#{{ end }}zmq_target_update = {{ .oslo_messaging_zmq.oslo.messaging.zmq_target_update | default "180" }}
+
+# Use PUB/SUB pattern for fanout methods. PUB/SUB always uses proxy.
+# (boolean value)
+# Deprecated group/name - [DEFAULT]/use_pub_sub
+# from .oslo_messaging_zmq.oslo.messaging.use_pub_sub
+{{ if not .oslo_messaging_zmq.oslo.messaging.use_pub_sub }}#{{ end }}use_pub_sub = {{ .oslo_messaging_zmq.oslo.messaging.use_pub_sub | default "true" }}
+
+# Use ROUTER remote proxy. (boolean value)
+# Deprecated group/name - [DEFAULT]/use_router_proxy
+# from .oslo_messaging_zmq.oslo.messaging.use_router_proxy
+{{ if not .oslo_messaging_zmq.oslo.messaging.use_router_proxy }}#{{ end }}use_router_proxy = {{ .oslo_messaging_zmq.oslo.messaging.use_router_proxy | default "true" }}
+
+# Minimal port number for random ports range. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# Deprecated group/name - [DEFAULT]/rpc_zmq_min_port
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_min_port
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_min_port }}#{{ end }}rpc_zmq_min_port = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_min_port | default "49153" }}
+
+# Maximal port number for random ports range. (integer value)
+# Minimum value: 1
+# Maximum value: 65536
+# Deprecated group/name - [DEFAULT]/rpc_zmq_max_port
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_max_port
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_max_port }}#{{ end }}rpc_zmq_max_port = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_max_port | default "65536" }}
+
+# Number of retries to find free port number before fail with
+# ZMQBindError. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_zmq_bind_port_retries
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_bind_port_retries
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_bind_port_retries }}#{{ end }}rpc_zmq_bind_port_retries = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_bind_port_retries | default "100" }}
+
+# Default serialization mechanism for serializing/deserializing
+# outgoing/incoming messages (string value)
+# Allowed values: json, msgpack
+# Deprecated group/name - [DEFAULT]/rpc_zmq_serialization
+# from .oslo_messaging_zmq.oslo.messaging.rpc_zmq_serialization
+{{ if not .oslo_messaging_zmq.oslo.messaging.rpc_zmq_serialization }}#{{ end }}rpc_zmq_serialization = {{ .oslo_messaging_zmq.oslo.messaging.rpc_zmq_serialization | default "json" }}
+
+# This option configures round-robin mode in zmq socket. True means
+# not keeping a queue when server side disconnects. False means to
+# keep queue and messages even if server is disconnected, when the
+# server appears we send all accumulated messages to it. (boolean
+# value)
+# from .oslo_messaging_zmq.oslo.messaging.zmq_immediate
+{{ if not .oslo_messaging_zmq.oslo.messaging.zmq_immediate }}#{{ end }}zmq_immediate = {{ .oslo_messaging_zmq.oslo.messaging.zmq_immediate | default "false" }}
+
+
+[oslo_policy]
+
+#
+# From oslo.policy
+#
+
+# The JSON file that defines policies. (string value)
+# Deprecated group/name - [DEFAULT]/policy_file
+# from .oslo_policy.oslo.policy.policy_file
+{{ if not .oslo_policy.oslo.policy.policy_file }}#{{ end }}policy_file = {{ .oslo_policy.oslo.policy.policy_file | default "policy.json" }}
+
+# Default rule. Enforced when a requested rule is not found. (string
+# value)
+# Deprecated group/name - [DEFAULT]/policy_default_rule
+# from .oslo_policy.oslo.policy.policy_default_rule
+{{ if not .oslo_policy.oslo.policy.policy_default_rule }}#{{ end }}policy_default_rule = {{ .oslo_policy.oslo.policy.policy_default_rule | default "default" }}
+
+# Directories where policy configuration files are stored. They can be
+# relative to any directory in the search path defined by the
+# config_dir option, or absolute paths. The file defined by
+# policy_file must exist for these directories to be searched.
+# Missing or empty directories are ignored. (multi valued)
+# Deprecated group/name - [DEFAULT]/policy_dirs
+# from .oslo_policy.oslo.policy.policy_dirs (multiopt)
+{{ if not .oslo_policy.oslo.policy.policy_dirs }}#policy_dirs = {{ .oslo_policy.oslo.policy.policy_dirs | default "policy.d" }}{{ else }}{{ range .oslo_policy.oslo.policy.policy_dirs }}policy_dirs = {{ . }}{{ end }}{{ end }}
+
+
+[pecan]
+
+#
+# From mistral.config
+#
+
+# Pecan root controller (string value)
+# from .pecan.mistral.config.root
+{{ if not .pecan.mistral.config.root }}#{{ end }}root = {{ .pecan.mistral.config.root | default "mistral.api.controllers.root.RootController" }}
+
+# A list of modules where pecan will search for applications. (list
+# value)
+# from .pecan.mistral.config.modules
+{{ if not .pecan.mistral.config.modules }}#{{ end }}modules = {{ .pecan.mistral.config.modules | default "mistral.api" }}
+
+# Enables the ability to display tracebacks in the browser and
+# interactively debug during development. (boolean value)
+# from .pecan.mistral.config.debug
+{{ if not .pecan.mistral.config.debug }}#{{ end }}debug = {{ .pecan.mistral.config.debug | default "false" }}
+
+# Enables user authentication in pecan. (boolean value)
+# from .pecan.mistral.config.auth_enable
+{{ if not .pecan.mistral.config.auth_enable }}#{{ end }}auth_enable = {{ .pecan.mistral.config.auth_enable | default "true" }}
+
+
+[profiler]
+
+#
+# From mistral.config
+#
+
+#
+# Enables the profiling for all services on this node. Default value
+# is False
+# (fully disable the profiling feature).
+#
+# Possible values:
+#
+# * True: Enables the feature
+# * False: Disables the feature. The profiling cannot be started via
+# this project
+# operations. If the profiling is triggered by another project, this
+# project part
+# will be empty.
+#  (boolean value)
+# Deprecated group/name - [profiler]/profiler_enabled
+# from .profiler.mistral.config.enabled
+{{ if not .profiler.mistral.config.enabled }}#{{ end }}enabled = {{ .profiler.mistral.config.enabled | default "false" }}
+
+#
+# Enables SQL requests profiling in services. Default value is False
+# (SQL
+# requests won't be traced).
+#
+# Possible values:
+#
+# * True: Enables SQL requests profiling. Each SQL query will be part
+# of the
+# trace and can the be analyzed by how much time was spent for that.
+# * False: Disables SQL requests profiling. The spent time is only
+# shown on a
+# higher level of operations. Single SQL queries cannot be analyzed
+# this
+# way.
+#  (boolean value)
+# from .profiler.mistral.config.trace_sqlalchemy
+{{ if not .profiler.mistral.config.trace_sqlalchemy }}#{{ end }}trace_sqlalchemy = {{ .profiler.mistral.config.trace_sqlalchemy | default "false" }}
+
+#
+# Secret key(s) to use for encrypting context data for performance
+# profiling.
+# This string value should have the following format:
+# <key1>[,<key2>,...<keyn>],
+# where each key is some random string. A user who triggers the
+# profiling via
+# the REST API has to set one of these keys in the headers of the REST
+# API call
+# to include profiling results of this node for this particular
+# project.
+#
+# Both "enabled" flag and "hmac_keys" config options should be set to
+# enable
+# profiling. Also, to generate correct profiling information across
+# all services
+# at least one key needs to be consistent between OpenStack projects.
+# This
+# ensures it can be used from client side to generate the trace,
+# containing
+# information from all possible resources. (string value)
+# from .profiler.mistral.config.hmac_keys
+{{ if not .profiler.mistral.config.hmac_keys }}#{{ end }}hmac_keys = {{ .profiler.mistral.config.hmac_keys | default "SECRET_KEY" }}
+
+#
+# Connection string for a notifier backend. Default value is
+# messaging:// which
+# sets the notifier to oslo_messaging.
+#
+# Examples of possible values:
+#
+# * messaging://: use oslo_messaging driver for sending notifications.
+#  (string value)
+# from .profiler.mistral.config.connection_string
+{{ if not .profiler.mistral.config.connection_string }}#{{ end }}connection_string = {{ .profiler.mistral.config.connection_string | default "messaging://" }}
+
+# Logger name for the osprofiler trace output. (string value)
+# from .profiler.mistral.config.profiler_log_name
+{{ if not .profiler.mistral.config.profiler_log_name }}#{{ end }}profiler_log_name = {{ .profiler.mistral.config.profiler_log_name | default "profiler_trace" }}
+
+
+[ssl]
+
+#
+# From oslo.service.sslutils
+#
+
+# CA certificate file to use to verify connecting clients. (string
+# value)
+# Deprecated group/name - [DEFAULT]/ssl_ca_file
+# from .ssl.oslo.service.sslutils.ca_file
+{{ if not .ssl.oslo.service.sslutils.ca_file }}#{{ end }}ca_file = {{ .ssl.oslo.service.sslutils.ca_file | default "<None>" }}
+
+# Certificate file to use when starting the server securely. (string
+# value)
+# Deprecated group/name - [DEFAULT]/ssl_cert_file
+# from .ssl.oslo.service.sslutils.cert_file
+{{ if not .ssl.oslo.service.sslutils.cert_file }}#{{ end }}cert_file = {{ .ssl.oslo.service.sslutils.cert_file | default "<None>" }}
+
+# Private key file to use when starting the server securely. (string
+# value)
+# Deprecated group/name - [DEFAULT]/ssl_key_file
+# from .ssl.oslo.service.sslutils.key_file
+{{ if not .ssl.oslo.service.sslutils.key_file }}#{{ end }}key_file = {{ .ssl.oslo.service.sslutils.key_file | default "<None>" }}
+
+# SSL version to use (valid only if SSL enabled). Valid values are
+# TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be
+# available on some distributions. (string value)
+# from .ssl.oslo.service.sslutils.version
+{{ if not .ssl.oslo.service.sslutils.version }}#{{ end }}version = {{ .ssl.oslo.service.sslutils.version | default "<None>" }}
+
+# Sets the list of available ciphers. value should be a string in the
+# OpenSSL cipher list format. (string value)
+# from .ssl.oslo.service.sslutils.ciphers
+{{ if not .ssl.oslo.service.sslutils.ciphers }}#{{ end }}ciphers = {{ .ssl.oslo.service.sslutils.ciphers | default "<None>" }}
+
+{{- end -}}
diff --git a/mistral/templates/etc/_policy.json.tpl b/mistral/templates/etc/_policy.json.tpl
new file mode 100644
index 0000000000..a04e3bc1a9
--- /dev/null
+++ b/mistral/templates/etc/_policy.json.tpl
@@ -0,0 +1,65 @@
+
+{
+    "admin_only": "is_admin:True",
+    "admin_or_owner":  "is_admin:True or project_id:%(project_id)s",
+    "default": "rule:admin_or_owner",
+
+    "action_executions:delete": "rule:admin_or_owner",
+    "action_execution:create": "rule:admin_or_owner",
+    "action_executions:get": "rule:admin_or_owner",
+    "action_executions:list": "rule:admin_or_owner",
+    "action_executions:update": "rule:admin_or_owner",
+
+    "actions:create": "rule:admin_or_owner",
+    "actions:delete": "rule:admin_or_owner",
+    "actions:get": "rule:admin_or_owner",
+    "actions:list": "rule:admin_or_owner",
+    "actions:update": "rule:admin_or_owner",
+
+    "cron_triggers:create": "rule:admin_or_owner",
+    "cron_triggers:delete": "rule:admin_or_owner",
+    "cron_triggers:get": "rule:admin_or_owner",
+    "cron_triggers:list": "rule:admin_or_owner",
+
+    "environments:create": "rule:admin_or_owner",
+    "environments:delete": "rule:admin_or_owner",
+    "environments:get": "rule:admin_or_owner",
+    "environments:list": "rule:admin_or_owner",
+    "environments:update": "rule:admin_or_owner",
+
+    "executions:create": "rule:admin_or_owner",
+    "executions:delete": "rule:admin_or_owner",
+    "executions:get": "rule:admin_or_owner",
+    "executions:list": "rule:admin_or_owner",
+    "executions:update": "rule:admin_or_owner",
+
+    "members:create": "rule:admin_or_owner",
+    "members:delete": "rule:admin_or_owner",
+    "members:get": "rule:admin_or_owner",
+    "members:list": "rule:admin_or_owner",
+    "members:update": "rule:admin_or_owner",
+
+    "services:list": "rule:admin_or_owner",
+
+    "tasks:get": "rule:admin_or_owner",
+    "tasks:list": "rule:admin_or_owner",
+    "tasks:update": "rule:admin_or_owner",
+
+    "workbooks:create": "rule:admin_or_owner",
+    "workbooks:delete": "rule:admin_or_owner",
+    "workbooks:get": "rule:admin_or_owner",
+    "workbooks:list": "rule:admin_or_owner",
+    "workbooks:update": "rule:admin_or_owner",
+
+    "workflows:create": "rule:admin_or_owner",
+    "workflows:delete": "rule:admin_or_owner",
+    "workflows:get": "rule:admin_or_owner",
+    "workflows:list": "rule:admin_or_owner",
+    "workflows:update": "rule:admin_or_owner",
+
+    "event_triggers:create": "rule:admin_or_owner",
+    "event_triggers:delete": "rule:admin_or_owner",
+    "event_triggers:get": "rule:admin_or_owner",
+    "event_triggers:list": "rule:admin_or_owner",
+    "event_triggers:update": "rule:admin_or_owner"
+}
diff --git a/mistral/templates/job-db-init.yaml b/mistral/templates/job-db-init.yaml
new file mode 100644
index 0000000000..0f985a347a
--- /dev/null
+++ b/mistral/templates/job-db-init.yaml
@@ -0,0 +1,79 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.db_init }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: mistral-db-init
+spec:
+  template:
+    metadata:
+      annotations:
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies "[]" | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      restartPolicy: OnFailure
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-db-init
+          image: {{ .Values.images.db_init | quote }}
+          imagePullPolicy: {{ .Values.images.pull_policy | quote }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            requests:
+              memory: {{ .Values.resources.mistral_db_init.requests.memory | quote }}
+              cpu: {{ .Values.resources.mistral_db_init.requests.cpu | quote }}
+            limits:
+              memory: {{ .Values.resources.mistral_db_init.limits.memory | quote }}
+              cpu: {{ .Values.resources.mistral_db_init.limits.cpu | quote }}
+          {{- end }}
+          env:
+            - name: ROOT_DB_CONNECTION
+              valueFrom:
+                secretKeyRef:
+                  name: mistral-db-root
+                  key: DB_CONNECTION
+            - name: OPENSTACK_CONFIG_FILE
+              value: /etc/mistral/mistral.conf
+            - name: OPENSTACK_CONFIG_DB_SECTION
+              value: database
+            - name: OPENSTACK_CONFIG_DB_KEY
+              value: connection
+          command:
+            - python
+            - /tmp/db-init.py
+          volumeMounts:
+            - name: mistral-bin
+              mountPath: /tmp/db-init.py
+              subPath: db-init.py
+              readOnly: true
+            - name: pod-etc-mistral
+              mountPath: /etc/mistral
+            - name: mistralconf
+              mountPath: /etc/mistral/mistral.conf
+              subPath: mistral.conf
+              readOnly: true
+      volumes:
+        - name: mistral-bin
+          configMap:
+            name: mistral-bin
+        - name: pod-etc-mistral
+          emptyDir: {}
+        - name: mistralconf
+          configMap:
+            name: mistral-etc
diff --git a/mistral/templates/job-db-sync.yaml b/mistral/templates/job-db-sync.yaml
new file mode 100644
index 0000000000..069563c37f
--- /dev/null
+++ b/mistral/templates/job-db-sync.yaml
@@ -0,0 +1,67 @@
+
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.db_sync }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: mistral-db-sync
+spec:
+  template:
+    metadata:
+      annotations:
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies "[]" | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      restartPolicy: OnFailure
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-db-sync
+          image: {{ .Values.images.db_sync }}
+          imagePullPolicy: {{ .Values.images.pull_policy }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            requests:
+              memory: {{ .Values.resources.mistral_db_sync.requests.memory | quote }}
+              cpu: {{ .Values.resources.mistral_db_sync.requests.cpu | quote }}
+            limits:
+              memory: {{ .Values.resources.mistral_db_sync.limits.memory | quote }}
+              cpu: {{ .Values.resources.mistral_db_sync.limits.cpu | quote }}
+          {{- end }}
+          command:
+            - bash
+            - /tmp/db-sync.sh
+          volumeMounts:
+            - name: pod-etc-mistral
+              mountPath: /etc/mistral
+            - name: mistralconf
+              mountPath: /etc/mistral/mistral.conf
+              subPath: mistral.conf
+              readOnly: true
+            - name: db-sync
+              mountPath: /tmp/db-sync.sh
+              subPath: db-sync.sh
+      volumes:
+        - name: pod-etc-mistral
+          emptyDir: {}
+        - name: mistralconf
+          configMap:
+            name: mistral-etc
+        - name: db-sync
+          configMap:
+            name: mistral-bin
diff --git a/mistral/templates/job-ks-endpoints.yaml b/mistral/templates/job-ks-endpoints.yaml
new file mode 100644
index 0000000000..094b6869fb
--- /dev/null
+++ b/mistral/templates/job-ks-endpoints.yaml
@@ -0,0 +1,73 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{- $envAll := . }}
+{{- $ksAdminSecret := $envAll.Values.keystone.admin_secret | default "mistral-env-keystone-admin" }}
+{{- $dependencies := .Values.dependencies.ks_endpoints }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: mistral-ks-endpoints
+spec:
+  template:
+    metadata:
+      annotations:
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies "[]" | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      restartPolicy: OnFailure
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+{{- range $key1, $osServiceType := tuple "workflow" }}
+{{- range $key2, $osServiceEndPoint := tuple "admin" "internal" "public" }}
+        - name: {{ $osServiceType }}-ks-endpoints-{{ $osServiceEndPoint }}
+          image: {{ $envAll.Values.images.ks_endpoints }}
+          imagePullPolicy: {{ $envAll.Values.images.pull_policy }}
+          {{- if $envAll.Values.resources.enabled }}
+          resources:
+            requests:
+              memory: {{ $envAll.Values.resources.mistral_ks_endpoints.requests.memory | quote }}
+              cpu: {{ $envAll.Values.resources.mistral_ks_endpoints.requests.cpu | quote }}
+            limits:
+              memory: {{ $envAll.Values.resources.mistral_ks_endpoints.limits.memory | quote }}
+              cpu: {{ $envAll.Values.resources.mistral_ks_endpoints.limits.cpu | quote }}
+          {{- end }}
+          command:
+            - bash
+            - /tmp/ks-endpoints.sh
+          volumeMounts:
+            - name: ks-endpoints-sh
+              mountPath: /tmp/ks-endpoints.sh
+              subPath: ks-endpoints.sh
+              readOnly: true
+          env:
+{{- with $env := dict "ksUserSecret" $ksAdminSecret }}
+{{- include "helm-toolkit.keystone_openrc_env_vars" $env | indent 12 }}
+{{- end }}
+            - name: OS_SVC_ENDPOINT
+              value: {{ $osServiceEndPoint }}
+            - name: OS_SERVICE_NAME
+              value: {{ tuple $osServiceType $envAll | include "helm-toolkit.keystone_endpoint_name_lookup" }}
+            - name: OS_SERVICE_TYPE
+              value: {{ $osServiceType }}
+            - name: OS_SERVICE_ENDPOINT
+              value: {{ tuple $osServiceType $osServiceEndPoint "api" $envAll | include "helm-toolkit.keystone_endpoint_uri_lookup" }}
+{{- end }}
+{{- end }}
+      volumes:
+        - name: ks-endpoints-sh
+          configMap:
+            name: mistral-bin
diff --git a/mistral/templates/job-ks-service.yaml b/mistral/templates/job-ks-service.yaml
new file mode 100644
index 0000000000..8d62704d6c
--- /dev/null
+++ b/mistral/templates/job-ks-service.yaml
@@ -0,0 +1,68 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{- $envAll := . }}
+{{- $ksAdminSecret := .Values.keystone.admin_secret | default "mistral-env-keystone-admin" }}
+{{- $dependencies := .Values.dependencies.ks_service }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: mistral-ks-service
+spec:
+  template:
+    metadata:
+      annotations:
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies "[]" | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      restartPolicy: OnFailure
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+{{- range $key1, $osServiceType := tuple "workflow" }}
+        - name: {{ $osServiceType }}-ks-service-registration
+          image: {{ $envAll.Values.images.ks_service }}
+          imagePullPolicy: {{ $envAll.Values.images.pull_policy }}
+          {{- if $envAll.Values.resources.enabled }}
+          resources:
+            requests:
+              memory: {{ $envAll.Values.resources.mistral_ks_service.requests.memory | quote }}
+              cpu: {{ $envAll.Values.resources.mistral_ks_service.requests.cpu | quote }}
+            limits:
+              memory: {{ $envAll.Values.resources.mistral_ks_service.limits.memory | quote }}
+              cpu: {{ $envAll.Values.resources.mistral_ks_service.limits.cpu | quote }}
+          {{- end }}
+          command:
+            - bash
+            - /tmp/ks-service.sh
+          volumeMounts:
+            - name: ks-service-sh
+              mountPath: /tmp/ks-service.sh
+              subPath: ks-service.sh
+              readOnly: true
+          env:
+{{- with $env := dict "ksUserSecret" $ksAdminSecret }}
+{{- include "helm-toolkit.keystone_openrc_env_vars" $env | indent 12 }}
+{{- end }}
+            - name: OS_SERVICE_NAME
+              value: {{ tuple $osServiceType $envAll | include "helm-toolkit.keystone_endpoint_name_lookup" }}
+            - name: OS_SERVICE_TYPE
+              value: {{ $osServiceType }}
+{{- end }}
+      volumes:
+        - name: ks-service-sh
+          configMap:
+            name: mistral-bin
+
diff --git a/mistral/templates/job-ks-user.yaml b/mistral/templates/job-ks-user.yaml
new file mode 100644
index 0000000000..7491b553a3
--- /dev/null
+++ b/mistral/templates/job-ks-user.yaml
@@ -0,0 +1,70 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+{{- $ksAdminSecret := .Values.keystone.admin_secret | default "mistral-env-keystone-admin" }}
+{{- $ksUserSecret := .Values.keystone.user_secret | default "mistral-env-keystone-user" }}
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.ks_user }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: mistral-ks-user
+spec:
+  template:
+    metadata:
+      annotations:
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies "[]" | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      restartPolicy: OnFailure
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-ks-user
+          image: {{ .Values.images.ks_user }}
+          imagePullPolicy: {{ .Values.images.pull_policy }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            requests:
+              memory: {{ .Values.resources.mistral_ks_user.requests.memory | quote }}
+              cpu: {{ .Values.resources.mistral_ks_user.requests.cpu | quote }}
+            limits:
+              memory: {{ .Values.resources.mistral_ks_user.limits.memory | quote }}
+              cpu: {{ .Values.resources.mistral_ks_user.limits.cpu | quote }}
+          {{- end }}
+          command:
+            - bash
+            - /tmp/ks-user.sh
+          volumeMounts:
+            - name: ks-user-sh
+              mountPath: /tmp/ks-user.sh
+              subPath: ks-user.sh
+              readOnly: true
+          env:
+{{- with $env := dict "ksUserSecret" $ksAdminSecret }}
+{{- include "helm-toolkit.keystone_openrc_env_vars" $env | indent 12 }}
+{{- end }}
+            - name: SERVICE_OS_SERVICE_NAME
+              value: "mistral"
+{{- with $env := dict "ksUserSecret" $ksUserSecret }}
+{{- include "helm-toolkit.keystone_user_create_env_vars" $env | indent 12 }}
+{{- end }}
+            - name: SERVICE_OS_ROLE
+              value: {{ .Values.keystone.mistral_user_role | quote }}
+      volumes:
+        - name: ks-user-sh
+          configMap:
+            name: mistral-bin
+
diff --git a/mistral/templates/secret-db-root.env.yaml b/mistral/templates/secret-db-root.env.yaml
new file mode 100644
index 0000000000..61799c277a
--- /dev/null
+++ b/mistral/templates/secret-db-root.env.yaml
@@ -0,0 +1,21 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: mistral-db-root
+type: Opaque
+data:
+  DB_CONNECTION: {{ tuple "oslo_db" "internal" "admin" "mysql" . | include "helm-toolkit.authenticated_endpoint_uri_lookup" | b64enc }}
diff --git a/mistral/templates/secret-keystone-admin.env.yaml b/mistral/templates/secret-keystone-admin.env.yaml
new file mode 100644
index 0000000000..988b66e5b5
--- /dev/null
+++ b/mistral/templates/secret-keystone-admin.env.yaml
@@ -0,0 +1,35 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: mistral-env-keystone-admin
+type: Opaque
+data:
+  OS_AUTH_URL: |
+{{ tuple "identity" "admin" "admin" . | include "helm-toolkit.keystone_endpoint_uri_lookup" | b64enc | indent 4 }}
+  OS_REGION_NAME: |
+{{ .Values.keystone.admin_region_name  | b64enc | indent 4 }}
+  OS_PROJECT_DOMAIN_NAME: |
+{{ .Values.keystone.admin_project_domain  | b64enc | indent 4 }}
+  OS_PROJECT_NAME: |
+{{ .Values.keystone.admin_project_name  | b64enc | indent 4 }}
+  OS_USER_DOMAIN_NAME: |
+{{ .Values.keystone.admin_user_domain  | b64enc | indent 4 }}
+  OS_USERNAME: |
+{{ .Values.keystone.admin_user  | b64enc | indent 4 }}
+  OS_PASSWORD: |
+{{ .Values.keystone.admin_password  | b64enc | indent 4 }}
+
diff --git a/mistral/templates/secret-keystone-user.env.yaml b/mistral/templates/secret-keystone-user.env.yaml
new file mode 100644
index 0000000000..228649fcbd
--- /dev/null
+++ b/mistral/templates/secret-keystone-user.env.yaml
@@ -0,0 +1,34 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: mistral-env-keystone-user
+type: Opaque
+data:
+  OS_AUTH_URL: |
+{{ tuple "identity" "internal" "api" . | include "helm-toolkit.keystone_endpoint_uri_lookup" | b64enc | indent 4 }}
+  OS_REGION_NAME: |
+{{ .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.region_name | b64enc | indent 4 }}
+  OS_PROJECT_DOMAIN_NAME: |
+{{ .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.project_domain_name | b64enc | indent 4 }}
+  OS_PROJECT_NAME: |
+{{ .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.project_name | b64enc | indent 4 }}
+  OS_USER_DOMAIN_NAME: |
+{{ .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.user_domain_name | b64enc | indent 4 }}
+  OS_USERNAME: |
+{{ .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.username | b64enc | indent 4 }}
+  OS_PASSWORD: |
+{{ .Values.conf.mistral.keystone_authtoken.keystonemiddleware.auth_token.password | b64enc | indent 4 }}
diff --git a/mistral/templates/service-api.yaml b/mistral/templates/service-api.yaml
new file mode 100644
index 0000000000..1e827b4a99
--- /dev/null
+++ b/mistral/templates/service-api.yaml
@@ -0,0 +1,29 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: mistral-api
+spec:
+  ports:
+    - port: {{ .Values.conf.mistral.api.mistral.config.port }}
+    {{ if .Values.network.api.node_port.enabled }}
+      nodePort: {{ .Values.network.api.node_port.port }}
+    {{ end }}
+  selector:
+    app: mistral-api
+  {{ if .Values.network.api.node_port.enabled }}
+  type: NodePort
+  {{ end }}
diff --git a/mistral/templates/statefulset-engine.yaml b/mistral/templates/statefulset-engine.yaml
new file mode 100644
index 0000000000..ec08f9998d
--- /dev/null
+++ b/mistral/templates/statefulset-engine.yaml
@@ -0,0 +1,72 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.engine }}
+{{- $mounts_mistral_engine := .Values.mounts.mistral_engine.mistral_engine }}
+{{- $mounts_mistral_engine_init := .Values.mounts.mistral_engine.init_container }}
+
+apiVersion: apps/v1beta1
+kind: StatefulSet
+metadata:
+  name: mistral-engine
+spec:
+  serviceName: mistral-engine
+  replicas: {{ .Values.replicas.engine }}
+  template:
+    metadata:
+      labels:
+        app: mistral-engine
+      annotations:
+        configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.hash" }}
+        configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.hash" }}
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies $mounts_mistral_engine_init | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-engine
+          image: {{ .Values.images.engine }}
+          imagePullPolicy: {{ .Values.images.pull_policy }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            limits:
+              cpu: {{ .Values.resources.engine.limits.cpu | quote }}
+              memory: {{ .Values.resources.engine.limits.memory | quote }}
+            requests:
+              cpu: {{ .Values.resources.engine.requests.cpu | quote }}
+              memory: {{ .Values.resources.engine.requests.memory | quote }}
+          {{- end }}
+          command:
+          - mistral-server
+          - --server
+          - engine
+          - --config-file
+          - /etc/mistral/mistral.conf
+          volumeMounts:
+            - name: pod-etc-mistral
+              mountPath: /etc/mistral
+            - name: mistralconf
+              mountPath: /etc/mistral/mistral.conf
+              subPath: mistral.conf
+              readOnly: true
+{{ if $mounts_mistral_engine.volumeMounts }}{{ toYaml $mounts_mistral_engine.volumeMounts | indent 12 }}{{ end }}
+      volumes:
+        - name: pod-etc-mistral
+          emptyDir: {}
+        - name: mistralconf
+          configMap:
+            name: mistral-etc
+{{ if $mounts_mistral_engine.volumes }}{{ toYaml $mounts_mistral_engine.volumes | indent 8 }}{{ end }}
diff --git a/mistral/templates/statefulset-event-engine.yaml b/mistral/templates/statefulset-event-engine.yaml
new file mode 100644
index 0000000000..517d8ce138
--- /dev/null
+++ b/mistral/templates/statefulset-event-engine.yaml
@@ -0,0 +1,72 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+{{- $envAll := . }}
+{{- $dependencies := .Values.dependencies.event_engine }}
+{{- $mounts_mistral_event_engine := .Values.mounts.mistral_event_engine.mistral_event_engine }}
+{{- $mounts_mistral_event_engine_init := .Values.mounts.mistral_event_engine.init_container }}
+
+apiVersion: apps/v1beta1
+kind: StatefulSet
+metadata:
+  name: mistral-event-engine
+spec:
+  serviceName: mistral-event-engine
+  replicas: {{ .Values.replicas.event_engine }}
+  template:
+    metadata:
+      labels:
+        app: mistral-event-engine
+      annotations:
+        configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.hash" }}
+        configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.hash" }}
+        pod.beta.kubernetes.io/init-containers: '[
+{{ tuple $envAll $dependencies $mounts_mistral_event_engine_init | include "helm-toolkit.kubernetes_entrypoint_init_container" | indent 10 }}
+        ]'
+    spec:
+      nodeSelector:
+        {{ .Values.labels.node_selector_key }}: {{ .Values.labels.node_selector_value }}
+      containers:
+        - name: mistral-event-engine
+          image: {{ .Values.images.event_engine }}
+          imagePullPolicy: {{ .Values.images.pull_policy }}
+          {{- if .Values.resources.enabled }}
+          resources:
+            limits:
+              cpu: {{ .Values.resources.event_engine.limits.cpu | quote }}
+              memory: {{ .Values.resources.event_engine.limits.memory | quote }}
+            requests:
+              cpu: {{ .Values.resources.event_engine.requests.cpu | quote }}
+              memory: {{ .Values.resources.event_engine.requests.memory | quote }}
+          {{- end }}
+          command:
+          - mistral-server
+          - --server
+          - event-engine
+          - --config-file
+          - /etc/mistral/mistral.conf
+          volumeMounts:
+            - name: pod-etc-mistral
+              mountPath: /etc/mistral
+            - name: mistralconf
+              mountPath: /etc/mistral/mistral.conf
+              subPath: mistral.conf
+              readOnly: true
+{{ if $mounts_mistral_event_engine.volumeMounts }}{{ toYaml $mounts_mistral_event_engine.volumeMounts | indent 12 }}{{ end }}
+      volumes:
+        - name: pod-etc-mistral
+          emptyDir: {}
+        - name: mistralconf
+          configMap:
+            name: mistral-etc
+{{ if $mounts_mistral_event_engine.volumes }}{{ toYaml $mounts_mistral_event_engine.volumes | indent 8 }}{{ end }}
diff --git a/mistral/values.yaml b/mistral/values.yaml
new file mode 100644
index 0000000000..d7927bfb16
--- /dev/null
+++ b/mistral/values.yaml
@@ -0,0 +1,302 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# 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.
+
+# Default values for mistral.
+# This is a YAML-formatted file.
+# Declare name/value pairs to be passed into your templates.
+# name: value
+
+
+replicas:
+  api: 1
+  engine: 1
+  event_engine: 1
+  executor: 1
+
+labels:
+  node_selector_key: openstack-control-plane
+  node_selector_value: enabled
+
+images:
+  dep_check: docker.io/kolla/ubuntu-source-kubernetes-entrypoint:4.0.0
+  db_init: docker.io/kolla/ubuntu-source-mistral-api:3.0.3
+  db_sync: docker.io/kolla/ubuntu-source-mistral-api:3.0.3
+  ks_user: docker.io/kolla/ubuntu-source-kolla-toolbox:3.0.3
+  ks_service: docker.io/kolla/ubuntu-source-kolla-toolbox:3.0.3
+  ks_endpoints: docker.io/kolla/ubuntu-source-kolla-toolbox:3.0.3
+  api: docker.io/kolla/ubuntu-source-mistral-api:3.0.3
+  engine: docker.io/kolla/ubuntu-source-mistral-engine:3.0.3
+  event_engine: docker.io/kolla/ubuntu-source-mistral-engine:3.0.3
+  executor: docker.io/kolla/ubuntu-source-mistral-executor:3.0.3
+  pull_policy: "IfNotPresent"
+
+upgrades:
+  revision_history: 3
+  pod_replacement_strategy: RollingUpdate
+  rolling_update:
+    max_unavailable: 1
+    max_surge: 3
+
+keystone_secrets:
+  admin: "mistral-env-keystone-admin"
+  user: "mistral-env-keystone-user"
+
+keystone:
+  admin_user: "admin"
+  admin_user_domain: "default"
+  admin_password: "password"
+  admin_project_name: "admin"
+  admin_project_domain: "default"
+  admin_region_name: "RegionOne"
+
+  mistral_user: "mistral"
+  mistral_user_domain: "default"
+  mistral_user_role: "admin"
+  mistral_password: "password"
+  mistral_project_name: "service"
+  mistral_project_domain: "default"
+  mistral_region_name: "RegionOne"
+
+network:
+  api:
+    name: "mistral-api"
+    proto: "http"
+    node_port:
+      enabled: false
+      port: 28989
+
+dependencies:
+  db_init:
+    jobs:
+    - mariadb-seed
+    service:
+    - mariadb
+  db_sync:
+    jobs:
+    - mistral-db-init
+    service:
+    - mariadb
+  ks_user:
+    service:
+    - keystone-api
+  ks_service:
+    service:
+    - keystone-api
+  ks_endpoints:
+    jobs:
+    - mistral-ks-service
+    service:
+    - keystone-api
+  api:
+    jobs:
+    - mistral-db-sync
+    - mistral-ks-user
+    - mistral-ks-endpoints
+    service:
+    - keystone-api
+    - mariadb
+  engine:
+    jobs:
+    - mistral-db-sync
+    - mistral-ks-user
+    - mistral-ks-endpoints
+    service:
+    - keystone-api
+    - mariadb
+  event_engine:
+    jobs:
+    - mistral-db-sync
+    - mistral-ks-user
+    - mistral-ks-endpoints
+    service:
+    - keystone-api
+    - mariadb
+  executor:
+    jobs:
+    - mistral-db-sync
+    - mistral-ks-user
+    - mistral-ks-endpoints
+    service:
+    - keystone-api
+    - mariadb
+
+# typically overriden by environmental
+# values, but should include all endpoints
+# required by this chart
+endpoints:
+  identity:
+    name: keystone
+    hosts:
+      default: keystone-api
+    path: /v3
+    scheme: 'http'
+    port:
+      admin: 35357
+      api: 5000
+  workflow:
+    name: mistral
+    hosts:
+      default: mistral-api
+    path: /v2
+    scheme: 'http'
+    port:
+      api: 8989
+  oslo_db:
+    auth:
+      admin:
+        username: root
+        password: password
+      user:
+        username: mistral
+        password: password
+    hosts:
+      default: mariadb
+    path: /mistral
+    scheme: mysql+pymysql
+    port:
+      mysql: 3306
+  oslo_messaging:
+    auth:
+      admin:
+        username: admin
+        password: password
+      user:
+        username: rabbitmq
+        password: password
+    hosts:
+      default: rabbitmq
+    path: /
+    scheme: rabbit
+    port:
+      amqp: 5672
+  oslo_cache:
+    hosts:
+      default: memcache
+    port:
+      memcache: 11211
+
+mounts:
+  mistral_api:
+    init_container: null
+    mistral_api:
+  mistral_executor:
+    init_container: null
+    mistral_executor:
+  mistral_engine:
+    init_container: null
+    mistral_engine:
+  mistral_event_engine:
+    init_container: null
+    mistral_event_engine:
+
+conf:
+  policy:
+    override:
+    append:
+  mistral:
+    override:
+    append:
+    default:
+      mistral:
+        conf:
+    api:
+      mistral:
+        config:
+          port: 8989
+          api_workers: 8
+    coordination:
+      mistral:
+        config:
+          backend_url:
+    database:
+      oslo:
+        db:
+          max_retries: -1
+    keystone_authtoken:
+      keystonemiddleware:
+        auth_token:
+          auth_type: password
+          auth_version: v3
+          region_name: RegionOne
+          project_name: service
+          project_domain_name: default
+          user_domain_name: default
+          username: mistral
+          password: password
+
+resources:
+  enabled: false
+  api:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  mistral_db_init:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  mistral_db_sync:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  mistral_ks_endpoints:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  mistral_ks_service:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  mistral_ks_user:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  engine:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  event_engine:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"
+  executor:
+    requests:
+      memory: "124Mi"
+      cpu: "100m"
+    limits:
+      memory: "1024Mi"
+      cpu: "2000m"