From bd6b054cb5f08e9322437dacbc1c55ec55b02bcb Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Wed, 8 Apr 2026 17:19:25 -0400 Subject: [PATCH 1/9] HYPERFLEET-610: Add OCI/OKE deployment targets Add make install-all-oci target that deploys HyperFleet on Oracle Kubernetes Engine with in-cluster RabbitMQ, quay.io v0.2.0 images, and adapter1. GCP-specific PodMonitoring CRDs are disabled via a sentinel values-oci.yaml overlay. Pin sentinel chart to v0.2.0 tag for OCI deployments to match the v0.2.0 binary config format. --- Makefile | 26 +++++++++++++++---- env.oci | 25 ++++++++++++++++++ helm/sentinel-clusters/values-oci.yaml | 24 +++++++++++++++++ .../oci/adapter-configs.yaml.gotmpl | 26 +++++++++++++++++++ .../environments/oci/sentinel-configs.yaml | 5 ++++ helmfile/helmfile.yaml.gotmpl | 6 +++++ 6 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 env.oci create mode 100644 helm/sentinel-clusters/values-oci.yaml create mode 100644 helmfile/environments/oci/adapter-configs.yaml.gotmpl create mode 100644 helmfile/environments/oci/sentinel-configs.yaml diff --git a/Makefile b/Makefile index c1d1b26..bedaf70 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,14 @@ .DEFAULT_GOAL := help -# Possible envs are gcp, e2e-gcp, kind, e2e-kind +# Possible envs are gcp, e2e-gcp, kind, e2e-kind, oci # Default to gcp HELMFILE_ENV ?= gcp -ifeq ($(findstring gcp,$(HELMFILE_ENV)),) +ifeq ($(HELMFILE_ENV),oci) + -include env.oci +else ifeq ($(findstring gcp,$(HELMFILE_ENV)),) -include env.kind else -include env.gcp @@ -273,8 +275,9 @@ check-helmfile-env-generated: ## Check that the generated directory exists based elif [ "$(HELMFILE_ENV)" = "kind" ]; then \ test -d $(GENERATED_RABBITMQ_DIR) || { echo "ERROR: generated-values-rabbitmq directory does not exist"; exit 1; }; \ echo "OK: generated-values-rabbitmq directory exists"; \ + else \ + echo "OK: no generated values needed for environment: $(HELMFILE_ENV)"; \ fi - @echo "OK: Did not need to validate generated values for environment: $(HELMFILE_ENV)" .PHONY: check-kubectl-context @@ -299,9 +302,12 @@ check-kubectl-context: check-kubectl ## Verify kubectl context matches HELMFILE_ exit 1; \ fi \ ;; \ + oci) \ + echo "OK: connected to OCI/OKE cluster (context: $$CONTEXT)"; \ + ;; \ *) \ echo "ERROR: invalid HELMFILE_ENV: $(HELMFILE_ENV)"; \ - echo " Valid values: gcp, e2e-gcp, kind, e2e-kind"; \ + echo " Valid values: gcp, e2e-gcp, kind, e2e-kind, oci"; \ exit 1 \ ;; \ esac \ @@ -372,7 +378,7 @@ help: ## Show this help message @echo "" @echo "Usage: make [target] [VARIABLE=value ...]" @echo "" - @echo "Environment: HELMFILE_ENV=$(HELMFILE_ENV) (gcp|kind|e2e-gcp|e2e-kind)" + @echo "Environment: HELMFILE_ENV=$(HELMFILE_ENV) (gcp|kind|e2e-gcp|e2e-kind|oci)" @echo "" @awk '/^# ====/ { \ section = $$0; \ @@ -397,6 +403,16 @@ help: ## Show this help message +# ==== OCI/OKE Deployment Targets ==== + +.PHONY: install-all-oci +install-all-oci: check-helmfile-env ## Full OCI/OKE install (rabbitmq + api + sentinel + adapter1 via helmfile) + helmfile -f helmfile/helmfile.yaml.gotmpl -e $(HELMFILE_ENV) apply + +.PHONY: uninstall-all-oci +uninstall-all-oci: check-helmfile-env ## Uninstall all OCI components + helmfile -f helmfile/helmfile.yaml.gotmpl -e $(HELMFILE_ENV) destroy + # ==== CI Targets ==== # ci-dry-run: validation on terraform and helm plugins and maestro helm chart # ci-test: Run terraform install + maestro install + health check on maestro diff --git a/env.oci b/env.oci new file mode 100644 index 0000000..8a892c6 --- /dev/null +++ b/env.oci @@ -0,0 +1,25 @@ +# OCI/OKE Installation Configuration +RABBITMQ_URL ?= "amqp://guest:guest@rabbitmq:5672" +API_SERVICE_TYPE ?= ClusterIP +API_BASE_URL ?= http://hyperfleet-api:8000 + +# Container Registry Configuration +REGISTRY ?= quay.io +API_REPOSITORY ?= openshift-hyperfleet/hyperfleet-api +SENTINEL_REPOSITORY ?= openshift-hyperfleet/hyperfleet-sentinel +ADAPTER_REPOSITORY ?= openshift-hyperfleet/hyperfleet-adapter + +# Helm Charts +CHART_ORG ?= openshift-hyperfleet +API_CHART_REF ?= v0.3.0 +SENTINEL_CHART_REF ?= v0.3.0 +ADAPTER_CHART_REF ?= v0.3.0 + +# Image Tags +API_IMAGE_TAG ?= v0.3.0 +SENTINEL_IMAGE_TAG ?= v0.3.0 +ADAPTER_IMAGE_TAG ?= v0.3.0 +IMAGE_PULL_POLICY ?= Always + +# Kubernetes Namespaces +NAMESPACE ?= hyperfleet diff --git a/helm/sentinel-clusters/values-oci.yaml b/helm/sentinel-clusters/values-oci.yaml new file mode 100644 index 0000000..0985167 --- /dev/null +++ b/helm/sentinel-clusters/values-oci.yaml @@ -0,0 +1,24 @@ +# OCI/OKE overrides for Sentinel (v0.2.0 config format) +# The v0.2.0 binary uses flat config (hyperfleetApi under config, not clients) + +hyperfleet-sentinel: + config: + resourceType: clusters + resourceSelector: [] + + hyperfleetApi: + baseUrl: http://hyperfleet-api:8000 + timeout: 5s + + broker: + type: rabbitmq + topic: hyperfleet-clusters + rabbitmq: + url: amqp://guest:guest@rabbitmq:5672/ + exchangeType: topic + + monitoring: + podMonitoring: + enabled: false + prometheusRule: + enabled: false diff --git a/helmfile/environments/oci/adapter-configs.yaml.gotmpl b/helmfile/environments/oci/adapter-configs.yaml.gotmpl new file mode 100644 index 0000000..3ce5376 --- /dev/null +++ b/helmfile/environments/oci/adapter-configs.yaml.gotmpl @@ -0,0 +1,26 @@ +{{ $namespace := requiredEnv "NAMESPACE" }} +adapters: + - name: adapter1 + resourceType: clusters + values: + - adapterTaskConfig: + create: true + adapterConfig: + create: true + log: + level: debug + rbac: + resources: + - configmaps + broker: + create: true + rabbitmq: + url: "amqp://guest:guest@rabbitmq:5672" + queue: {{ $namespace }}-clusters-adapter1 + exchange: {{ $namespace }}-clusters + routingKey: "#" + setFiles: + - name: adapterConfig.yaml + file: configs/base/adapters/adapter1/adapter-config.yaml + - name: adapterTaskConfig.yaml + file: configs/base/adapters/adapter1/adapter-task-config.yaml diff --git a/helmfile/environments/oci/sentinel-configs.yaml b/helmfile/environments/oci/sentinel-configs.yaml new file mode 100644 index 0000000..8872926 --- /dev/null +++ b/helmfile/environments/oci/sentinel-configs.yaml @@ -0,0 +1,5 @@ +sentinels: + - name: clusters + values: + - config: + resourceType: clusters diff --git a/helmfile/helmfile.yaml.gotmpl b/helmfile/helmfile.yaml.gotmpl index 4852c35..475c9f2 100644 --- a/helmfile/helmfile.yaml.gotmpl +++ b/helmfile/helmfile.yaml.gotmpl @@ -48,6 +48,12 @@ environments: serviceType: {{ env "API_SERVICE_TYPE" | default "LoadBalancer" }} - environments/gcp/adapter-configs.yaml.gotmpl - environments/gcp/sentinel-configs.yaml.gotmpl + oci: + values: + - brokerType: rabbitmq + serviceType: {{ env "API_SERVICE_TYPE" | default "ClusterIP" }} + - environments/oci/adapter-configs.yaml.gotmpl + - environments/oci/sentinel-configs.yaml commonLabels: group: hyperfleet From be23e58620400f06ea50ea95a3f2b2d2a8a143e8 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Mon, 13 Apr 2026 14:34:43 -0400 Subject: [PATCH 2/9] Add adapter-hypershift for remote HostedCluster creation Add a new adapter helm package that creates HostedCluster resources on a remote HyperShift management cluster via a mounted kubeconfig secret. Uses NodePort for Ignition/OAuth services and parameterizes OCI region, compartment, release image, CPO image, and worker node IP via env vars. --- helm/adapter-hypershift/Chart.yaml | 11 + helm/adapter-hypershift/adapter-config.yaml | 26 +++ .../adapter-task-config.yaml | 208 ++++++++++++++++++ .../charts/hyperfleet-adapter-2.0.0.tgz | Bin 0 -> 21029 bytes helm/adapter-hypershift/values.yaml | 65 ++++++ 5 files changed, 310 insertions(+) create mode 100644 helm/adapter-hypershift/Chart.yaml create mode 100644 helm/adapter-hypershift/adapter-config.yaml create mode 100644 helm/adapter-hypershift/adapter-task-config.yaml create mode 100644 helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz create mode 100644 helm/adapter-hypershift/values.yaml diff --git a/helm/adapter-hypershift/Chart.yaml b/helm/adapter-hypershift/Chart.yaml new file mode 100644 index 0000000..8a7fcc4 --- /dev/null +++ b/helm/adapter-hypershift/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v2 +name: adapter-hypershift +description: HyperShift adapter - creates HostedCluster resources on a remote management cluster +type: application +version: 0.1.0 +appVersion: "0.0.0-dev" + +dependencies: + - name: hyperfleet-adapter + version: "2.0.0" + repository: "git+https://github.com/openshift-hyperfleet/hyperfleet-adapter@charts?ref=main" diff --git a/helm/adapter-hypershift/adapter-config.yaml b/helm/adapter-hypershift/adapter-config.yaml new file mode 100644 index 0000000..338866a --- /dev/null +++ b/helm/adapter-hypershift/adapter-config.yaml @@ -0,0 +1,26 @@ +# HyperShift adapter deployment configuration +# Creates HostedCluster resources on a remote HyperShift management cluster +adapter: + name: adapter-hypershift + version: "0.2.0" + +debug_config: true +log: + level: debug + +clients: + hyperfleet_api: + base_url: http://hyperfleet-api:8000 + version: v1 + timeout: 10s + retry_attempts: 3 + retry_backoff: exponential + + broker: + subscription_id: "adapter-hypershift" + topic: "hyperfleet-clusters" + + kubernetes: + api_version: "v1" + # Use the mounted kubeconfig to target the remote HyperShift management cluster + kube_config_path: /etc/hypershift/kubeconfig diff --git a/helm/adapter-hypershift/adapter-task-config.yaml b/helm/adapter-hypershift/adapter-task-config.yaml new file mode 100644 index 0000000..98f07a1 --- /dev/null +++ b/helm/adapter-hypershift/adapter-task-config.yaml @@ -0,0 +1,208 @@ +# HyperShift adapter task configuration +# Creates a HostedCluster + required secrets on the remote management cluster +params: + + - name: "clusterId" + source: "event.id" + type: "string" + required: true + + - name: "generation" + source: "event.generation" + type: "int" + required: true + + - name: "namespace" + source: "env.CLUSTERS_NAMESPACE" + type: "string" + + - name: "ociRegion" + source: "env.OCI_REGION" + type: "string" + + - name: "ociCompartmentId" + source: "env.OCI_COMPARTMENT_ID" + type: "string" + + - name: "releaseImage" + source: "env.OPENSHIFT_RELEASE_IMAGE" + type: "string" + + - name: "baseDomain" + source: "env.BASE_DOMAIN" + type: "string" + + - name: "cpoImage" + source: "env.CPO_IMAGE" + type: "string" + + - name: "workerNodeIP" + source: "env.WORKER_NODE_IP" + type: "string" + +# Preconditions: check cluster details from API +preconditions: + - name: "clusterStatus" + api_call: + method: "GET" + url: "/clusters/{{ .clusterId }}" + timeout: 10s + retry_attempts: 3 + retry_backoff: "exponential" + capture: + - name: "clusterName" + field: "name" + - name: "generation" + field: "generation" + - name: "clusterNotReady" + expression: | + status.conditions.filter(c, c.type == "Ready").size() > 0 + ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" + : true + + - name: "validationCheck" + expression: | + clusterNotReady + +# Resources: Namespace + HostedCluster on the remote management cluster +resources: + + # Ensure the clusters namespace exists on the management cluster + - name: "clustersNamespace" + transport: + client: "kubernetes" + manifest: + apiVersion: v1 + kind: Namespace + metadata: + name: "{{ .namespace }}" + discovery: + by_name: "{{ .namespace }}" + + # Create the HostedCluster resource + - name: "hostedCluster" + transport: + client: "kubernetes" + manifest: + apiVersion: hypershift.openshift.io/v1beta1 + kind: HostedCluster + metadata: + name: "{{ .clusterName }}" + namespace: "{{ .namespace }}" + annotations: + hypershift.openshift.io/pod-security-admission-label-override: "privileged" + hypershift.openshift.io/control-plane-operator-image: "{{ .cpoImage }}" + hypershift.openshift.io/disable-monitoring-services: "true" + labels: + hyperfleet.io/cluster-id: "{{ .clusterId }}" + hyperfleet.io/cluster-name: "{{ .clusterName }}" + spec: + platform: + type: OCI + oci: + identityRef: + name: oci-credentials + region: "{{ .ociRegion }}" + compartmentId: "{{ .ociCompartmentId }}" + controllerAvailabilityPolicy: SingleReplica + pullSecret: + name: pull-secret + sshKey: + name: ssh-key + networking: + clusterNetwork: + - cidr: 10.132.0.0/14 + serviceNetwork: + - cidr: 172.31.0.0/16 + networkType: OVNKubernetes + services: + - service: Ignition + servicePublishingStrategy: + type: NodePort + nodePort: + address: "{{ .workerNodeIP }}" + - service: OAuthServer + servicePublishingStrategy: + type: NodePort + nodePort: + address: "{{ .workerNodeIP }}" + - service: APIServer + servicePublishingStrategy: + type: LoadBalancer + - service: Konnectivity + servicePublishingStrategy: + type: LoadBalancer + release: + image: "{{ .releaseImage }}" + dns: + baseDomain: "{{ .baseDomain }}" + discovery: + namespace: "{{ .namespace }}" + by_selectors: + label_selector: + hyperfleet.io/cluster-id: "{{ .clusterId }}" + +# Post-processing: report HostedCluster status back to API +post: + payloads: + - name: "statusPayload" + build: + adapter: "{{ .adapter.name }}" + conditions: + - type: "Applied" + status: + expression: | + has(resources.hostedCluster.metadata.creationTimestamp) ? "True" : "False" + reason: + expression: | + has(resources.hostedCluster.metadata.creationTimestamp) ? "HostedClusterCreated" : "HostedClusterPending" + message: + expression: | + has(resources.hostedCluster.metadata.creationTimestamp) + ? "HostedCluster has been created on the management cluster" + : "HostedCluster is pending creation" + - type: "Available" + status: + expression: | + has(resources.hostedCluster.status) && has(resources.hostedCluster.status.conditions) + ? (resources.hostedCluster.status.conditions.filter(c, c.type == "Available").size() > 0 + ? resources.hostedCluster.status.conditions.filter(c, c.type == "Available")[0].status + : "False") + : "False" + reason: + expression: | + has(resources.hostedCluster.status) && has(resources.hostedCluster.status.conditions) + ? (resources.hostedCluster.status.conditions.filter(c, c.type == "Available").size() > 0 + ? resources.hostedCluster.status.conditions.filter(c, c.type == "Available")[0].reason + : "WaitingForControlPlane") + : "WaitingForControlPlane" + message: + expression: | + has(resources.hostedCluster.status) && has(resources.hostedCluster.status.conditions) + ? (resources.hostedCluster.status.conditions.filter(c, c.type == "Available").size() > 0 + ? resources.hostedCluster.status.conditions.filter(c, c.type == "Available")[0].message + : "Waiting for hosted control plane to become available") + : "Waiting for hosted control plane to become available" + - type: "Health" + status: + expression: | + adapter.?executionStatus.orValue("") == "success" ? "True" : (adapter.?executionStatus.orValue("") == "failed" ? "False" : "Unknown") + reason: + expression: | + adapter.?errorReason.orValue("") != "" ? adapter.?errorReason.orValue("") : "Healthy" + message: + expression: | + adapter.?errorMessage.orValue("") != "" ? adapter.?errorMessage.orValue("") : "Adapter executed successfully" + observed_generation: + expression: "generation" + observed_time: "{{ now | date \"2006-01-02T15:04:05Z07:00\" }}" + + post_actions: + - name: "reportClusterStatus" + api_call: + method: "POST" + url: "/clusters/{{ .clusterId }}/statuses" + headers: + - name: "Content-Type" + value: "application/json" + body: "{{ .statusPayload }}" diff --git a/helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz b/helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..25580d4c80c183d8f349951a68a4ff3cb4e81e92 GIT binary patch literal 21029 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 Date: Tue, 14 Apr 2026 17:16:58 -0400 Subject: [PATCH 3/9] Add adapter-hypershift-nodepool chart and fix adapter-hypershift for OCI Add new adapter-hypershift-nodepool Helm chart that subscribes to the nodepools topic, validates the parent HostedCluster is Available via adapter status, creates a HyperShift NodePool CR on the management cluster, and reports status back to the API. Fix adapter-hypershift task config to use Route instead of NodePort for Ignition/OAuth. Add values-oci.yaml for sentinel-nodepools with RabbitMQ config. Pin sentinel-nodepools Chart.yaml dependency to v0.2.0. --- helm/adapter-hypershift-nodepool/Chart.yaml | 11 + .../adapter-config.yaml | 26 +++ .../adapter-task-config.yaml | 206 ++++++++++++++++++ .../charts/hyperfleet-adapter-2.0.0.tgz | Bin 0 -> 21030 bytes .../nodepool-manifest.yaml | 28 +++ helm/adapter-hypershift-nodepool/values.yaml | 67 ++++++ .../adapter-task-config.yaml | 11 +- .../charts/hyperfleet-adapter-2.0.0.tgz | Bin 21029 -> 21029 bytes helm/sentinel-nodepools/values-oci.yaml | 23 ++ 9 files changed, 363 insertions(+), 9 deletions(-) create mode 100644 helm/adapter-hypershift-nodepool/Chart.yaml create mode 100644 helm/adapter-hypershift-nodepool/adapter-config.yaml create mode 100644 helm/adapter-hypershift-nodepool/adapter-task-config.yaml create mode 100644 helm/adapter-hypershift-nodepool/charts/hyperfleet-adapter-2.0.0.tgz create mode 100644 helm/adapter-hypershift-nodepool/nodepool-manifest.yaml create mode 100644 helm/adapter-hypershift-nodepool/values.yaml create mode 100644 helm/sentinel-nodepools/values-oci.yaml diff --git a/helm/adapter-hypershift-nodepool/Chart.yaml b/helm/adapter-hypershift-nodepool/Chart.yaml new file mode 100644 index 0000000..018acec --- /dev/null +++ b/helm/adapter-hypershift-nodepool/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v2 +name: adapter-hypershift-nodepool +description: HyperShift NodePool adapter - creates NodePool resources on a remote management cluster +type: application +version: 0.1.0 +appVersion: "0.0.0-dev" + +dependencies: + - name: hyperfleet-adapter + version: "2.0.0" + repository: "git+https://github.com/openshift-hyperfleet/hyperfleet-adapter@charts?ref=main" diff --git a/helm/adapter-hypershift-nodepool/adapter-config.yaml b/helm/adapter-hypershift-nodepool/adapter-config.yaml new file mode 100644 index 0000000..1515786 --- /dev/null +++ b/helm/adapter-hypershift-nodepool/adapter-config.yaml @@ -0,0 +1,26 @@ +# HyperShift NodePool adapter deployment configuration +# Creates NodePool resources on a remote HyperShift management cluster +adapter: + name: adapter-hypershift-nodepool + version: "0.2.0" + +debug_config: true +log: + level: debug + +clients: + hyperfleet_api: + base_url: http://hyperfleet-api:8000 + version: v1 + timeout: 10s + retry_attempts: 3 + retry_backoff: exponential + + broker: + subscription_id: "adapter-hypershift-nodepool" + topic: "hyperfleet-nodepools" + + kubernetes: + api_version: "v1" + # Use the mounted kubeconfig to target the remote HyperShift management cluster + kube_config_path: /etc/hypershift/kubeconfig diff --git a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml new file mode 100644 index 0000000..b4e86d9 --- /dev/null +++ b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml @@ -0,0 +1,206 @@ +# HyperShift NodePool adapter task configuration +# Creates a NodePool resource on the remote management cluster +params: + + - name: "nodepoolId" + source: "event.id" + type: "string" + required: true + + - name: "clusterId" + source: "event.owner_references.id" + type: "string" + required: true + + - name: "generation" + source: "event.generation" + type: "int" + required: true + + - name: "namespace" + source: "env.CLUSTERS_NAMESPACE" + type: "string" + + - name: "ociAD" + source: "env.OCI_AD" + type: "string" + + - name: "ociSubnetId" + source: "env.OCI_SUBNET_ID" + type: "string" + + - name: "ociShape" + source: "env.OCI_SHAPE" + type: "string" + + - name: "ociOcpus" + source: "env.OCI_OCPUS" + type: "string" + + - name: "ociMemoryGBs" + source: "env.OCI_MEMORY_GBS" + type: "string" + + - name: "ociBootVolumeGB" + source: "env.OCI_BOOT_VOLUME_GB" + type: "string" + +# Preconditions: look up nodepool and parent cluster from the API +preconditions: + + # Fetch nodepool details (name, spec, status) + - name: "nodepoolDetails" + api_call: + method: "GET" + url: "/clusters/{{ .clusterId }}/nodepools/{{ .nodepoolId }}" + timeout: 10s + retry_attempts: 3 + retry_backoff: "exponential" + capture: + - name: "nodepoolName" + field: "name" + - name: "generation" + field: "generation" + - name: "nodepoolSpec" + field: "spec" + - name: "nodepoolNotReady" + expression: | + status.conditions.filter(c, c.type == "Ready").size() > 0 + ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" + : true + + # Fetch parent cluster details (need the cluster name for clusterName ref) + - name: "clusterDetails" + api_call: + method: "GET" + url: "/clusters/{{ .clusterId }}" + timeout: 10s + retry_attempts: 3 + retry_backoff: "exponential" + capture: + - name: "clusterName" + field: "name" + + # Check if HostedCluster is Available via adapter-hypershift status + - name: "clusterAdapterStatus" + api_call: + method: "GET" + url: "/clusters/{{ .clusterId }}/statuses" + timeout: 10s + retry_attempts: 3 + retry_backoff: "exponential" + capture: + - name: "clusterAvailable" + expression: | + items.filter(s, s.adapter == "adapter-hypershift").size() > 0 ? (items.filter(s, s.adapter == "adapter-hypershift")[0].conditions.filter(c, c.type == "Available").size() > 0 ? items.filter(s, s.adapter == "adapter-hypershift")[0].conditions.filter(c, c.type == "Available")[0].status == "True" : false) : false + + - name: "validationCheck" + # Only proceed if nodepool is NOT Ready AND HostedCluster adapter reports Available + expression: | + nodepoolNotReady && clusterAvailable + +# Resources: NodePool on the remote management cluster +resources: + + - name: "nodePool" + transport: + client: "kubernetes" + manifest: + apiVersion: hypershift.openshift.io/v1beta1 + kind: NodePool + metadata: + name: "{{ .clusterName }}-{{ .nodepoolName }}" + namespace: "{{ .namespace }}" + labels: + hyperfleet.io/cluster-id: "{{ .clusterId }}" + hyperfleet.io/cluster-name: "{{ .clusterName }}" + hyperfleet.io/nodepool-id: "{{ .nodepoolId }}" + hyperfleet.io/nodepool-name: "{{ .nodepoolName }}" + spec: + clusterName: "{{ .clusterName }}" + replicas: 2 + management: + autoRepair: true + upgradeType: Replace + platform: + type: OCI + oci: + instanceShape: "{{ .ociShape }}" + instanceShapeConfig: + ocpus: 4 + memoryInGBs: 16 + availabilityDomain: "{{ .ociAD }}" + subnetId: "{{ .ociSubnetId }}" + bootVolumeSize: 120 + release: + image: "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" + discovery: + namespace: "{{ .namespace }}" + by_selectors: + label_selector: + hyperfleet.io/nodepool-id: "{{ .nodepoolId }}" + +# Post-processing: report NodePool status back to API +post: + payloads: + - name: "statusPayload" + build: + adapter: "{{ .adapter.name }}" + conditions: + - type: "Applied" + status: + expression: | + has(resources.nodePool.metadata.creationTimestamp) ? "True" : "False" + reason: + expression: | + has(resources.nodePool.metadata.creationTimestamp) ? "NodePoolCreated" : "NodePoolPending" + message: + expression: | + has(resources.nodePool.metadata.creationTimestamp) + ? "NodePool has been created on the management cluster" + : "NodePool is pending creation" + - type: "Available" + status: + expression: | + has(resources.nodePool.status) && has(resources.nodePool.status.conditions) + ? (resources.nodePool.status.conditions.filter(c, c.type == "Ready").size() > 0 + ? resources.nodePool.status.conditions.filter(c, c.type == "Ready")[0].status + : "False") + : "False" + reason: + expression: | + has(resources.nodePool.status) && has(resources.nodePool.status.conditions) + ? (resources.nodePool.status.conditions.filter(c, c.type == "Ready").size() > 0 + ? resources.nodePool.status.conditions.filter(c, c.type == "Ready")[0].reason + : "WaitingForNodes") + : "WaitingForNodes" + message: + expression: | + has(resources.nodePool.status) && has(resources.nodePool.status.conditions) + ? (resources.nodePool.status.conditions.filter(c, c.type == "Ready").size() > 0 + ? resources.nodePool.status.conditions.filter(c, c.type == "Ready")[0].message + : "Waiting for worker nodes to be provisioned") + : "Waiting for worker nodes to be provisioned" + - type: "Health" + status: + expression: | + adapter.?executionStatus.orValue("") == "success" ? "True" : (adapter.?executionStatus.orValue("") == "failed" ? "False" : "Unknown") + reason: + expression: | + adapter.?errorReason.orValue("") != "" ? adapter.?errorReason.orValue("") : "Healthy" + message: + expression: | + adapter.?errorMessage.orValue("") != "" ? adapter.?errorMessage.orValue("") : "Adapter executed successfully" + observed_generation: + expression: "generation" + observed_time: "{{ now | date \"2006-01-02T15:04:05Z07:00\" }}" + + post_actions: + - name: "reportNodepoolStatus" + api_call: + method: "POST" + url: "/clusters/{{ .clusterId }}/nodepools/{{ .nodepoolId }}/statuses" + headers: + - name: "Content-Type" + value: "application/json" + body: "{{ .statusPayload }}" diff --git a/helm/adapter-hypershift-nodepool/charts/hyperfleet-adapter-2.0.0.tgz b/helm/adapter-hypershift-nodepool/charts/hyperfleet-adapter-2.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..dbc44e3c15c00354d170f27d88faf2a6b10e0470 GIT binary patch literal 21030 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

XQfes z5+)vQM2erjrZgImu!#T`74Isi*c%GsjWCRyI#n|H6tRWfQGX(TM%-ADb=t*CEabdP z)QYQgKx-4H8}$}ZmsmE|wZ?9>xzvdOT0z6jTset&4VOr^#zJ)yht34@GtH(HrCw+! zJcsYN6Eg?zAbF9eMJ}|#or8Nmz{=5ulhrS1CZPtKFw;@5L6(mp;n!$0fv(-dA_?;{ zu8pw~6ZKBWZ|VwE0{Ez^x3+t|XPw?wr?-8+wcGDK?e}*7tM|O$>$RM_(FUue6LoVN z0LCG@Afa)L*&UmJ07Wm8tjU zFYbkdu_`=ycUERKSYiyQ;||!!^u};4<(b(Ew29W|Hc5Sa9`L!b{kJtsso5jVZDU#d zPx;Na|9-ah^!cOx_d`4tBffJt`>zcgWg|QWDso=mlc+lx9oqc3mBhg4tr0olD81H% zu~}8NeAgLCh3kP-8fmWSl)u&=b;^jndbhSoT{z6Y7G;PleaA2;gz^`Q`G|%3%p+kI zHoeo=86AFI+PYz2teBDn1Wk!{Vc|nrHKbW0R7zostRIZkyK~7GtU<@&z+9ECEZQ4Z|zo{y;Mi*N`^5DbCr^&&?fmE-w;Rz4KvnE#;V8$%t5On&qfd-R1XHV z9;4LK9?+0as1Kl&p4SyDyLIdE5g4G#ntWpsJGXtdVulcLeQ3~uinFLToHWNr&pOX|QPs_6 zQEpps=^eH!oBw*!ak@j7-n{o@sx~|e41kXOh51|)+u9HbfEQ`XH-h* zN!04YKM2dskzXDPliYRu<8nZ%)d+?x(=Ln%<|PTQEEtU)Hkr_fk(|b}4Tzm1Eynq! zWh0`5^DaxrBx&{Gh>~f=d(TwA9@C`e1gZOlkkS$hCWxpzPP1iymywV{N;Ae)eB6CTI)vHP;Gx{Cdqi>rMEgWaQCe@q+ znIlfof@9uPz2eE&xhiR)31|-qi$RBy!dGUp%*r|~V(R5-)kypM*}JzVBp+9&&!P1I}qSVF~IctJkb4 zW}j;r=L`kAxn0+dVNSbY#UpZYV-CPMEo#l?xjAIEbc^U{@8q%~)?0i|i}nt`4l)Sf zlU~TJa{qIut%IAD_qP@p*h6pMSUK{|^8F|NqY75G?@I0RT~)^%ejC literal 0 HcmV?d00001 diff --git a/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml b/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml new file mode 100644 index 0000000..5cd1701 --- /dev/null +++ b/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml @@ -0,0 +1,28 @@ +apiVersion: hypershift.openshift.io/v1beta1 +kind: NodePool +metadata: + name: "{{ .clusterName }}-{{ .nodepoolName }}" + namespace: "{{ .namespace }}" + labels: + hyperfleet.io/cluster-id: "{{ .clusterId }}" + hyperfleet.io/cluster-name: "{{ .clusterName }}" + hyperfleet.io/nodepool-id: "{{ .nodepoolId }}" + hyperfleet.io/nodepool-name: "{{ .nodepoolName }}" +spec: + clusterName: "{{ .clusterName }}" + replicas: {{ index .nodepoolSpec "replicas" | default 2 }} + management: + autoRepair: true + upgradeType: Replace + platform: + type: OCI + oci: + instanceShape: "{{ index .nodepoolSpec "instanceShape" | default .ociShape }}" + instanceShapeConfig: + ocpus: {{ index .nodepoolSpec "ocpus" | default .ociOcpus }} + memoryInGBs: {{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }} + availabilityDomain: "{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}" + subnetId: "{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}" + bootVolumeSize: {{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }} + release: + image: "{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}" diff --git a/helm/adapter-hypershift-nodepool/values.yaml b/helm/adapter-hypershift-nodepool/values.yaml new file mode 100644 index 0000000..cdb8816 --- /dev/null +++ b/helm/adapter-hypershift-nodepool/values.yaml @@ -0,0 +1,67 @@ +# Values for adapter-hypershift-nodepool +# Creates NodePool resources on a remote HyperShift management cluster + +hyperfleet-adapter: + image: + registry: CHANGE_ME + repository: CHANGE_ME + tag: latest + + adapterConfig: + create: true + log: + level: debug + + adapterTaskConfig: + create: true + + broker: + type: googlepubsub + googlepubsub: + projectId: CHANGE_ME + subscriptionId: CHANGE_ME + topic: CHANGE_ME + deadLetterTopic: "" + createTopicIfMissing: true + createSubscriptionIfMissing: true + rabbitmq: + url: CHANGE_ME + queue: "" + exchange: "" + routingKey: "" + + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: CLUSTERS_NAMESPACE + value: clusters + - name: OCI_AD + value: US-SANJOSE-1-AD-1 + - name: OCI_SUBNET_ID + value: CHANGE_ME + - name: OCI_SHAPE + value: VM.Standard.E4.Flex + - name: OCI_OCPUS + value: "4" + - name: OCI_MEMORY_GBS + value: "16" + - name: OCI_BOOT_VOLUME_GB + value: "120" + + # Mount the management cluster kubeconfig + extraVolumeMounts: + - name: hypershift-kubeconfig + mountPath: /etc/hypershift + readOnly: true + + extraVolumes: + - name: hypershift-kubeconfig + secret: + secretName: hypershift-mgmt-kubeconfig + + # RBAC is for the local CLM cluster only; remote access uses the mounted kubeconfig + rbac: + resources: + - configmaps diff --git a/helm/adapter-hypershift/adapter-task-config.yaml b/helm/adapter-hypershift/adapter-task-config.yaml index 98f07a1..857584f 100644 --- a/helm/adapter-hypershift/adapter-task-config.yaml +++ b/helm/adapter-hypershift/adapter-task-config.yaml @@ -36,9 +36,6 @@ params: source: "env.CPO_IMAGE" type: "string" - - name: "workerNodeIP" - source: "env.WORKER_NODE_IP" - type: "string" # Preconditions: check cluster details from API preconditions: @@ -118,14 +115,10 @@ resources: services: - service: Ignition servicePublishingStrategy: - type: NodePort - nodePort: - address: "{{ .workerNodeIP }}" + type: Route - service: OAuthServer servicePublishingStrategy: - type: NodePort - nodePort: - address: "{{ .workerNodeIP }}" + type: Route - service: APIServer servicePublishingStrategy: type: LoadBalancer diff --git a/helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz b/helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz index 25580d4c80c183d8f349951a68a4ff3cb4e81e92..3129398a8b20c8b3648c89c74c5676dea1b58e0f 100644 GIT binary patch delta 18693 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 delta 18692 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 diff --git a/helm/sentinel-nodepools/values-oci.yaml b/helm/sentinel-nodepools/values-oci.yaml new file mode 100644 index 0000000..0d482df --- /dev/null +++ b/helm/sentinel-nodepools/values-oci.yaml @@ -0,0 +1,23 @@ +# OCI/OKE overrides for Sentinel nodepools (v0.2.0 config format) + +hyperfleet-sentinel: + config: + resourceType: nodepools + resourceSelector: [] + + hyperfleetApi: + baseUrl: http://hyperfleet-api:8000 + timeout: 5s + + broker: + type: rabbitmq + topic: hyperfleet-nodepools + rabbitmq: + url: amqp://guest:guest@rabbitmq:5672/ + exchangeType: topic + + monitoring: + podMonitoring: + enabled: false + prometheusRule: + enabled: false From 04af9f703319164d9d3f7fe248e8ab296d247c1d Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Thu, 16 Apr 2026 09:15:06 -0400 Subject: [PATCH 4/9] Fix precondition guards and use dynamic nodepool spec values Add has() guards to clusterNotReady/nodepoolNotReady precondition expressions so fresh resources without status.conditions fall back to true instead of erroring. Replace hardcoded NodePool spec values in adapter-task-config with index .nodepoolSpec lookups matching the pattern in nodepool-manifest.yaml. --- .../adapter-task-config.yaml | 24 ++++++++++--------- .../adapter-task-config.yaml | 8 ++++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml index b4e86d9..979b45f 100644 --- a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml +++ b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml @@ -65,9 +65,11 @@ preconditions: field: "spec" - name: "nodepoolNotReady" expression: | - status.conditions.filter(c, c.type == "Ready").size() > 0 - ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" - : true + !has(status) || !has(status.conditions) + ? true + : (status.conditions.filter(c, c.type == "Ready").size() > 0 + ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" + : true) # Fetch parent cluster details (need the cluster name for clusterName ref) - name: "clusterDetails" @@ -118,22 +120,22 @@ resources: hyperfleet.io/nodepool-name: "{{ .nodepoolName }}" spec: clusterName: "{{ .clusterName }}" - replicas: 2 + replicas: {{ index .nodepoolSpec "replicas" | default 2 }} management: autoRepair: true upgradeType: Replace platform: type: OCI oci: - instanceShape: "{{ .ociShape }}" + instanceShape: "{{ index .nodepoolSpec "instanceShape" | default .ociShape }}" instanceShapeConfig: - ocpus: 4 - memoryInGBs: 16 - availabilityDomain: "{{ .ociAD }}" - subnetId: "{{ .ociSubnetId }}" - bootVolumeSize: 120 + ocpus: {{ index .nodepoolSpec "ocpus" | default .ociOcpus }} + memoryInGBs: {{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }} + availabilityDomain: "{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}" + subnetId: "{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}" + bootVolumeSize: {{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }} release: - image: "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" + image: "{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}" discovery: namespace: "{{ .namespace }}" by_selectors: diff --git a/helm/adapter-hypershift/adapter-task-config.yaml b/helm/adapter-hypershift/adapter-task-config.yaml index 857584f..df9ba0a 100644 --- a/helm/adapter-hypershift/adapter-task-config.yaml +++ b/helm/adapter-hypershift/adapter-task-config.yaml @@ -53,9 +53,11 @@ preconditions: field: "generation" - name: "clusterNotReady" expression: | - status.conditions.filter(c, c.type == "Ready").size() > 0 - ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" - : true + !has(status) || !has(status.conditions) + ? true + : (status.conditions.filter(c, c.type == "Ready").size() > 0 + ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" + : true) - name: "validationCheck" expression: | From f2d847c90cd2c9df78509714cfce113eca6d5d73 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Thu, 16 Apr 2026 12:06:20 -0400 Subject: [PATCH 5/9] Guard clusterAvailable conditions and fix YAML quoting in nodepool adapter Add has() guard to clusterAvailable expression so missing conditions field returns false instead of erroring. Switch outer double quotes to single quotes on nodepoolSpec index expressions to avoid nested quote YAML parsing errors. --- .../adapter-task-config.yaml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml index 979b45f..a67812c 100644 --- a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml +++ b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml @@ -94,7 +94,13 @@ preconditions: capture: - name: "clusterAvailable" expression: | - items.filter(s, s.adapter == "adapter-hypershift").size() > 0 ? (items.filter(s, s.adapter == "adapter-hypershift")[0].conditions.filter(c, c.type == "Available").size() > 0 ? items.filter(s, s.adapter == "adapter-hypershift")[0].conditions.filter(c, c.type == "Available")[0].status == "True" : false) : false + items.filter(s, s.adapter == "adapter-hypershift").size() > 0 + ? (has(items.filter(s, s.adapter == "adapter-hypershift")[0].conditions) + ? (items.filter(s, s.adapter == "adapter-hypershift")[0].conditions.filter(c, c.type == "Available").size() > 0 + ? items.filter(s, s.adapter == "adapter-hypershift")[0].conditions.filter(c, c.type == "Available")[0].status == "True" + : false) + : false) + : false - name: "validationCheck" # Only proceed if nodepool is NOT Ready AND HostedCluster adapter reports Available @@ -127,15 +133,15 @@ resources: platform: type: OCI oci: - instanceShape: "{{ index .nodepoolSpec "instanceShape" | default .ociShape }}" + instanceShape: '{{ index .nodepoolSpec "instanceShape" | default .ociShape }}' instanceShapeConfig: ocpus: {{ index .nodepoolSpec "ocpus" | default .ociOcpus }} memoryInGBs: {{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }} - availabilityDomain: "{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}" - subnetId: "{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}" + availabilityDomain: '{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}' + subnetId: '{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}' bootVolumeSize: {{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }} release: - image: "{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}" + image: '{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}' discovery: namespace: "{{ .namespace }}" by_selectors: From b161d79116399cbf2b6822fe5b80e9ddcb272749 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Tue, 9 Jun 2026 11:11:10 -0400 Subject: [PATCH 6/9] Fix adapter-hypershift status report methods to use PUT The HyperFleet API registers status endpoints with http.MethodPut, but both adapter-hypershift and adapter-hypershift-nodepool task configs were using POST. This would result in 405 Method Not Allowed when adapters try to report HostedCluster or NodePool status back to the API. The base adapter configs under helmfile/configs/base/ already use PUT correctly; these two charts were missed because they are deployed directly via helm rather than through helmfile. --- helm/adapter-hypershift-nodepool/adapter-task-config.yaml | 2 +- helm/adapter-hypershift/adapter-task-config.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml index a67812c..793bbdb 100644 --- a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml +++ b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml @@ -206,7 +206,7 @@ post: post_actions: - name: "reportNodepoolStatus" api_call: - method: "POST" + method: "PUT" url: "/clusters/{{ .clusterId }}/nodepools/{{ .nodepoolId }}/statuses" headers: - name: "Content-Type" diff --git a/helm/adapter-hypershift/adapter-task-config.yaml b/helm/adapter-hypershift/adapter-task-config.yaml index df9ba0a..06a6cdc 100644 --- a/helm/adapter-hypershift/adapter-task-config.yaml +++ b/helm/adapter-hypershift/adapter-task-config.yaml @@ -195,7 +195,7 @@ post: post_actions: - name: "reportClusterStatus" api_call: - method: "POST" + method: "PUT" url: "/clusters/{{ .clusterId }}/statuses" headers: - name: "Content-Type" From c9bc234960992e160e2e22fe59ef3584e1e0661c Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Thu, 11 Jun 2026 09:24:59 -0400 Subject: [PATCH 7/9] Fix adapter task configs for v0.2.1 compatibility and OCI platform - Fix CEL expressions: replace invalid bare has() calls with optional field access syntax (status.?conditions.orValue) for v0.2.1 adapter - Quote template expressions in nodepool manifest to prevent YAML parser from interpreting them as flow mappings - Switch services from Route to NodePort for Ignition and OAuth since OKE clusters have no OpenShift router - Change status report POST actions from PUT to POST to match API - Fix OCI helmfile adapter config paths to point to oci/ directory - Pin env.oci chart and image versions to v0.2.1 --- env.oci | 12 +- .../adapter-task-config.yaml | 17 +- .../adapter-task-config.yaml | 21 ++- .../oci/adapters/adapter1/adapter-config.yaml | 26 +++ .../adapter1/adapter-task-config.yaml | 149 ++++++++++++++++++ .../oci/adapter-configs.yaml.gotmpl | 4 +- 6 files changed, 203 insertions(+), 26 deletions(-) create mode 100644 helmfile/configs/oci/adapters/adapter1/adapter-config.yaml create mode 100644 helmfile/configs/oci/adapters/adapter1/adapter-task-config.yaml diff --git a/env.oci b/env.oci index 8a892c6..e5b9135 100644 --- a/env.oci +++ b/env.oci @@ -11,14 +11,14 @@ ADAPTER_REPOSITORY ?= openshift-hyperfleet/hyperfleet-adapter # Helm Charts CHART_ORG ?= openshift-hyperfleet -API_CHART_REF ?= v0.3.0 -SENTINEL_CHART_REF ?= v0.3.0 -ADAPTER_CHART_REF ?= v0.3.0 +API_CHART_REF ?= v0.2.1 +SENTINEL_CHART_REF ?= v0.2.1 +ADAPTER_CHART_REF ?= v0.2.1 # Image Tags -API_IMAGE_TAG ?= v0.3.0 -SENTINEL_IMAGE_TAG ?= v0.3.0 -ADAPTER_IMAGE_TAG ?= v0.3.0 +API_IMAGE_TAG ?= v0.2.1 +SENTINEL_IMAGE_TAG ?= v0.2.1 +ADAPTER_IMAGE_TAG ?= v0.2.1 IMAGE_PULL_POLICY ?= Always # Kubernetes Namespaces diff --git a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml index 793bbdb..f391c74 100644 --- a/helm/adapter-hypershift-nodepool/adapter-task-config.yaml +++ b/helm/adapter-hypershift-nodepool/adapter-task-config.yaml @@ -65,11 +65,8 @@ preconditions: field: "spec" - name: "nodepoolNotReady" expression: | - !has(status) || !has(status.conditions) - ? true - : (status.conditions.filter(c, c.type == "Ready").size() > 0 - ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" - : true) + !(status.?conditions.orValue([]).filter(c, c.type == "Ready").size() > 0 + && status.?conditions.orValue([]).filter(c, c.type == "Ready")[0].status == "True") # Fetch parent cluster details (need the cluster name for clusterName ref) - name: "clusterDetails" @@ -126,7 +123,7 @@ resources: hyperfleet.io/nodepool-name: "{{ .nodepoolName }}" spec: clusterName: "{{ .clusterName }}" - replicas: {{ index .nodepoolSpec "replicas" | default 2 }} + replicas: '{{ index .nodepoolSpec "replicas" | default 2 }}' management: autoRepair: true upgradeType: Replace @@ -135,11 +132,11 @@ resources: oci: instanceShape: '{{ index .nodepoolSpec "instanceShape" | default .ociShape }}' instanceShapeConfig: - ocpus: {{ index .nodepoolSpec "ocpus" | default .ociOcpus }} - memoryInGBs: {{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }} + ocpus: '{{ index .nodepoolSpec "ocpus" | default .ociOcpus }}' + memoryInGBs: '{{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }}' availabilityDomain: '{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}' subnetId: '{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}' - bootVolumeSize: {{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }} + bootVolumeSize: '{{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }}' release: image: '{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}' discovery: @@ -206,7 +203,7 @@ post: post_actions: - name: "reportNodepoolStatus" api_call: - method: "PUT" + method: "POST" url: "/clusters/{{ .clusterId }}/nodepools/{{ .nodepoolId }}/statuses" headers: - name: "Content-Type" diff --git a/helm/adapter-hypershift/adapter-task-config.yaml b/helm/adapter-hypershift/adapter-task-config.yaml index 06a6cdc..54c308a 100644 --- a/helm/adapter-hypershift/adapter-task-config.yaml +++ b/helm/adapter-hypershift/adapter-task-config.yaml @@ -36,6 +36,10 @@ params: source: "env.CPO_IMAGE" type: "string" + - name: "nodeAddress" + source: "env.NODE_ADDRESS" + type: "string" + # Preconditions: check cluster details from API preconditions: @@ -53,11 +57,8 @@ preconditions: field: "generation" - name: "clusterNotReady" expression: | - !has(status) || !has(status.conditions) - ? true - : (status.conditions.filter(c, c.type == "Ready").size() > 0 - ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" - : true) + !(status.?conditions.orValue([]).filter(c, c.type == "Ready").size() > 0 + && status.?conditions.orValue([]).filter(c, c.type == "Ready")[0].status == "True") - name: "validationCheck" expression: | @@ -117,10 +118,14 @@ resources: services: - service: Ignition servicePublishingStrategy: - type: Route + type: NodePort + nodePort: + address: "{{ .nodeAddress }}" - service: OAuthServer servicePublishingStrategy: - type: Route + type: NodePort + nodePort: + address: "{{ .nodeAddress }}" - service: APIServer servicePublishingStrategy: type: LoadBalancer @@ -195,7 +200,7 @@ post: post_actions: - name: "reportClusterStatus" api_call: - method: "PUT" + method: "POST" url: "/clusters/{{ .clusterId }}/statuses" headers: - name: "Content-Type" diff --git a/helmfile/configs/oci/adapters/adapter1/adapter-config.yaml b/helmfile/configs/oci/adapters/adapter1/adapter-config.yaml new file mode 100644 index 0000000..7bdf7bc --- /dev/null +++ b/helmfile/configs/oci/adapters/adapter1/adapter-config.yaml @@ -0,0 +1,26 @@ +# Example HyperFleet Adapter deployment configuration +adapter: + name: adapter1 + version: "0.2.0" + +# Log the full merged configuration after load (default: false) +debug_config: true +log: + level: debug + +clients: + hyperfleet_api: + base_url: http://hyperfleet-api:8000 + version: v1 + timeout: 2s + retry_attempts: 3 + retry_backoff: exponential + + broker: + # These values are overridden at deploy time via env vars from Helm values + subscription_id: "placeholder" + topic: "placeholder" + + kubernetes: + api_version: "v1" + #kube_config_path: PATH_TO_KUBECONFIG # for local development diff --git a/helmfile/configs/oci/adapters/adapter1/adapter-task-config.yaml b/helmfile/configs/oci/adapters/adapter1/adapter-task-config.yaml new file mode 100644 index 0000000..0cbd92f --- /dev/null +++ b/helmfile/configs/oci/adapters/adapter1/adapter-task-config.yaml @@ -0,0 +1,149 @@ +# HyperFleet Adapter task configuration (v0.2.1 compatible) +params: + + - name: "clusterId" + source: "event.id" + type: "string" + required: true + + - name: "generation" + source: "event.generation" + type: "int" + required: true + + - name: "namespace" + source: "env.NAMESPACE" + type: "string" + +# Preconditions with valid operators and CEL expressions +preconditions: + - name: "clusterStatus" + api_call: + method: "GET" + url: "/clusters/{{ .clusterId }}" + timeout: 10s + retry_attempts: 3 + retry_backoff: "exponential" + capture: + - name: "clusterName" + field: "name" + - name: "generation" + field: "generation" + - name: "clusterNotReady" + expression: | + status.conditions.filter(c, c.type == "Ready").size() > 0 + ? status.conditions.filter(c, c.type == "Ready")[0].status != "True" + : true + - name: "clusterReadyTTL" + expression: | + (timestamp(now()) - timestamp( + status.conditions.filter(c, c.type == "Ready").size() > 0 + ? status.conditions.filter(c, c.type == "Ready")[0].last_transition_time + : now() + )).getSeconds() > 300 + + - name: "validationCheck" + # Precondition passes if cluster is NOT Ready OR if cluster is Ready and stable for >300 seconds since last transition (enables self-healing) + expression: | + clusterNotReady || clusterReadyTTL + +# Resources with valid K8s manifests +resources: + - name: "resource0" + transport: + client: "kubernetes" + manifest: + apiVersion: v1 + kind: ConfigMap + data: + cluster_id: "{{ .clusterId }}" + cluster_name: "{{ .clusterName }}" + metadata: + name: "{{ .clusterId | lower }}-adapter1-configmap" + namespace: "{{ .namespace }}" + labels: + app.kubernetes.io/component: adapter + app.kubernetes.io/instance: adapter1 + app.kubernetes.io/name: hyperfleet-adapter + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/transport: kubernetes + hyperfleet.io/cluster-id: "{{ .clusterId }}" + hyperfleet.io/cluster-name: "{{ .clusterName }}" + annotations: + hyperfleet.io/generation: "{{ .generation }}" + discovery: + namespace: "{{ .namespace }}" + by_selectors: + label_selector: + hyperfleet.io/cluster-id: "{{ .clusterId }}" + hyperfleet.io/cluster-name: "{{ .clusterName }}" + +# Post-processing with valid CEL expressions +post: + payloads: + - name: "statusPayload" + build: + adapter: "{{ .adapter.name }}" + conditions: + # Applied: ConfigMap successfully created in the target namespace + - type: "Applied" + status: + expression: | + resources.?resource0.?metadata.?creationTimestamp.hasValue() ? "True" : "False" + reason: + expression: | + resources.?resource0.?metadata.?creationTimestamp.hasValue() ? "ConfigMapCreated" : "ConfigMapNotCreated" + message: + expression: | + resources.?resource0.?metadata.?creationTimestamp.hasValue() + ? "ConfigMap created in namespace " + resources.resource0.metadata.namespace + : "ConfigMap has not been created yet" + # Available: ConfigMap data keys are populated and accessible + - type: "Available" + status: + expression: | + resources.?resource0.?data.?cluster_id.hasValue() ? "True" : "False" + reason: + expression: | + resources.?resource0.?data.?cluster_id.hasValue() + ? "ConfigMapDataPopulated" + : "ConfigMapDataMissing" + message: + expression: | + resources.?resource0.?data.?cluster_id.hasValue() + ? "ConfigMap data keys are populated and accessible" + : "ConfigMap data keys are not yet populated" + # Health: Adapter execution status (runtime) + - type: "Health" + status: + expression: | + adapter.?executionStatus.orValue("") == "success" ? "True" : (adapter.?executionStatus.orValue("") == "failed" ? "False" : "Unknown") + reason: + expression: | + adapter.?errorReason.orValue("") != "" ? adapter.?errorReason.orValue("") : "Healthy" + message: + expression: | + adapter.?errorMessage.orValue("") != "" ? adapter.?errorMessage.orValue("") : "All adapter operations completed successfully" + # Event generation ID metadata field needs to use expression to avoid interpolation issues + observed_generation: + expression: "generation" + observed_time: "{{ now | date \"2006-01-02T15:04:05Z07:00\" }}" + # Optional data field for adapter-specific metrics extracted from resources + data: + namespace: + name: + expression: | + resources.?resource0.?metadata.?name.orValue("") + creationTimestamp: + expression: | + resources.?resource0.?metadata.?creationTimestamp.orValue("") + + post_actions: + - name: "reportClusterStatus" + api_call: + method: "PUT" + url: "/clusters/{{ .clusterId }}/statuses" + headers: + - name: "Content-Type" + value: "application/json" + body: "{{ .statusPayload }}" diff --git a/helmfile/environments/oci/adapter-configs.yaml.gotmpl b/helmfile/environments/oci/adapter-configs.yaml.gotmpl index 3ce5376..0d855c5 100644 --- a/helmfile/environments/oci/adapter-configs.yaml.gotmpl +++ b/helmfile/environments/oci/adapter-configs.yaml.gotmpl @@ -21,6 +21,6 @@ adapters: routingKey: "#" setFiles: - name: adapterConfig.yaml - file: configs/base/adapters/adapter1/adapter-config.yaml + file: configs/oci/adapters/adapter1/adapter-config.yaml - name: adapterTaskConfig.yaml - file: configs/base/adapters/adapter1/adapter-task-config.yaml + file: configs/oci/adapters/adapter1/adapter-task-config.yaml From 2942413df1a88ff699f26a8e65ec183a01ac83c7 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Thu, 11 Jun 2026 15:09:16 -0400 Subject: [PATCH 8/9] fix: address PR review feedback for OCI deployment --- .../nodepool-manifest.yaml | 14 ++++----- .../adapter-task-config.yaml | 1 + helm/sentinel-clusters/values-oci.yaml | 24 --------------- helm/sentinel-nodepools/values-oci.yaml | 23 -------------- .../environments/oci/sentinel-configs.yaml | 30 +++++++++++++++++++ 5 files changed, 38 insertions(+), 54 deletions(-) delete mode 100644 helm/sentinel-clusters/values-oci.yaml delete mode 100644 helm/sentinel-nodepools/values-oci.yaml diff --git a/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml b/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml index 5cd1701..167f82a 100644 --- a/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml +++ b/helm/adapter-hypershift-nodepool/nodepool-manifest.yaml @@ -17,12 +17,12 @@ spec: platform: type: OCI oci: - instanceShape: "{{ index .nodepoolSpec "instanceShape" | default .ociShape }}" + instanceShape: '{{ index .nodepoolSpec "instanceShape" | default .ociShape }}' instanceShapeConfig: - ocpus: {{ index .nodepoolSpec "ocpus" | default .ociOcpus }} - memoryInGBs: {{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }} - availabilityDomain: "{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}" - subnetId: "{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}" - bootVolumeSize: {{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }} + ocpus: '{{ index .nodepoolSpec "ocpus" | default .ociOcpus }}' + memoryInGBs: '{{ index .nodepoolSpec "memoryInGBs" | default .ociMemoryGBs }}' + availabilityDomain: '{{ index .nodepoolSpec "availabilityDomain" | default .ociAD }}' + subnetId: '{{ index .nodepoolSpec "subnetId" | default .ociSubnetId }}' + bootVolumeSize: '{{ index .nodepoolSpec "bootVolumeSize" | default .ociBootVolumeGB }}' release: - image: "{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}" + image: '{{ index .nodepoolSpec "releaseImage" | default "quay.io/openshift-release-dev/ocp-release:4.20.2-x86_64" }}' diff --git a/helm/adapter-hypershift/adapter-task-config.yaml b/helm/adapter-hypershift/adapter-task-config.yaml index 54c308a..e4a8440 100644 --- a/helm/adapter-hypershift/adapter-task-config.yaml +++ b/helm/adapter-hypershift/adapter-task-config.yaml @@ -39,6 +39,7 @@ params: - name: "nodeAddress" source: "env.NODE_ADDRESS" type: "string" + required: true # Preconditions: check cluster details from API diff --git a/helm/sentinel-clusters/values-oci.yaml b/helm/sentinel-clusters/values-oci.yaml deleted file mode 100644 index 0985167..0000000 --- a/helm/sentinel-clusters/values-oci.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# OCI/OKE overrides for Sentinel (v0.2.0 config format) -# The v0.2.0 binary uses flat config (hyperfleetApi under config, not clients) - -hyperfleet-sentinel: - config: - resourceType: clusters - resourceSelector: [] - - hyperfleetApi: - baseUrl: http://hyperfleet-api:8000 - timeout: 5s - - broker: - type: rabbitmq - topic: hyperfleet-clusters - rabbitmq: - url: amqp://guest:guest@rabbitmq:5672/ - exchangeType: topic - - monitoring: - podMonitoring: - enabled: false - prometheusRule: - enabled: false diff --git a/helm/sentinel-nodepools/values-oci.yaml b/helm/sentinel-nodepools/values-oci.yaml deleted file mode 100644 index 0d482df..0000000 --- a/helm/sentinel-nodepools/values-oci.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# OCI/OKE overrides for Sentinel nodepools (v0.2.0 config format) - -hyperfleet-sentinel: - config: - resourceType: nodepools - resourceSelector: [] - - hyperfleetApi: - baseUrl: http://hyperfleet-api:8000 - timeout: 5s - - broker: - type: rabbitmq - topic: hyperfleet-nodepools - rabbitmq: - url: amqp://guest:guest@rabbitmq:5672/ - exchangeType: topic - - monitoring: - podMonitoring: - enabled: false - prometheusRule: - enabled: false diff --git a/helmfile/environments/oci/sentinel-configs.yaml b/helmfile/environments/oci/sentinel-configs.yaml index 8872926..6be831f 100644 --- a/helmfile/environments/oci/sentinel-configs.yaml +++ b/helmfile/environments/oci/sentinel-configs.yaml @@ -3,3 +3,33 @@ sentinels: values: - config: resourceType: clusters + resourceSelector: [] + broker: + topic: hyperfleet-clusters + rabbitmq: + exchangeType: topic + monitoring: + podMonitoring: + enabled: false + prometheusRule: + enabled: false + + - name: nodepools + values: + - config: + resourceType: nodepools + resourceSelector: [] + messageData: + owner_references: + id: "resource.owner_references.id" + href: "resource.owner_references.href" + kind: "resource.owner_references.kind" + broker: + topic: hyperfleet-nodepools + rabbitmq: + exchangeType: topic + monitoring: + podMonitoring: + enabled: false + prometheusRule: + enabled: false From 4e807cceb3d99cc20562afb9633c199f9cb1153e Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Thu, 11 Jun 2026 17:10:07 -0400 Subject: [PATCH 9/9] Update adapter tarballs --- .../charts/hyperfleet-adapter-2.0.0.tgz | Bin 21030 -> 27446 bytes .../charts/hyperfleet-adapter-2.0.0.tgz | Bin 21029 -> 27446 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/helm/adapter-hypershift-nodepool/charts/hyperfleet-adapter-2.0.0.tgz b/helm/adapter-hypershift-nodepool/charts/hyperfleet-adapter-2.0.0.tgz index dbc44e3c15c00354d170f27d88faf2a6b10e0470..332a9d8592a248b2f9df73742751f91b1633184c 100644 GIT binary patch literal 27446 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 F0s!9ZxA6b~ literal 21030 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

XQfes z5+)vQM2erjrZgImu!#T`74Isi*c%GsjWCRyI#n|H6tRWfQGX(TM%-ADb=t*CEabdP z)QYQgKx-4H8}$}ZmsmE|wZ?9>xzvdOT0z6jTset&4VOr^#zJ)yht34@GtH(HrCw+! zJcsYN6Eg?zAbF9eMJ}|#or8Nmz{=5ulhrS1CZPtKFw;@5L6(mp;n!$0fv(-dA_?;{ zu8pw~6ZKBWZ|VwE0{Ez^x3+t|XPw?wr?-8+wcGDK?e}*7tM|O$>$RM_(FUue6LoVN z0LCG@Afa)L*&UmJ07Wm8tjU zFYbkdu_`=ycUERKSYiyQ;||!!^u};4<(b(Ew29W|Hc5Sa9`L!b{kJtsso5jVZDU#d zPx;Na|9-ah^!cOx_d`4tBffJt`>zcgWg|QWDso=mlc+lx9oqc3mBhg4tr0olD81H% zu~}8NeAgLCh3kP-8fmWSl)u&=b;^jndbhSoT{z6Y7G;PleaA2;gz^`Q`G|%3%p+kI zHoeo=86AFI+PYz2teBDn1Wk!{Vc|nrHKbW0R7zostRIZkyK~7GtU<@&z+9ECEZQ4Z|zo{y;Mi*N`^5DbCr^&&?fmE-w;Rz4KvnE#;V8$%t5On&qfd-R1XHV z9;4LK9?+0as1Kl&p4SyDyLIdE5g4G#ntWpsJGXtdVulcLeQ3~uinFLToHWNr&pOX|QPs_6 zQEpps=^eH!oBw*!ak@j7-n{o@sx~|e41kXOh51|)+u9HbfEQ`XH-h* zN!04YKM2dskzXDPliYRu<8nZ%)d+?x(=Ln%<|PTQEEtU)Hkr_fk(|b}4Tzm1Eynq! zWh0`5^DaxrBx&{Gh>~f=d(TwA9@C`e1gZOlkkS$hCWxpzPP1iymywV{N;Ae)eB6CTI)vHP;Gx{Cdqi>rMEgWaQCe@q+ znIlfof@9uPz2eE&xhiR)31|-qi$RBy!dGUp%*r|~V(R5-)kypM*}JzVBp+9&&!P1I}qSVF~IctJkb4 zW}j;r=L`kAxn0+dVNSbY#UpZYV-CPMEo#l?xjAIEbc^U{@8q%~)?0i|i}nt`4l)Sf zlU~TJa{qIut%IAD_qP@p*h6pMSUK{|^8F|NqY75G?@I0RT~)^%ejC diff --git a/helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz b/helm/adapter-hypershift/charts/hyperfleet-adapter-2.0.0.tgz index 3129398a8b20c8b3648c89c74c5676dea1b58e0f..d4753d04cd1cf85ab3a6b09bc958aee5ffd053f5 100644 GIT binary patch literal 27446 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 F0szPt$58+P literal 21029 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

KuV{Ewe5 znUYpYDtY2bIbGP_tK3pe-qXx*e~$YcC0bC87b-3`?t`bzCoOoFYeT3H;s}aV79*AOawh_ z(%c2!YNn_yq9+HA>x+d!9?fxogt=(YeB^sR8XmbAP``{r?SxgsOzORTX=vHmx;r*9 zqMA=OG|0?e%;fF;(p9QIeYhSEfwhe3d&p0d8{%pq{@BBY`fHTf>#}JMw5zS@mG(Ir zg%52!@!x2_xqOiuOS71fbv;FzP(#B)^hm05Uu`1iGnH%Tocdd9++<9)M~bC$$DeXO z^H#)XSjUM1Up#2aXTWMFQQEG{vc-HB27HQHj1lRAw%R^#LLF5R}T-NMUKle`2fCTk+kY!S8FPo;KfPi?Sr>j|vsoif^ zALJbUMot5#${%To_K2nqUyP{xi?exdjl0xj$_#cSQO^HL2JNNN{N*x{i{M<%@l5w? zmgx$Fd=>BpW=tSb5^lyTZuh8V8M{q`r<`G&gEGOJ4Lrlo5k~403`6v2O{K~dhO_X% zAK-U`8XG^{C_8@|I_0dY-REZ*=pR@8SVz3&>|sxjC}*f;qjV?`&no4oLOD>rm`NoP zAH8Y+rWBnTpW(QuDaadfld%I!Jt2;J zTTGE6U?@0Jy1bZkC{t5$ISM8nP~BAWa#N>~JRcx>HgtF@~$q6yS zG7EO@d~ij@O8oaL`JI{eV^kfX+e0a@?;G3txbBY}V%Y`NWIaAjx~Hbk7M$Knh!~X( z{3Z6Z*CaGn7#&F5QD=*T3oHw38XDV1Xo?}s->tlC?nc7~=9pyK(&L8re>%B;w)LKu>gISe;ni~WrEa_(hvr*cchRFaPqi+Jz=#stXr}T>7tzC zv0%TI&ROx|sh&uM|9-}{v2Er=_A}qM2YP02+lgs>dm;6^`=YdZuOK}?ViRSO1*244 zMu}ZNw62@6B`zjbUzG(eM&~SWvkQwV$g?0|b+%Af{h*z#sv1cG=3vWv_mx6uj(DXV z#3g@=KDS-8p>PAN>QU+s!`NS_j5AZ*{B(*_p9Ci$1=8_-zZ@Rg)>wNwj;m!N>Llm+ zf~*#f(~YsY+-8QQM)J_6caM)bi48X<`VLaT+0S3A2$iT>*FQTsMJO(3*Ti6pA+pYf zjmKI#%$>y%z>y=Kd{R?1-Y#O^!~~o0Af@OL?^X}p` z^BBs4r^%iJjJX6rgnMi@!kapJe+M*DO-;E~G+JaU7$JDckjwRS%<4AIG{q+SFa={P z$U!N6xFuA-HY1kkIa~3h|IaSL1#R7eb%TA%KjuLaL(?g4KN-*f{(t7dCz)d1yWRq; z*#*`TsGUaPA&5k|zcSEmh)}XbrD9rEGM{V!kKYNmu6~z+@io=p+n;l;1f&tBhn1aw$;GkBZ7Btg fMQ