blob: 7c85328c1cc285c648d7180d45aefd91d2e228e4 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import textwrap
import unittest
from base64 import b64encode
from unittest import mock
import yaml
from parameterized import parameterized
from tests.charts.helm_template_generator import prepare_k8s_lookup_dict, render_chart
RELEASE_NAME = "test-extra-configmaps-secrets"
class ExtraConfigMapsSecretsTest(unittest.TestCase):
def test_extra_configmaps(self):
values_str = textwrap.dedent(
"""
extraConfigMaps:
"{{ .Release.Name }}-airflow-variables":
data: |
AIRFLOW_VAR_HELLO_MESSAGE: "Hi!"
AIRFLOW_VAR_KUBERNETES_NAMESPACE: "{{ .Release.Namespace }}"
"{{ .Release.Name }}-other-variables":
data: |
HELLO_WORLD: "Hi again!"
"""
)
values = yaml.safe_load(values_str)
k8s_objects = render_chart(
RELEASE_NAME, values=values, show_only=["templates/configmaps/extra-configmaps.yaml"]
)
k8s_objects_by_key = prepare_k8s_lookup_dict(k8s_objects)
all_expected_keys = [
("ConfigMap", f"{RELEASE_NAME}-airflow-variables"),
("ConfigMap", f"{RELEASE_NAME}-other-variables"),
]
assert set(k8s_objects_by_key.keys()) == set(all_expected_keys)
all_expected_data = [
{"AIRFLOW_VAR_HELLO_MESSAGE": "Hi!", "AIRFLOW_VAR_KUBERNETES_NAMESPACE": "default"},
{"HELLO_WORLD": "Hi again!"},
]
for expected_key, expected_data in zip(all_expected_keys, all_expected_data):
configmap_obj = k8s_objects_by_key[expected_key]
assert configmap_obj["data"] == expected_data
def test_extra_secrets(self):
values_str = textwrap.dedent(
"""
extraSecrets:
"{{ .Release.Name }}-airflow-connections":
data: |
AIRFLOW_CON_AWS: {{ printf "aws_connection_string" | b64enc }}
stringData: |
AIRFLOW_CON_GCP: "gcp_connection_string"
"{{ .Release.Name }}-other-secrets":
data: |
MY_SECRET_1: {{ printf "MY_SECRET_1" | b64enc }}
MY_SECRET_2: {{ printf "MY_SECRET_2" | b64enc }}
stringData: |
MY_SECRET_3: "MY_SECRET_3"
MY_SECRET_4: "MY_SECRET_4"
"{{ .Release.Name }}-other-secrets-with-type":
type: kubernetes.io/dockerconfigjson
data: |
MY_SECRET_5: {{ printf "MY_SECRET_5" | b64enc }}
MY_SECRET_6: {{ printf "MY_SECRET_6" | b64enc }}
stringData: |
MY_SECRET_7: "MY_SECRET_7"
MY_SECRET_8: "MY_SECRET_8"
"""
)
values = yaml.safe_load(values_str)
k8s_objects = render_chart(
RELEASE_NAME, values=values, show_only=["templates/secrets/extra-secrets.yaml"]
)
k8s_objects_by_key = prepare_k8s_lookup_dict(k8s_objects)
all_expected_keys = [
("Secret", f"{RELEASE_NAME}-airflow-connections"),
("Secret", f"{RELEASE_NAME}-other-secrets"),
("Secret", f"{RELEASE_NAME}-other-secrets-with-type"),
]
assert set(k8s_objects_by_key.keys()) == set(all_expected_keys)
all_expected_data = [
{"AIRFLOW_CON_AWS": b64encode(b"aws_connection_string").decode("utf-8")},
{
"MY_SECRET_1": b64encode(b"MY_SECRET_1").decode("utf-8"),
"MY_SECRET_2": b64encode(b"MY_SECRET_2").decode("utf-8"),
},
{
"MY_SECRET_5": b64encode(b"MY_SECRET_5").decode("utf-8"),
"MY_SECRET_6": b64encode(b"MY_SECRET_6").decode("utf-8"),
},
]
all_expected_string_data = [
{"AIRFLOW_CON_GCP": "gcp_connection_string"},
{"MY_SECRET_3": "MY_SECRET_3", "MY_SECRET_4": "MY_SECRET_4"},
{"MY_SECRET_7": "MY_SECRET_7", "MY_SECRET_8": "MY_SECRET_8"},
]
all_expected_types = [None, None, "kubernetes.io/dockerconfigjson"]
for expected_key, expected_data, expected_string_data, expected_type in zip(
all_expected_keys, all_expected_data, all_expected_string_data, all_expected_types
):
configmap_obj = k8s_objects_by_key[expected_key]
if expected_type:
assert configmap_obj["type"] == expected_type
else:
assert "type" not in configmap_obj
assert configmap_obj["data"] == expected_data
assert configmap_obj["stringData"] == expected_string_data
def test_extra_configmaps_secrets_labels(self):
k8s_objects = render_chart(
name=RELEASE_NAME,
values={
"labels": {"label1": "value1", "label2": "value2"},
"extraSecrets": {"{{ .Release.Name }}-extra-secret-1": {"stringData": "data: secretData"}},
"extraConfigMaps": {"{{ .Release.Name }}-extra-configmap-1": {"data": "data: configData"}},
},
show_only=["templates/configmaps/extra-configmaps.yaml", "templates/secrets/extra-secrets.yaml"],
)
expected_labels = {
"label1": "value1",
"label2": "value2",
"release": RELEASE_NAME,
"heritage": "Helm",
"chart": mock.ANY,
}
for k8s_object in k8s_objects:
assert k8s_object['metadata']['labels'] == expected_labels
@parameterized.expand(
[
({}, {"label3": "value3", "label4": "value4"}),
({"label1": "value1", "label2": "value2"}, {}),
({"label1": "value1", "label2": "value2"}, {"label3": "value3", "label4": "value4"}),
]
)
def test_extra_configmaps_secrets_additional_labels(self, chart_labels, local_labels):
k8s_objects = render_chart(
name=RELEASE_NAME,
values={
"labels": chart_labels,
"extraSecrets": {
"{{ .Release.Name }}-extra-secret-1": {
"labels": local_labels,
"stringData": "data: secretData",
}
},
"extraConfigMaps": {
"{{ .Release.Name }}-extra-configmap-1": {
"labels": local_labels,
"data": "data: configData",
}
},
},
show_only=["templates/configmaps/extra-configmaps.yaml", "templates/secrets/extra-secrets.yaml"],
)
common_labels = {
"release": RELEASE_NAME,
"heritage": "Helm",
"chart": mock.ANY,
}
for k8s_object in k8s_objects:
assert k8s_object['metadata']['labels'] == {**common_labels, **chart_labels, **local_labels}