Skip to content
Merged

Dev #19

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/config/environment-clusters.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
allowed_clusters:
- npe
- uat
- prd

environments:

dev:
cluster: npe

uat:
cluster: uat

prd:
cluster: prd

int-au:
cluster: npe

int-br:
cluster: npe

int-ca:
cluster: npe

int-in:
cluster: npe
7 changes: 6 additions & 1 deletion .github/config/tribe-projects.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,9 @@ tribes:
enabled: false
allowed_projects:
- dobsy
- core-sre
- core-sre

xump:
enabled: true
allowed_projects:
- xump
121 changes: 121 additions & 0 deletions .github/scripts/resolve-cluster.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/usr/bin/env python3

import argparse
from pathlib import Path
import sys

import yaml


def main():
parser = argparse.ArgumentParser()

parser.add_argument(
"--config",
required=True,
help="Environment to cluster config file",
)

parser.add_argument(
"--environment",
required=True,
help="Environment name or directory name",
)

args = parser.parse_args()

config_file = Path(args.config)
environment = args.environment.strip()

if not config_file.exists():
print(
f"ERROR: Config file does not exist: {config_file}",
file=sys.stderr,
)
sys.exit(1)

if not environment:
print("ERROR: Environment cannot be empty", file=sys.stderr)
sys.exit(1)

if "/" in environment or "\\" in environment:
print(
f"ERROR: Invalid environment '{environment}'. "
"Environment must be a directory name only.",
file=sys.stderr,
)
sys.exit(1)

if environment in [".", ".."]:
print(
f"ERROR: Invalid environment '{environment}'.",
file=sys.stderr,
)
sys.exit(1)

with open(config_file, "r", encoding="utf-8") as f:
document = yaml.safe_load(f) or {}

allowed_clusters = document.get("allowed_clusters", [])
environments = document.get("environments", {})

if allowed_clusters and not isinstance(allowed_clusters, list):
print(
"ERROR: 'allowed_clusters' must be a YAML list",
file=sys.stderr,
)
sys.exit(1)

if not isinstance(environments, dict):
print(
"ERROR: 'environments' must be a YAML mapping",
file=sys.stderr,
)
sys.exit(1)

if environment not in environments:
print(
f"ERROR: Environment '{environment}' is not configured in {config_file}",
file=sys.stderr,
)
print(file=sys.stderr)
print("Configured environments:", file=sys.stderr)

for configured_environment in sorted(environments.keys()):
print(f" - {configured_environment}", file=sys.stderr)

sys.exit(1)

environment_config = environments[environment]

if not isinstance(environment_config, dict):
print(
f"ERROR: Environment '{environment}' must be a mapping",
file=sys.stderr,
)
sys.exit(1)

cluster = environment_config.get("cluster")

if not cluster:
print(
f"ERROR: Environment '{environment}' does not define a cluster",
file=sys.stderr,
)
sys.exit(1)

cluster = str(cluster).strip()

if allowed_clusters and cluster not in allowed_clusters:
print(
f"ERROR: Cluster '{cluster}' for environment '{environment}' "
"is not listed in allowed_clusters",
file=sys.stderr,
)
sys.exit(1)

print(cluster)


if __name__ == "__main__":
main()
42 changes: 20 additions & 22 deletions .github/scripts/select_appsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,19 +68,23 @@ def load_changed_files(filename):


def environment_to_directory(environment):
mapping = {
"dev": "dev",
"uat": "uat",
"prd": "prod",
}
environment = environment.strip()

if not environment:
raise ValueError("Environment cannot be empty")

if environment not in mapping:
if "/" in environment or "\\" in environment:
raise ValueError(
f"Invalid environment '{environment}'. "
"Expected one of: dev, uat, prd"
"Environment must be a directory name only."
)

return mapping[environment]
if environment in [".", ".."]:
raise ValueError(
f"Invalid environment '{environment}'."
)

return environment


def application_sets_for_tribe(tribe):
Expand Down Expand Up @@ -177,7 +181,7 @@ def main():
parser.add_argument(
"--target-environment",
required=False,
help="Select only one environment: dev, uat, prd",
help="Select only one environment",
)

args = parser.parse_args()
Expand Down Expand Up @@ -209,15 +213,6 @@ def main():

selected = set()

# Manual workflow_dispatch path:
#
# --target-tribe dfa
# --target-environment dev
#
# selects exactly:
#
# dfa/dev/applicationset.yaml

if args.target_tribe or args.target_environment:
if not args.target_tribe or not args.target_environment:
print()
Expand Down Expand Up @@ -252,10 +247,13 @@ def main():
print("ERROR: Selected ApplicationSet file does not exist.")
print(f"Expected file: {target_file}")
print()
print("Current mapping:")
print(" environment dev -> directory dev")
print(" environment uat -> directory uat")
print(" environment prd -> directory prod")
print("Environment and directory names are expected to match.")
print()
print("Examples:")
print(" target_environment dev -> directory dev")
print(" target_environment uat -> directory uat")
print(" target_environment prd -> directory prd")
print(" target_environment int-au -> directory int-au")
sys.exit(1)

print(f"SELECTED: {target_file}")
Expand Down
Loading
Loading