-
Notifications
You must be signed in to change notification settings - Fork 15
HYPERFLEET-1108 - feat: Add e2e.hyperfleet.io/run-id label for e2e-gcp environment, label resources created by adapters #57
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -6,6 +6,10 @@ params: | |
| source: "event.id" | ||
| type: "string" | ||
| required: true | ||
| - name: "e2eRunId" | ||
| source: "env.E2E_RUN_ID" | ||
| type: "string" | ||
| required: false | ||
|
Comment on lines
+9
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win Enforce label-safe validation for
As per path instructions, “Validate input at system boundaries (HTTP handlers, CLI parsers, webhook receivers).” 🤖 Prompt for AI AgentsSource: Path instructions |
||
|
|
||
| # Preconditions with valid operators and CEL expressions | ||
| preconditions: | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,6 +13,7 @@ metadata: | |
| hyperfleet.io/component: "infrastructure" | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
| hyperfleet.io/resource-group: "cluster-setup" | ||
| e2e.hyperfleet.io/run-id: "{{ .e2eRunId }}" | ||
|
|
||
| # Maestro-specific labels | ||
| maestro.io/source-id: "{{ .adapter.name }}" | ||
|
|
@@ -27,26 +28,26 @@ metadata: | |
| app.kubernetes.io/part-of: "hyperfleet" | ||
| app.kubernetes.io/managed-by: "cl-maestro" | ||
| app.kubernetes.io/created-by: "{{ .adapter.name }}" | ||
| {{ if .platformType }} | ||
| hyperfleet.io/platform-type: "{{ .platformType }}" | ||
| {{ end }} | ||
| {{ if .platformType }} | ||
| hyperfleet.io/platform-type: "{{ .platformType }}" | ||
| {{ end }} | ||
|
|
||
| # Annotations for metadata and operational information | ||
| annotations: | ||
| # Tracking and lifecycle | ||
| hyperfleet.io/created-by: "cl-maestro-framework" | ||
| hyperfleet.io/managed-by: "{{ .adapter.name }}" | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
| hyperfleet.io/cluster-id: "{{ .clusterId }}" | ||
| hyperfleet.io/cluster-name: "{{ .clusterName }}" | ||
| hyperfleet.io/deployment-time: "{{ .timestamp }}" | ||
| # Annotations for metadata and operational information | ||
| annotations: | ||
| # Tracking and lifecycle | ||
| hyperfleet.io/created-by: "cl-maestro-framework" | ||
| hyperfleet.io/managed-by: "{{ .adapter.name }}" | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
| hyperfleet.io/cluster-id: "{{ .clusterId }}" | ||
| hyperfleet.io/cluster-name: "{{ .clusterName }}" | ||
| hyperfleet.io/deployment-time: "{{ .timestamp }}" | ||
|
|
||
| # Maestro-specific annotations | ||
| maestro.io/applied-time: "{{ .timestamp }}" | ||
| maestro.io/source-adapter: "{{ .adapter.name }}" | ||
| # Maestro-specific annotations | ||
| maestro.io/applied-time: "{{ .timestamp }}" | ||
| maestro.io/source-adapter: "{{ .adapter.name }}" | ||
|
|
||
| # Documentation | ||
| description: "Complete cluster setup including namespace, configuration, and RBAC" | ||
| # Documentation | ||
| description: "Complete cluster setup including namespace, configuration, and RBAC" | ||
|
Comment on lines
+31
to
+50
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🔴 Critical 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
file='helmfile/configs/e2e/adapters/cl-maestro/adapter-task-resource-manifestwork.yaml'
echo "== outline =="
ast-grep outline "$file" --view expanded || true
echo
echo "== numbered excerpt (1-220) =="
cat -n "$file" | sed -n '1,220p'Repository: openshift-hyperfleet/hyperfleet-infra Length of output: 7552 🏁 Script executed: #!/bin/bash
set -euo pipefail
file='helmfile/configs/e2e/adapters/cl-maestro/adapter-task-resource-manifestwork.yaml'
echo "== outline =="
ast-grep outline "$file" --view expanded || true
echo
echo "== numbered excerpt (1-220) =="
cat -n "$file" | sed -n '1,220p'Repository: openshift-hyperfleet/hyperfleet-infra Length of output: 7552 Fix the YAML indentation regression
🧰 Tools🪛 YAMLlint (1.37.1)[error] 32-32: syntax error: could not find expected ':' (syntax) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||
|
|
||
| # ManifestWork specification | ||
| spec: | ||
|
|
@@ -56,89 +57,91 @@ spec: | |
| workload: | ||
| # Kubernetes manifests array - injected by framework from business logic config | ||
| manifests: | ||
| - apiVersion: v1 | ||
| kind: Namespace | ||
| metadata: | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" | ||
| labels: | ||
| app.kubernetes.io/component: adapter-task-config | ||
| app.kubernetes.io/instance: "{{ .adapter.name }}" | ||
| app.kubernetes.io/name: cl-maestro | ||
| app.kubernetes.io/transport: maestro | ||
| annotations: | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
| - apiVersion: v1 | ||
| kind: ConfigMap | ||
| data: | ||
| cluster_id: "{{ .clusterId }}" | ||
| cluster_name: "{{ .clusterName }}" | ||
| {{ if eq .platformType "gcp" }} | ||
| platform_tier: "cloud" | ||
| {{ else }} | ||
| platform_tier: "onprem" | ||
| {{ end }} | ||
| {{ range $i, $subnet := .subnets }} | ||
| subnet_{{ $subnet.id }}_name: "{{ $subnet.name }}" | ||
| subnet_{{ $subnet.id }}_cidr: "{{ $subnet.cidr }}" | ||
| subnet_{{ $subnet.id }}_role: "{{ $subnet.role }}" | ||
| {{ end }} | ||
| metadata: | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-configmap" | ||
| namespace: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" | ||
| labels: | ||
| app.kubernetes.io/component: adapter-task-config | ||
| app.kubernetes.io/instance: "{{ .adapter.name }}" | ||
| app.kubernetes.io/name: cl-maestro | ||
| app.kubernetes.io/version: 1.0.0 | ||
| app.kubernetes.io/transport: maestro | ||
| annotations: | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
| - apiVersion: v1 | ||
| kind: Namespace | ||
| metadata: | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" | ||
| labels: | ||
| app.kubernetes.io/component: adapter-task-config | ||
| app.kubernetes.io/instance: "{{ .adapter.name }}" | ||
| app.kubernetes.io/name: cl-maestro | ||
| app.kubernetes.io/transport: maestro | ||
| e2e.hyperfleet.io/run-id: "{{ .e2eRunId }}" | ||
| annotations: | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
| - apiVersion: v1 | ||
| kind: ConfigMap | ||
| data: | ||
| cluster_id: "{{ .clusterId }}" | ||
| cluster_name: "{{ .clusterName }}" | ||
| {{ if eq .platformType "gcp" }} | ||
| platform_tier: "cloud" | ||
| {{ else }} | ||
| platform_tier: "onprem" | ||
| {{ end }} | ||
| {{ range $i, $subnet := .subnets }} | ||
| subnet_{{ $subnet.id }}_name: "{{ $subnet.name }}" | ||
| subnet_{{ $subnet.id }}_cidr: "{{ $subnet.cidr }}" | ||
| subnet_{{ $subnet.id }}_role: "{{ $subnet.role }}" | ||
| {{ end }} | ||
| metadata: | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-configmap" | ||
| namespace: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" | ||
| labels: | ||
| app.kubernetes.io/component: adapter-task-config | ||
| app.kubernetes.io/instance: "{{ .adapter.name }}" | ||
| app.kubernetes.io/name: cl-maestro | ||
| app.kubernetes.io/version: 1.0.0 | ||
| app.kubernetes.io/transport: maestro | ||
| e2e.hyperfleet.io/run-id: "{{ .e2eRunId }}" | ||
| annotations: | ||
| hyperfleet.io/generation: "{{ .generation }}" | ||
|
|
||
| # ============================================================================ | ||
| # Delete Options - How resources should be removed | ||
| # ============================================================================ | ||
| deleteOption: | ||
| # Propagation policy for resource deletion | ||
| # - "Foreground": Wait for dependent resources to be deleted first | ||
| # - "Background": Delete immediately, let cluster handle dependents | ||
| # - "Orphan": Leave resources on cluster when ManifestWork is deleted | ||
| propagationPolicy: "Foreground" | ||
| # ============================================================================ | ||
| # Delete Options - How resources should be removed | ||
| # ============================================================================ | ||
| deleteOption: | ||
| # Propagation policy for resource deletion | ||
| # - "Foreground": Wait for dependent resources to be deleted first | ||
| # - "Background": Delete immediately, let cluster handle dependents | ||
| # - "Orphan": Leave resources on cluster when ManifestWork is deleted | ||
| propagationPolicy: "Foreground" | ||
|
|
||
| # Grace period for graceful deletion (seconds) | ||
| gracePeriodSeconds: 30 | ||
| # Grace period for graceful deletion (seconds) | ||
| gracePeriodSeconds: 30 | ||
|
|
||
| # ============================================================================ | ||
| # Manifest Configurations - Per-resource settings for update and feedback | ||
| # ============================================================================ | ||
| manifestConfigs: | ||
| - resourceIdentifier: | ||
| group: "" # Core API group (empty for v1 resources) | ||
| resource: "namespaces" # Resource type | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" # Specific resource name | ||
| updateStrategy: | ||
| type: "ServerSideApply" # Use server-side apply for namespaces | ||
| feedbackRules: | ||
| - type: "JSONPaths" # Use JSON path expressions for status feedback | ||
| jsonPaths: | ||
| - name: "phase" | ||
| path: ".status.phase" | ||
| # ======================================================================== | ||
| # Configuration for ConfigMap resources | ||
| # ======================================================================== | ||
| - resourceIdentifier: | ||
| group: "" # Core API group (empty for v1 resources) | ||
| resource: "configmaps" # Resource type | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-configmap" # Specific resource name | ||
| namespace: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" | ||
| updateStrategy: | ||
| type: "ServerSideApply" # Use server-side apply for namespaces | ||
| serverSideApply: | ||
| fieldManager: "cl-maestro" # Field manager name for conflict resolution | ||
| force: false # Don't force conflicts (fail on conflicts) | ||
| feedbackRules: | ||
| - type: "JSONPaths" # Use JSON path expressions for status feedback | ||
| jsonPaths: | ||
| - name: "data" | ||
| path: ".data" | ||
| - name: "resourceVersion" | ||
| path: ".metadata.resourceVersion" | ||
| # ============================================================================ | ||
| # Manifest Configurations - Per-resource settings for update and feedback | ||
| # ============================================================================ | ||
| manifestConfigs: | ||
| - resourceIdentifier: | ||
| group: "" # Core API group (empty for v1 resources) | ||
| resource: "namespaces" # Resource type | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" # Specific resource name | ||
| updateStrategy: | ||
| type: "ServerSideApply" # Use server-side apply for namespaces | ||
| feedbackRules: | ||
| - type: "JSONPaths" # Use JSON path expressions for status feedback | ||
| jsonPaths: | ||
| - name: "phase" | ||
| path: ".status.phase" | ||
| # ======================================================================== | ||
| # Configuration for ConfigMap resources | ||
| # ======================================================================== | ||
| - resourceIdentifier: | ||
| group: "" # Core API group (empty for v1 resources) | ||
| resource: "configmaps" # Resource type | ||
| name: "{{ .clusterId | lower }}-{{ .adapter.name }}-configmap" # Specific resource name | ||
| namespace: "{{ .clusterId | lower }}-{{ .adapter.name }}-namespace" | ||
| updateStrategy: | ||
| type: "ServerSideApply" # Use server-side apply for namespaces | ||
| serverSideApply: | ||
| fieldManager: "cl-maestro" # Field manager name for conflict resolution | ||
| force: false # Don't force conflicts (fail on conflicts) | ||
| feedbackRules: | ||
| - type: "JSONPaths" # Use JSON path expressions for status feedback | ||
| jsonPaths: | ||
| - name: "data" | ||
| path: ".data" | ||
| - name: "resourceVersion" | ||
| path: ".metadata.resourceVersion" | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -27,6 +27,9 @@ environments: | |||||||||||||
| - projectId: {{ env "PROJECT_ID" | default "hcm-hyperfleet" }} | ||||||||||||||
| brokerType: googlepubsub | ||||||||||||||
| serviceType: {{ env "API_SERVICE_TYPE" | default "LoadBalancer" }} | ||||||||||||||
| e2eRunId: {{ env "E2E_RUN_ID" }} | ||||||||||||||
| labels: | ||||||||||||||
| e2e.hyperfleet.io/run-id: {{ env "E2E_RUN_ID" }} | ||||||||||||||
|
Comment on lines
+30
to
+32
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟡 Minor 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== helmfile references =="
rg -n 'E2E_RUN_ID|e2e\.hyperfleet\.io/run-id|e2eRunId|requiredEnv "E2E_RUN_ID"|env "E2E_RUN_ID"' helmfile . || true
echo
echo "== nearby context in helmfile/helmfile.yaml.gotmpl =="
nl -ba helmfile/helmfile.yaml.gotmpl | sed -n '1,80p'Repository: openshift-hyperfleet/hyperfleet-infra Length of output: 5082 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== adapter references =="
rg -n 'testRunId|run-id|E2E_RUN_ID|TEST_RUN_ID|e2e\.hyperfleet\.io/(run-id|test-run-id)' . || trueRepository: openshift-hyperfleet/hyperfleet-adapter Length of output: 437 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== architecture docs references =="
rg -n 'test-run-id|run-id|E2E_RUN_ID|TEST_RUN_ID|e2e\.hyperfleet\.io/(run-id|test-run-id)' hyperfleet/docs/e2e-testing || trueRepository: openshift-hyperfleet/architecture Length of output: 2602 🏁 Script executed: #!/bin/bash
set -euo pipefail
sed -n '20,38p' helmfile/helmfile.yaml.gotmpl
echo
sed -n '1,90p' helmfile/values/base-adapter.yaml.gotmpl
echo
sed -n '312,328p' MakefileRepository: openshift-hyperfleet/hyperfleet-infra Length of output: 2577 🏁 Script executed (no clone): Length of output: 133 Quote the run-id label value (CWE-20). Suggested fix- e2e.hyperfleet.io/run-id: {{ env "E2E_RUN_ID" }}
+ e2e.hyperfleet.io/run-id: {{ env "E2E_RUN_ID" | quote }}📝 Committable suggestion
Suggested change
🤖 Prompt for AI AgentsSource: Path instructions |
||||||||||||||
| - environments/e2e-gcp/adapter-configs.yaml.gotmpl | ||||||||||||||
| - environments/e2e-gcp/sentinel-configs.yaml | ||||||||||||||
| e2e-kind: | ||||||||||||||
|
|
||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Enforce Kubernetes label-value validation for
E2E_RUN_ID(CWE-20).Current check only rejects empty values. Invalid label values (illegal chars/length) still pass here and fail later when applied as
metadata.labels.Suggested fix
As per path instructions, "Validate input at system boundaries (HTTP handlers, CLI parsers, webhook receivers)."
📝 Committable suggestion
🤖 Prompt for AI Agents
Source: Path instructions