Example #1
0
    def test_nats_statefulset_with_metrics_and_resources(self, kube_version):
        """Test that nats statefulset renders good metrics exporter."""
        docs = render_chart(
            kube_version=kube_version,
            show_only=["charts/nats/templates/statefulset.yaml"],
            values={
                "nats": {
                    "exporter": {
                        "enabled": True,
                        "resources": {
                            "requests": {
                                "cpu": "234m"
                            }
                        },
                    },
                    "nats": {
                        "resources": {
                            "requests": {
                                "cpu": "123m"
                            }
                        }
                    },
                },
            },
        )

        assert len(docs) == 1
        c_by_name = get_containers_by_name(docs[0])
        assert len(c_by_name) == 2
        assert c_by_name["nats"]["resources"]["requests"]["cpu"] == "123m"
        assert c_by_name["metrics"]["resources"]["requests"]["cpu"] == "234m"
Example #2
0
    def test_postgresql_statefulset_with_private_registry_enabled(
            self, kube_version):
        """Test postgresql with privateRegistry=True."""
        repository = "private-repository.example.com"
        docs = render_chart(
            kube_version=kube_version,
            values={
                "global": {
                    "privateRegistry": {
                        "enabled": True,
                        "repository": repository,
                    },
                    "postgresqlEnabled": True,
                },
            },
            show_only=[
                "charts/postgresql/templates/statefulset.yaml",
            ],
        )

        for doc in docs:
            c_by_name = get_containers_by_name(doc=doc,
                                               include_init_containers=True)
            for name, container in c_by_name.items():
                assert container["image"].startswith(
                    repository
                ), f"Container named '{name}' does not use registry '{repository}': {container}"
Example #3
0
 def test_default_chart_with_basedomain(self, doc):
     """Test that each container in each pod spec renders."""
     c_by_name = get_containers_by_name(doc, include_init_containers=True)
     for name, container in c_by_name.items():
         assert container[
             "image"], f"container {name} does not have an image: {doc}"
         assert container["imagePullPolicy"]
Example #4
0
    def test_houston_api_deployment(self, kube_version):
        docs = render_chart(
            kube_version=kube_version,
            show_only=[
                "charts/astronomer/templates/houston/api/houston-deployment.yaml"
            ],
        )

        assert len(docs) == 1
        doc = docs[0]

        assert doc["kind"] == "Deployment"
        assert "annotations" not in doc["metadata"]
        assert (
            {
                "tier": "astronomer",
                "component": "houston",
                "release": "release-name",
            }
            == doc["spec"]["selector"]["matchLabels"]
            == doc["spec"]["template"]["metadata"]["labels"]
        )

        c_by_name = get_containers_by_name(doc, include_init_containers=True)
        assert c_by_name["houston-bootstrapper"]["image"].startswith(
            "quay.io/astronomer/ap-db-bootstrapper:"
        )
        assert c_by_name["houston"]["image"].startswith(
            "quay.io/astronomer/ap-houston-api:"
        )
        assert c_by_name["wait-for-db"]["image"].startswith(
            "quay.io/astronomer/ap-houston-api:"
        )
    def test_kube_state_deployment_custom_resources(self, kube_version):
        docs = render_chart(
            kube_version=kube_version,
            values={
                "kube-state": {
                    "resources": {
                        "limits": {"cpu": "777m", "memory": "999Mi"},
                        "requests": {"cpu": "666m", "memory": "888Mi"},
                    }
                },
            },
            show_only=["charts/kube-state/templates/kube-state-deployment.yaml"],
        )

        assert len(docs) == 1
        doc = docs[0]

        assert doc["kind"] == "Deployment"
        assert doc["metadata"]["name"] == "release-name-kube-state"

        c_by_name = get_containers_by_name(doc)
        assert c_by_name["kube-state"]
        assert c_by_name["kube-state"]["resources"] == {
            "limits": {"cpu": "777m", "memory": "999Mi"},
            "requests": {"cpu": "666m", "memory": "888Mi"},
        }
Example #6
0
    def test_stan_statefulset_with_private_registry(self, kube_version):
        """Test that stan statefulset properly uses the private registry images."""
        private_registry = "private-registry.example.com"
        docs = render_chart(
            kube_version=kube_version,
            show_only=["charts/stan/templates/statefulset.yaml"],
            values={
                "global": {
                    "privateRegistry": {
                        "enabled": True,
                        "repository": private_registry,
                    }
                }
            },
        )

        assert len(docs) == 1
        doc = docs[0]

        c_by_name = get_containers_by_name(doc, include_init_containers=True)

        assert doc["kind"] == "StatefulSet"
        assert doc["apiVersion"] == "apps/v1"

        for name, container in c_by_name.items():
            assert container["image"].startswith(
                private_registry
            ), f"Container named '{name}' does not use registry '{private_registry}': {container}"
Example #7
0
    def test_all_default_charts_with_private_registry(self, doc):
        """Test that each chart uses the privateRegistry.

        This only finds default images, not the many which are hidden behind feature flags.
        """
        c_by_name = get_containers_by_name(doc)

        for name, container in c_by_name.items():
            assert container["image"].startswith(
                self.private_repo
            ), f"The container '{name}' does not use the privateRegistry repo '{self.private_repo}': {container}"
Example #8
0
    def test_prometheus_sts_basic_cases(self, kube_version):
        """Test some things that should apply to all cases."""
        docs = render_chart(
            kube_version=kube_version,
            show_only=self.show_only,
        )
        assert len(docs) == 1
        doc = docs[0]

        assert doc["kind"] == "StatefulSet"
        assert doc["apiVersion"] == "apps/v1"
        assert doc["metadata"]["name"] == "release-name-prometheus"
        assert len(doc["spec"]["template"]["spec"]["containers"]) == 2

        sc = doc["spec"]["template"]["spec"]["securityContext"]
        assert sc["fsGroup"] == 65534
        assert sc["runAsUser"] == 65534
        assert sc["runAsNonRoot"] is True

        c_by_name = get_containers_by_name(doc)
        assert c_by_name["configmap-reloader"]["image"].startswith(
            "quay.io/astronomer/ap-configmap-reloader:")
        assert c_by_name["configmap-reloader"]["volumeMounts"] == [
            {
                "mountPath": "/etc/prometheus/alerts.d",
                "name": "alert-volume"
            },
            {
                "mountPath": "/etc/prometheus/config",
                "name": "prometheus-config-volume"
            },
        ]
        assert c_by_name["prometheus"]["image"].startswith(
            "quay.io/astronomer/ap-prometheus:")
        assert c_by_name["prometheus"]["ports"] == [{
            "containerPort": 9090,
            "name": "prometheus-data"
        }]
        assert c_by_name["prometheus"]["volumeMounts"] == [
            {
                "mountPath": "/etc/prometheus/config",
                "name": "prometheus-config-volume"
            },
            {
                "mountPath": "/etc/prometheus/alerts.d",
                "name": "alert-volume"
            },
            {
                "mountPath": "/prometheus",
                "name": "data"
            },
        ]
Example #9
0
    def test_stan_statefulset_with_custom_images(self, kube_version):
        """Test we can customize the stan images."""
        docs = render_chart(
            kube_version=kube_version,
            show_only=["charts/stan/templates/statefulset.yaml"],
            values={
                "stan": {
                    "images": {
                        "init": {
                            "repository":
                            "example.com/custom/image/the-init-image",
                            "tag": "the-custom-init-tag",
                            "pullPolicy": "Always",
                        },
                        "stan": {
                            "repository":
                            "example.com/custom/image/the-stan-image",
                            "tag": "the-custom-stan-tag",
                            "pullPolicy": "Always",
                        },
                    },
                },
            },
        )

        assert len(docs) == 1
        doc = docs[0]
        c_by_name = get_containers_by_name(doc, include_init_containers=True)

        assert doc["kind"] == "StatefulSet"
        assert doc["apiVersion"] == "apps/v1"

        assert (c_by_name["stan"]["image"] ==
                "example.com/custom/image/the-stan-image:the-custom-stan-tag")
        assert c_by_name["stan"]["imagePullPolicy"] == "Always"
        assert (c_by_name["wait-for-nats-server"]["image"] ==
                "example.com/custom/image/the-init-image:the-custom-init-tag")
        assert c_by_name["stan"]["imagePullPolicy"] == "Always"
Example #10
0
    def test_nats_statefulset_defaults(self, kube_version):
        """Test that nats statefulset is good with defaults."""
        docs = render_chart(
            kube_version=kube_version,
            show_only=["charts/nats/templates/statefulset.yaml"],
        )

        assert len(docs) == 1
        doc = docs[0]
        c_by_name = get_containers_by_name(doc)
        assert doc["kind"] == "StatefulSet"
        assert doc["apiVersion"] == "apps/v1"
        assert doc["metadata"]["name"] == "release-name-nats"
        assert c_by_name["metrics"]["image"].startswith(
            "quay.io/astronomer/ap-nats-exporter:")
        assert c_by_name["nats"]["image"].startswith(
            "quay.io/astronomer/ap-nats-server:")
        assert c_by_name["nats"]["livenessProbe"] == {
            "httpGet": {
                "path": "/",
                "port": 8222
            },
            "initialDelaySeconds": 10,
            "timeoutSeconds": 5,
        }
        assert c_by_name["nats"]["readinessProbe"] == {
            "httpGet": {
                "path": "/",
                "port": 8222
            },
            "initialDelaySeconds": 10,
            "timeoutSeconds": 5,
        }

        assert doc["spec"]["template"]["spec"]["nodeSelector"] == {}
        assert doc["spec"]["template"]["spec"]["affinity"] == {}
        assert doc["spec"]["template"]["spec"]["tolerations"] == []
Example #11
0
    def test_astronomer_namespace_pools_commander_deployment_configuration(
        self, kube_version
    ):
        """Test that commander deployment is configured properly when enabling namespace pools"""

        namespaces = ["my-namespace-1", "my-namespace-2"]
        doc = render_chart(
            kube_version=kube_version,
            values={
                "global": {
                    "features": {
                        "namespacePools": {
                            "enabled": True,
                            "namespaces": {"create": True, "names": namespaces},
                        }
                    }
                }
            },
            show_only=[
                "charts/astronomer/templates/commander/commander-deployment.yaml"
            ],
        )[0]

        # Check that by enabling global.features.namespacePools, the environment variable COMMANDER_MANUAL_NAMESPACE_NAMES
        # is configured properly
        c_by_name = get_containers_by_name(doc, include_init_containers=False)

        manual_ns_env_found = False
        for env in c_by_name["commander"]["env"]:
            if (
                env["name"] == "COMMANDER_MANUAL_NAMESPACE_NAMES"
                and env["value"] == "true"
            ):
                manual_ns_env_found = True

        assert manual_ns_env_found

        # If namespacePools is disabled, we should not add the Manual Namespace Names environment variable in commander
        doc = render_chart(
            kube_version=kube_version,
            values={
                "global": {
                    "features": {
                        "namespacePools": {
                            "enabled": False,
                            "namespaces": {"create": True, "names": namespaces},
                        }
                    }
                }
            },
            show_only=[
                "charts/astronomer/templates/commander/commander-deployment.yaml"
            ],
        )[0]

        # Check that by enabling global.features.namespacePools, the environment variable COMMANDER_MANUAL_NAMESPACE_NAMES
        # is configured properly
        c_by_name = get_containers_by_name(doc, include_init_containers=False)

        manual_ns_env_found = False
        for env in c_by_name["commander"]["env"]:
            if (
                env["name"] == "COMMANDER_MANUAL_NAMESPACE_NAMES"
                and env["value"] == "true"
            ):
                manual_ns_env_found = True

        assert not manual_ns_env_found