Кодировать целое число в шаблоне Helm
Я работаю над набором шаблонов Helm для веб-службы, которая принимает в качестве части конфигурации целочисленный идентификатор. Этот идентификатор становится частью конечных точек службы и закодирован в безопасный для веб-использования набор символов base64:
0=A
1=B
2=C
...
26=a
...
63=_
В моем шаблоне Helm я хочу взять этот целочисленный идентификатор и определить закодированное значение, чтобы я мог вставить его в Nginx location
блок. Фактическая логика кодирования выглядит примерно так (псевдокод):
func Encode(int i) {
byte b = i << 2 # shift integer two bits
string s = web_base64(b)
char c = s[0] # return first char only
}
Пока что самое близкое, что я получил в Helm, - это просто создание поиска, например $d := dict "0" "A" "1" "B" "2" "C" ...
а затем используя {{ .Values.Id | toString | get $d }}
.
Есть другой способ?
1 ответ
Наконец я придумал это:
{{- with .Values.deployment.Id | int }}
{{- if eq . 63 }}_
{{- else if eq . 62 }}-
{{- else if gt . 51 }}{{- sub . 52 | printf "%c" }}
{{- else if gt . 25 }}{{- add . 71 | printf "%c" }}
{{- else }}{{- add . 65 | printf "%c" }}
{{- end }}
{{- end }}
Понимая, что я могу выполнить порядковое преобразование через printf
был важным моментом, и это прекрасно работает, пока значение.Id не равно 0. Если это так, весь блок просто пропускается. Похоже, это ограничениеwith
ключевое слово. Итак, я остался с этим:
{{- if eq (int .Values.deployment.Id) 63 }}_
{{- else if eq (int .Values.deployment.Id) 62 }}-
{{- else if gt (int .Values.deployment.Id) 51 }}{{- sub (int .Values.deployment.Id) 52 | printf "%c" }}
{{- else if gt (int .Values.deployment.Id) 25 }}{{- add (int .Values.deployment.Id) 71 | printf "%c" }}
{{- else }}{{- add (int .Values.deployment.Id) 65 | printf "%c" }}
{{- end }}
Это все еще немного уродливо, но лучше, чем огромный поиск.