diff --git a/airflow/kubernetes/pod_generator.py b/airflow/kubernetes/pod_generator.py index 28c21050c0f8c..61cef26375411 100644 --- a/airflow/kubernetes/pod_generator.py +++ b/airflow/kubernetes/pod_generator.py @@ -469,7 +469,10 @@ def make_unique_pod_id(pod_id: str) -> str: safe_uuid = uuid.uuid4().hex # safe uuid will always be less than 63 chars trimmed_pod_id = pod_id[:MAX_LABEL_LEN] - safe_pod_id = f"{trimmed_pod_id}.{safe_uuid}" + + # Since we use '.' as separator we need to remove all the occurences of '-' if any + # in the trimmed_pod_id as the regex does not allow '-' followed by '.'. + safe_pod_id = f"{trimmed_pod_id.rstrip('-')}.{safe_uuid}" return safe_pod_id diff --git a/tests/kubernetes/test_pod_generator.py b/tests/kubernetes/test_pod_generator.py index 5ba72a58440c5..b399d921bc82e 100644 --- a/tests/kubernetes/test_pod_generator.py +++ b/tests/kubernetes/test_pod_generator.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. import os +import re import sys import unittest import uuid @@ -656,6 +657,24 @@ def test_pod_name_confirm_to_max_length(self, _, pod_id): assert len(parts[0]) <= 63 assert len(parts[1]) <= 63 + @parameterized.expand( + ( + ("pod-name-with-hyphen-", "pod-name-with-hyphen"), + ("pod-name-with-double-hyphen--", "pod-name-with-double-hyphen"), + ("pod0-name", "pod0-name"), + ("simple", "simple"), + ) + ) + def test_pod_name_is_valid(self, pod_id, expected_starts_with): + name = PodGenerator.make_unique_pod_id(pod_id) + + regex = r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$" + assert ( + len(name) <= 253 and all(ch.lower() == ch for ch in name) and re.match(regex, name) + ), "pod_id is invalid - fails allowed regex check" + + assert name.rsplit(".")[0] == expected_starts_with + def test_deserialize_model_string(self): fixture = """ apiVersion: v1