This repository contains Helm charts for deploying and managing OpenShift clusters on AWS using ROSA HCP (Red Hat OpenShift Service on AWS - Hosted Control Plane) with validated-pattern workflows.
This repo is the GitOps arm of validated-pattern-terraform-rosa, which uses Terraform to provision ROSA HCP clusters. After Terraform creates a cluster, the Terraform bootstrap step installs the cluster-bootstrap chart, which brings up OpenShift GitOps (ArgoCD) and deploys these Helm charts to configure the cluster—logging, storage, operators, team namespaces, and more.
graph TD
A[Terraform Infrastructure] -->|Deploys| B[cluster-bootstrap]
B -->|Installs| C[OpenShift GitOps]
B -->|Creates| D[ArgoCD Applications]
D --> E[app-of-apps-infrastructure]
D --> F[app-of-apps-application]
E -->|Deploys| G[Infrastructure Charts]
F -->|Deploys| H[app-of-apps-namespaces]
H -->|Deploys| I[namespaces]
G --> J[Operators & Platform Services]
I --> K[Team Namespaces & Resources]
L[Helper Charts] -.->|Support| G
L -.->|Support| J
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#e8f5e8
style F fill:#e8f5e8
style G fill:#fff9c4
style H fill:#e8f5e8
style I fill:#fff9c4
Charts are automatically published when changes are committed to the main branch. The process is managed by GitHub Actions workflows located in the .github/workflows/ directory.
Chart.yaml when making changes. Failing to update the version will cause GitHub Actions to fail during the release process.
# charts/<chart-name>/Chart.yaml
apiVersion: v2
name: my-chart
description: Chart description
version: 1.2.3 # ← MUST be incremented for each change- Make Changes: Update chart templates, values, or documentation
- Bump Version: Increment version in
Chart.yamlfollowing semantic versioning- Patch (1.2.3 → 1.2.4): Bug fixes, documentation updates
- Minor (1.2.3 → 1.3.0): New features, backward-compatible changes
- Major (1.2.3 → 2.0.0): Breaking changes
- Commit & Push: Commit changes to
mainbranch - Automatic Release: GitHub Actions handles the rest
The .github/workflows/ directory contains automated workflows that:
.github/workflows/
├── release.yml # Main release workflow
├── lint-test.yml # Chart linting and testing
└── pages-deploy.yml # GitHub Pages deployment
Release Process Flow:
- Trigger: Push to
mainbranch with chart changes - Lint & Test: Validates chart syntax and structure
- Package: Creates
.tgzpackages for changed charts - Release: Creates GitHub releases with chart packages
- Index Update: Updates Helm repository index (
index.yaml) - Publish: Deploys to GitHub Pages at
https://rh-mobb.github.io/validated-pattern-helm-charts/
❌ Version Not Bumped Error:
Error: Chart version 1.2.3 already exists
Solution: Increment the version in Chart.yaml before committing.
❌ Invalid Version Format:
Error: Version must follow semantic versioning
Solution: Use format MAJOR.MINOR.PATCH (e.g., 1.2.3, not v1.2.3 or 1.2).
❌ Chart Lint Failures:
Error: Chart validation failed
Solution: Run local validation before committing:
helm lint ./charts/<chart-name>
helm template test ./charts/<chart-name>After successful release, verify your chart is available:
# Add the Helm repository
helm repo add validated-pattern https://rh-mobb.github.io/validated-pattern-helm-charts/
# Update repository index
helm repo update
# Search for your chart
helm search repo validated-pattern/<chart-name>
# View available versions
helm search repo validated-pattern/<chart-name> --versionsPurpose: Foundation charts deployed by Terraform to establish GitOps infrastructure
| Chart | Version | Description | Deployment Method |
|---|---|---|---|
| cluster-bootstrap | 0.4.0 | Core GitOps infrastructure and ArgoCD setup | Terraform via bootstrap.tftpl |
| cluster-bootstrap-acm-spoke | 0.4.0 | ACM spoke cluster bootstrap variant | Terraform via bootstrap.tftpl |
Key Features:
- OpenShift GitOps operator installation
- ArgoCD instance configuration with vault plugin
- Initial repository setup (Git and Helm)
- KMS storage class creation
- Console integration and RBAC setup
Purpose: GitOps orchestration using ArgoCD "App of Apps" pattern
| Chart | Version | Description | Deployment Method |
|---|---|---|---|
| app-of-apps-infrastructure | 0.1.2 | Infrastructure component orchestration | ArgoCD via cluster-bootstrap |
| app-of-apps-application | 1.5.4 | Team application namespace orchestration | ArgoCD via cluster-bootstrap |
| app-of-apps-namespaces | 0.3.2 | Individual namespace deployment coordination | ArgoCD via app-of-apps-application |
GitOps Flow:
- Infrastructure Layer: Deploys platform components (storage, logging, security)
- Application Layer: Creates team-specific ArgoCD applications and projects
- Namespace Layer: Deploys actual team namespaces with resources
Configuration Sources:
cluster-config/*/infrastructure.yaml- Infrastructure component definitionscluster-config/*/applications-ns.yaml- Team application configurationscluster-config/*/namespaces/*.yaml- Individual team namespace configurations
Purpose: Utility charts that assist with operator installations and cluster operations
| Chart | Version | Description | Usage | Annotation Type |
|---|---|---|---|---|
| helper-operator | 1.0.26 | OpenShift operator installation automation | Sub-chart dependency | ArgoCD annotations |
| helper-status-checker | 1.0.7 | Operator readiness verification | Sub-chart dependency | ArgoCD annotations |
| helper-installplan-approver | 0.1.2 | InstallPlan approval automation | Standalone or sub-chart | Helm annotations |
Annotation Differences:
- helper-operator & helper-status-checker: Use ArgoCD annotations (
argocd.argoproj.io/sync-wave,argocd.argoproj.io/hook) for GitOps deployment orchestration - helper-installplan-approver: Uses Helm annotations (
helm.sh/hook,helm.sh/hook-weight) for Terraform-driven Helm deployments
Common Pattern: Most infrastructure charts use helper-operator + helper-status-checker as dependencies:
dependencies:
- name: helper-operator
version: "1.0.26"
- name: helper-status-checker
version: "1.0.7"Purpose: Platform-level components deployed via app-of-apps-infrastructure
| Chart | Version | Description | Namespace |
|---|---|---|---|
| cluster-efs | 0.3.0 | AWS EFS storage classes and CSI driver | openshift-cluster-csi-drivers |
| Chart | Version | Description | Namespace |
|---|---|---|---|
| compliance-operator | 1.0.47 | OpenShift compliance scanning | openshift-compliance |
| rhacs-operator | 0.0.4 | Red Hat Advanced Cluster Security | rhacs-operator |
| aws-privateca-issuer | 1.0.2 | AWS Private CA certificate issuer | cert-manager |
| Chart | Version | Description | Namespace |
|---|---|---|---|
| cluster-logging | 0.4.0 | Centralized logging with CloudWatch | openshift-logging |
| Chart | Version | Description | Namespace |
|---|---|---|---|
| deploy-operator | 0.2.0 | Generic chart for lightweight operators (web-terminal, openshift-pipelines, devspaces, kiali, servicemesh, serverless, authorino) | openshift-operators |
| acm-operator | 0.2.0 | Multi-cluster management hub | open-cluster-management |
| overprovisioning | 0.0.6 | Pod overprovisioning for autoscaling | overprovisioning |
Deprecated (use deploy-operator instead): tekton-pipelines, openshift-pipelines-operator, devspaces-operator, kiali-operator, servicemesh-operator, serverless-operator, authorino-operator
| Chart | Version | Description | Namespace |
|---|---|---|---|
| rhods-operator | 1.0.3 | Red Hat OpenShift Data Science | redhat-ods-operator |
| Chart | Version | Description | Namespace |
|---|---|---|---|
| cluster-ingress | 0.2.0 | Custom ingress controllers and certificates | openshift-ingress-operator |
Purpose: Team-level resources and namespace management
| Chart | Version | Description | Deployment Method |
|---|---|---|---|
| namespaces | 1.4.9 | Kubernetes namespace creation with governance | ArgoCD via app-of-apps-namespaces |
| application-gitops | 1.3.8 | Team-specific ArgoCD instance setup | ArgoCD or sub-chart dependency |
Namespace Chart Features:
- Namespace creation with labels and annotations
- Resource quotas and limits
- Network policies for security
- RBAC with Active Directory integration
- Service accounts for CI/CD pipelines
- ECR access automation via CronJobs
# Infrastructure provisioning triggers bootstrap
terraform apply -target=shell_script.bootstrapFlow: Terraform → cluster-bootstrap → OpenShift GitOps → ArgoCD Applications
# cluster-config/nonprod/np-hub/infrastructure.yaml
infrastructure:
- chart: cluster-efs
targetRevision: 0.3.0
namespace: openshift-cluster-csi-driversFlow: app-of-apps-infrastructure → Infrastructure Charts → Platform Components
# cluster-config/nonprod/np-hub/applications-ns.yaml
applications:
- name: payments
gitPath: nonprod/np-hub/namespaces/payments-1234.yaml
gitopsCreate: true # Creates team ArgoCD projectFlow: app-of-apps-application → app-of-apps-namespaces → namespaces → Team Resources
cluster-config/
├── nonprod/
│ ├── np-hub/
│ │ ├── infrastructure.yaml # Infrastructure components
│ │ ├── applications-ns.yaml # Team applications
│ │ └── namespaces/
│ │ ├── accounting-abcd.yaml # Team namespace config
│ │ └── payments-1234.yaml # Team namespace config
│ ├── np-app-1/
│ ├── np-os-ai/
│ └── np-os-virt/
- np-hub: Hub cluster with ACM and shared services
- np-app-1: Application workload cluster
- np-os-ai: AI/ML workload cluster with RHODS
- np-os-virt: Virtualization workload cluster
- Infrastructure Level: Platform operators and security tools
- Application Level: Team ArgoCD projects with restricted access
- Namespace Level: Resource quotas, network policies, RBAC
appProject:
adGroup: PFAUTHAD # AD group for team access
repos:
- 'https://rh-mobb.github.io/validated-pattern-helm-charts'
- 'https://github.com/rh-mobb/cluster-config.git'- IAM Roles: Service-specific roles for EFS, CloudWatch, etc.
- Secrets Manager: Vault plugin integration for secure secret access
- KMS: Encrypted storage classes for data at rest
# Test chart templating
helm template <chart-name> ./charts/<chart-name> \
-f ../cluster-config/nonprod/np-hub/<config-file>.yaml
# Validate with cluster-config values
helm template test-app ./charts/app-of-apps-application \
-f ../cluster-config/nonprod/np-hub/applications-ns.yaml# Update chart dependencies
helm dependency update ./charts/<chart-name>
# Build chart packages
helm package ./charts/<chart-name>-
Chart Not Syncing
oc get applications -n openshift-gitops oc describe application <app-name> -n openshift-gitops
-
Operator Installation Issues
oc get csv -A | grep <operator-name> oc get installplan -A
-
RBAC Problems
oc get appprojects -n openshift-gitops oc describe appproject <project-name> -n openshift-gitops
# Check ArgoCD applications
oc get applications -n openshift-gitops
# Verify operators
oc get csv -A
# Check namespaces
oc get namespaces | grep -E "(accounting|payments)"
# Verify storage classes
oc get storageclassSee CONTRIBUTING.md for guidelines on how to contribute.
- Use Helper Charts: Leverage helper-operator and helper-status-checker for operators
- Follow Naming Conventions: Use consistent naming patterns
- Include READMEs: Comprehensive documentation for each chart
- Version Appropriately: Semantic versioning for all changes
- Test Thoroughly: Template testing with real cluster-config values
charts/<chart-name>/
├── Chart.yaml # Chart metadata
├── README.md # Comprehensive documentation
├── values.yaml # Default configuration
└── templates/
├── _helpers.tpl # Template helpers
└── *.yaml # Kubernetes resources
Charts are automatically versioned and tagged when changes are merged. The CI/CD pipeline:
- Builds and packages charts
- Creates GitHub releases with chart packages
- Updates the Helm repository index
- Publishes to GitHub Pages
- Individual Chart READMEs: Detailed documentation for each chart
- Architecture Diagrams: Mermaid diagrams showing relationships
- Configuration Examples: Real-world cluster-config examples
- Troubleshooting Guides: Common issues and solutions
For specific chart documentation, see the individual README files in each chart directory.