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"
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}"
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"]
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"}, }
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}"
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}"
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" }, ]
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"
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"] == []
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