Skip to content

Commit

Permalink
Merge pull request #166 from baloise/feat/preview-id-hash-short
Browse files Browse the repository at this point in the history
feat(GitOpsCli): add var PREVIEW_ID_HASH_SHORT
  • Loading branch information
christiansiegel authored Aug 5, 2021
2 parents 04be2c6 + c08091c commit b74e56d
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 6 deletions.
1 change: 1 addition & 0 deletions docs/includes/preview-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`
23 changes: 19 additions & 4 deletions gitopscli/gitops_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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!"
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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,
)
Expand Down Expand Up @@ -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,
Expand Down
5 changes: 3 additions & 2 deletions tests/test_gitops_config_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down

0 comments on commit b74e56d

Please sign in to comment.