From c08091c61702e7723c990f93f3ddc4d8430e9518 Mon Sep 17 00:00:00 2001 From: Christian Siegel Date: Wed, 4 Aug 2021 10:13:57 +0200 Subject: [PATCH] feat(GitOpsCli): add var PREVIEW_ID_HASH_SHORT --- docs/includes/preview-configuration.md | 1 + gitopscli/gitops_config.py | 23 +++++++++++++++++++---- tests/test_gitops_config_v2.py | 5 +++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/includes/preview-configuration.md b/docs/includes/preview-configuration.md index bb063130..3a3dd305 100644 --- a/docs/includes/preview-configuration.md +++ b/docs/includes/preview-configuration.md @@ -63,5 +63,6 @@ previewConfig: - `create-preview`: The CLI provided `--preview-id` - `create-pr-preview`: The branch name in the *app repository* - `PREVIEW_ID_HASH`: The first 8 characters of the SHA256 hash of `PREVIEW_ID` +- `PREVIEW_ID_HASH_SHORT`: The first 3 characters of the SHA256 hash of `PREVIEW_ID` - `PREVIEW_NAMESPACE`: The resulting value of `previewConfig.target.namespace` - `PREVIEW_HOST`: The resulting value of `previewConfig.host` diff --git a/gitopscli/gitops_config.py b/gitopscli/gitops_config.py index 21726422..787675d9 100644 --- a/gitopscli/gitops_config.py +++ b/gitopscli/gitops_config.py @@ -24,6 +24,7 @@ class PreviewContext: "APPLICATION_NAME": lambda context: context.gitops_config.application_name, "PREVIEW_ID": lambda context: context.preview_id, "PREVIEW_ID_HASH": lambda context: GitOpsConfig.create_preview_id_hash(context.preview_id), + "PREVIEW_ID_HASH_SHORT": lambda context: GitOpsConfig.create_preview_id_hash_short(context.preview_id), } def __init__(self, path: str, value_template: str): @@ -72,7 +73,8 @@ def __post_init__(self) -> None: assert isinstance(self.application_name, str), "application_name of wrong type!" assert isinstance(self.preview_host_template, str), "preview_host_template of wrong type!" self.__assert_variables( - self.preview_host_template, {"APPLICATION_NAME", "PREVIEW_ID_HASH", "PREVIEW_ID", "PREVIEW_NAMESPACE"} + self.preview_host_template, + {"APPLICATION_NAME", "PREVIEW_ID_HASH", "PREVIEW_ID_HASH_SHORT", "PREVIEW_ID", "PREVIEW_NAMESPACE"}, ) assert isinstance(self.preview_template_organisation, str), "preview_template_organisation of wrong type!" assert isinstance(self.preview_template_repository, str), "preview_template_repository of wrong type!" @@ -88,7 +90,8 @@ def __post_init__(self) -> None: self.preview_target_namespace_template, str ), "preview_target_namespace_template of wrong type!" self.__assert_variables( - self.preview_target_namespace_template, {"APPLICATION_NAME", "PREVIEW_ID_HASH", "PREVIEW_ID"} + self.preview_target_namespace_template, + {"APPLICATION_NAME", "PREVIEW_ID_HASH", "PREVIEW_ID_HASH_SHORT", "PREVIEW_ID"}, ) assert isinstance( self.preview_target_max_namespace_length, int @@ -104,6 +107,7 @@ def get_preview_host(self, preview_id: str) -> str: preview_host = self.preview_host_template preview_host = preview_host.replace("${APPLICATION_NAME}", self.application_name) preview_host = preview_host.replace("${PREVIEW_ID_HASH}", self.create_preview_id_hash(preview_id)) + preview_host = preview_host.replace("${PREVIEW_ID_HASH_SHORT}", self.create_preview_id_hash_short(preview_id)) preview_host = preview_host.replace("${PREVIEW_ID}", self.__sanitize(preview_id)) preview_host = preview_host.replace("${PREVIEW_NAMESPACE}", self.get_preview_namespace(preview_id)) return preview_host @@ -112,6 +116,9 @@ def get_preview_namespace(self, preview_id: str) -> str: preview_namespace = self.preview_target_namespace_template preview_namespace = preview_namespace.replace("${APPLICATION_NAME}", self.application_name) preview_namespace = preview_namespace.replace("${PREVIEW_ID_HASH}", self.create_preview_id_hash(preview_id)) + preview_namespace = preview_namespace.replace( + "${PREVIEW_ID_HASH_SHORT}", self.create_preview_id_hash_short(preview_id) + ) current_length = len(preview_namespace) - len("${PREVIEW_ID}") remaining_length = self.preview_target_max_namespace_length - current_length @@ -160,6 +167,10 @@ def is_preview_template_equal_target(self) -> bool: def create_preview_id_hash(preview_id: str) -> str: return hashlib.sha256(preview_id.encode("utf-8")).hexdigest()[:8] + @staticmethod + def create_preview_id_hash_short(preview_id: str) -> str: + return GitOpsConfig.create_preview_id_hash(preview_id)[:3] + @staticmethod def from_yaml(yaml: Any) -> "GitOpsConfig": return _GitOpsConfigYamlParser(yaml).parse() @@ -302,7 +313,11 @@ def __parse_v1(self) -> GitOpsConfig: preview_target_organisation=config.preview_target_organisation, preview_target_repository=config.preview_target_repository, preview_target_branch=config.preview_target_branch, - preview_target_namespace_template=add_var_dollar(config.preview_target_namespace_template), + preview_target_namespace_template=add_var_dollar( + self.__get_string_value_or_default( + "previewConfig.target.namespace", "{APPLICATION_NAME}-{PREVIEW_ID}-{PREVIEW_ID_HASH}-preview", + ) + ), preview_target_max_namespace_length=63, replacements=replacements, ) @@ -359,7 +374,7 @@ def __parse_v2(self) -> GitOpsConfig: preview_target_repository=preview_target_repository, preview_target_branch=preview_target_branch, preview_target_namespace_template=self.__get_string_value_or_default( - "previewConfig.target.namespace", "${APPLICATION_NAME}-${PREVIEW_ID}-${PREVIEW_ID_HASH}-preview", + "previewConfig.target.namespace", "${APPLICATION_NAME}-${PREVIEW_ID}-${PREVIEW_ID_HASH_SHORT}-preview", ), preview_target_max_namespace_length=preview_target_max_namespace_length, replacements=replacements, diff --git a/tests/test_gitops_config_v2.py b/tests/test_gitops_config_v2.py index 2661119f..3f09fe65 100644 --- a/tests/test_gitops_config_v2.py +++ b/tests/test_gitops_config_v2.py @@ -209,12 +209,13 @@ def test_preview_target_namespace_default(self): del self.yaml["previewConfig"]["target"]["namespace"] config = self.load() self.assertEqual( - config.preview_target_namespace_template, "${APPLICATION_NAME}-${PREVIEW_ID}-${PREVIEW_ID_HASH}-preview" + config.preview_target_namespace_template, + "${APPLICATION_NAME}-${PREVIEW_ID}-${PREVIEW_ID_HASH_SHORT}-preview", ) actual_namespace = config.get_preview_namespace( "Very long preview ID. It will be cut to have max 'maxNamespaceLength' chars of namespace in total!!" ) - self.assertEqual(actual_namespace, "my-app-very-long-preview-id-it-wi-c9fdf802-preview") + self.assertEqual(actual_namespace, "my-app-very-long-preview-id-it-will-be-c9f-preview") self.assertTrue(len(actual_namespace) <= 50) def test_preview_target_namespace_not_a_string(self):