From 2a42f797e57d49a36e49f77e35ef790def5e0cab Mon Sep 17 00:00:00 2001 From: Shyukri Shyukriev Date: Thu, 23 Jul 2026 13:35:49 +0300 Subject: [PATCH] StackIT support --- CHANGES.rst | 2 ++ crate/operator/constants.py | 1 + crate/operator/create.py | 4 ++++ docs/source/configuration.rst | 1 + tests/test_create.py | 15 ++++++++++++++- tests/test_openshift.py | 36 +++++++++++++++++++++++++++++++---- tests/test_upgrade.py | 3 ++- 7 files changed, 56 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 86c8defb..9404e506 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,8 @@ Changelog Unreleased ---------- +* Added support for ``stackit`` as a cloud provider. + 2.62.2 (2026-07-22) ------------------- diff --git a/crate/operator/constants.py b/crate/operator/constants.py index efbeb1fe..9767052a 100644 --- a/crate/operator/constants.py +++ b/crate/operator/constants.py @@ -91,6 +91,7 @@ class CloudProvider(str, enum.Enum): AZURE = "azure" GCP = "gcp" OPENSHIFT = "openshift" + STACKIT = "stackit" class Port(enum.Enum): diff --git a/crate/operator/create.py b/crate/operator/create.py index 1b41dfb0..bf65b6f1 100644 --- a/crate/operator/create.py +++ b/crate/operator/create.py @@ -285,6 +285,7 @@ def get_topology_spread( CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP, + CloudProvider.STACKIT, }: topology_spread = [ V1TopologySpreadConstraint( @@ -597,6 +598,9 @@ def get_statefulset_crate_command( settings["-Cnode.attr.zone"] = ( f"$(curl -s '{url}' -H 'Metadata-Flavor: Google' | awk -F'/' '{{print $NF}}')" # noqa ) + elif config.CLOUD_PROVIDER == CloudProvider.STACKIT: + url = "http://169.254.169.254/latest/meta-data/placement/availability-zone" # noqa + settings["-Cnode.attr.zone"] = f"$(curl -s '{url}')" if cluster_settings: for k, v in cluster_settings.items(): diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst index 2bbbf560..f0caea1e 100644 --- a/docs/source/configuration.rst +++ b/docs/source/configuration.rst @@ -51,6 +51,7 @@ expected to use upper case letters and must be prefixed with - ``azure`` - ``gcp`` - ``openshift`` (Red Hat OpenShift Container Platform) + - ``stackit`` (STACKIT) When set to ``openshift``, the operator will: diff --git a/tests/test_create.py b/tests/test_create.py index 90dda9a4..8b1151f4 100644 --- a/tests/test_create.py +++ b/tests/test_create.py @@ -230,7 +230,15 @@ def test_shared_resources_affinity(self, node_spec, faker): } ] - @pytest.mark.parametrize("provider", [CloudProvider.AWS, CloudProvider.AZURE]) + @pytest.mark.parametrize( + "provider", + [ + CloudProvider.AWS, + CloudProvider.AZURE, + CloudProvider.GCP, + CloudProvider.STACKIT, + ], + ) def test_cloud_provider(self, provider, faker): name = faker.domain_word() with mock.patch("crate.operator.create.config.TESTING", False): @@ -693,6 +701,11 @@ def test_node_and_cluster_settings_may_override(self): "'http://169.254.169.254/computeMetadata/v1/instance/zone'", " -H 'Metadata-Flavor: Google' | awk -F'/' '{print $NF}'", ), + ( + CloudProvider.STACKIT, + "'http://169.254.169.254/latest/meta-data/placement/availability-zone'", # noqa + "", + ), ], ) def test_zone_attr(self, provider, url, header): diff --git a/tests/test_openshift.py b/tests/test_openshift.py index 2aee7c4b..1a73b3dc 100644 --- a/tests/test_openshift.py +++ b/tests/test_openshift.py @@ -50,7 +50,14 @@ def test_openshift_disables_block_owner_deletion(self, faker): assert owner_refs[0].name == name @pytest.mark.parametrize( - "provider", [None, CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP] + "provider", + [ + None, + CloudProvider.AWS, + CloudProvider.AZURE, + CloudProvider.GCP, + CloudProvider.STACKIT, + ], ) def test_non_openshift_enables_block_owner_deletion(self, provider, faker): name = faker.domain_word() @@ -78,7 +85,14 @@ def test_openshift_skips_sysctl_init_container(self): assert "mkdir-heapdump" in container_names @pytest.mark.parametrize( - "provider", [None, CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP] + "provider", + [ + None, + CloudProvider.AWS, + CloudProvider.AZURE, + CloudProvider.GCP, + CloudProvider.STACKIT, + ], ) def test_non_openshift_includes_sysctl_init_container(self, provider): with mock.patch("crate.operator.create.config.CLOUD_PROVIDER", provider): @@ -186,7 +200,14 @@ def test_openshift_sidecar_uses_ssl_aware_url(self, faker): assert crate_http_url.value == "https://localhost:4200/_sql" @pytest.mark.parametrize( - "provider", [None, CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP] + "provider", + [ + None, + CloudProvider.AWS, + CloudProvider.AZURE, + CloudProvider.GCP, + CloudProvider.STACKIT, + ], ) def test_non_openshift_no_crate_control_sidecar(self, provider, faker): name = faker.domain_word() @@ -255,7 +276,14 @@ def test_openshift_skips_lifecycle_hooks(self, faker): ) @pytest.mark.parametrize( - "provider", [None, CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP] + "provider", + [ + None, + CloudProvider.AWS, + CloudProvider.AZURE, + CloudProvider.GCP, + CloudProvider.STACKIT, + ], ) def test_non_openshift_includes_lifecycle_hooks(self, provider, faker): name = faker.domain_word() diff --git a/tests/test_upgrade.py b/tests/test_upgrade.py index ff3612b1..a9a9e947 100644 --- a/tests/test_upgrade.py +++ b/tests/test_upgrade.py @@ -254,7 +254,8 @@ def test_upgrade_sts_command_with_jwt(): @pytest.mark.parametrize( - "provider", [CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP] + "provider", + [CloudProvider.AWS, CloudProvider.AZURE, CloudProvider.GCP, CloudProvider.STACKIT], ) def test_upgrade_sts_command_hostname_zone(provider): cmd = [