舵机控制输入值

时间:2019-01-25 13:12:42

标签: kubernetes-helm

我正在寻找一种控制输入值(在values.yaml中定义)的解决方案。我想检查输入值是否被授权。

示例:

values.yaml

provider: aws

services:
  - nginx
  - varnish
  - php

在另一个文件中(也许是_helpers.tpl?)

authorized_providers:
  - aws
  - azure
authorized_services:
  - nginx
  - php

并输入错误消息(如果可能,显示自定义消息),以表明输入值不受支持/授权。

我的目标是避免生成不支持值的Kubernetes配置图(helm安装有效,但此配置会产生容器错误)。

编辑:

我终于找到了使用“必填”的技巧。 按照我的示例使用values.yaml配置文件。

我在_helpers.tpl中定义:

{{/*
Define the authorized Value for the parameter: .Values.provider 
*/}}
{{- define "authorized.provider" }}
{{- printf "aws,azure" }}
{{- end }}

{{/*
Define the error message if the .Values.provider doesn't respect the authorized.provider condition.
*/}}
{{- define "error.provider" }}
{{- $provider := include "authorized.provider" . }}
{{- printf "Invalid value set for .Values.provider - Must be one of %s" $provider }}
{{- end }}



{{/*
Define the authorized Value for the parameter: .Values.services 
*/}}
{{- define "authorized.services" }}
{{- printf "nginx,php" }}
{{- end }}

{{/*
Define the error message if the .Values.services doesn't respect the authorized.services condition.
*/}}
{{- define "error.services" }}
{{- $services := include "authorized.services" . }}
{{- printf "Invalid value set for .Values.services - Authorized values are %s" $services }}
{{- end }}

接下来,我创建了另一个文件:input-values-validation.yaml

{{- $provider := include "authorized.provider" . }}
{{- $errorProvider := include "error.provider" . }}
{{- if not (has .Values.provider (splitList "," $provider)) }}
{{ required  $errorProvider .Values.foo  }}
{{- end }}

{{- $services := include "authorized.services" . }}
{{- $errorServices := include "error.Services" . }}
{{- $root := . -}}
{{- range .Values.services }}
{{- if not (has . (splitList "," $services)) }}
{{ required  $errorServices $root.Values.foo  }}
{{- end }}
{{- end }}

输入值错误时输出:

==> Linting 
[ERROR] templates/: render error in "templates/input-values-validation.yaml": template: templates/input-values-validation.yaml:12:3: executing "templates/input-values-validation.yaml" at<required $errorServ...>: error calling required: Invalid value set for .Values.services - Authorized values are nginx,php

信息:

“。Values.foo”一定不能在values.yaml文件中设置。我用它使“必需的”检查失败并引发错误。 我试图将“ input-values-validation.yaml”的内容放在_helpers.tpl文件中,但这会生成错误“ [ERROR] templates /:渲染模板失败:运行时错误:无效的内存地址或nil指针取消引用” ”。似乎“必需”功能只能在yaml文件中使用。

因此,使用此解决方案,我可以在_helpers.tpl文件中定义授权值,并生成“自定义”错误消息。而且如果将来我支持更多的提供者/服务(以我的示例为例),则只需修改“ authorized.provider”和“ authorized.services”中的值。

1 个答案:

答案 0 :(得分:0)

我还没有看到使用helm2做到这一点,至少在扫描official charts(定义{{​​3}}的尝试中没有)。

最棘手的地方是能够给出一个很好的错误-我所看到的最接近的是common functions in an incubator chart

但是helm3应该使用sprig fail functionschemas

提供这种验证。

否则,您可以这样做:

aws:
  nginx: false
  varnish: false
  php: true

以便图表用户使用真/假选择他们想要的服务