Skip to content

Commit 218b9d3

Browse files
feat(RHOAIENG-52137): add Gateway API CRD as dependency (#3247)
1 parent 3fc5004 commit 218b9d3

File tree

11 files changed

+118
-58
lines changed

11 files changed

+118
-58
lines changed

.github/scripts/manifest-utils.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,14 @@ function parseManifestFile(filePath) {
8787
// Parse both ODH and RHOAI manifest blocks
8888
const odhComponents = parseManifestBlock(content, 'ODH_COMPONENT_MANIFESTS', 'odh');
8989
const rhoaiComponents = parseManifestBlock(content, 'RHOAI_COMPONENT_MANIFESTS', 'rhoai');
90+
const odhCharts = parseManifestBlock(content, 'ODH_COMPONENT_CHARTS', 'odh');
91+
const rhoaiCharts = parseManifestBlock(content, 'RHOAI_COMPONENT_CHARTS', 'rhoai');
9092

9193
return {
9294
odh: odhComponents,
93-
rhoai: rhoaiComponents
95+
rhoai: rhoaiComponents,
96+
odhCharts: odhCharts,
97+
rhoaiCharts: rhoaiCharts
9498
};
9599
}
96100

.github/scripts/update-manifests-commit-sha.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module.exports = async function ({ github, core }) {
77
const updates = [];
88

99
// Process both ODH and RHOAI platforms
10-
for (const components of [parsedManifests.odh, parsedManifests.rhoai]) {
10+
for (const components of [parsedManifests.odh, parsedManifests.rhoai, parsedManifests.odhCharts, parsedManifests.rhoaiCharts]) {
1111
// Filter to only components with branch@sha format
1212
const componentsWithSha = [];
1313
for (const componentInfo of components) {

api/cloudmanager/common/types.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ type LWSConfiguration struct{}
2424
// +kubebuilder:object:generate=true
2525
type SailOperatorConfiguration struct{}
2626

27+
// GatewayAPIConfiguration defines the configuration for the Gateway API dependency.
28+
// +kubebuilder:object:generate=true
29+
type GatewayAPIConfiguration struct{}
30+
2731
// CertManagerDependency defines the cert-manager operator dependency.
2832
// +kubebuilder:object:generate=true
2933
type CertManagerDependency struct {
@@ -66,6 +70,20 @@ type SailOperatorDependency struct {
6670
Configuration SailOperatorConfiguration `json:"configuration,omitempty"`
6771
}
6872

73+
// GatewayAPIDependency defines the Gateway API dependency.
74+
// +kubebuilder:object:generate=true
75+
type GatewayAPIDependency struct {
76+
// ManagementPolicy determines whether the operator manages this dependency.
77+
// Managed: the operator installs and reconciles the dependency.
78+
// Unmanaged: the operator does not manage the dependency; the user is responsible.
79+
// +kubebuilder:default=Managed
80+
ManagementPolicy ManagementPolicy `json:"managementPolicy,omitempty"`
81+
82+
// Configuration for the Gateway API.
83+
// +optional
84+
Configuration GatewayAPIConfiguration `json:"configuration,omitempty"`
85+
}
86+
6987
// Dependencies defines the dependency configurations for cloud manager operators.
7088
// +kubebuilder:object:generate=true
7189
type Dependencies struct {
@@ -80,4 +98,8 @@ type Dependencies struct {
8098
// SailOperator defines the Sail operator (Istio) dependency.
8199
// +optional
82100
SailOperator SailOperatorDependency `json:"sailOperator,omitempty"`
101+
102+
// GatewayAPI defines the Gateway API dependency.
103+
// +optional
104+
GatewayAPI GatewayAPIDependency `json:"gatewayAPI,omitempty"`
83105
}

api/cloudmanager/common/zz_generated.deepcopy.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/cloudmanager/azure/samples/azurekubernetesengine_v1alpha1.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ metadata:
44
name: default-azurekubernetesengine
55
spec:
66
dependencies:
7+
gatewayAPI:
8+
managementPolicy: Managed
79
certManager:
810
managementPolicy: Managed
911
lws:

config/cloudmanager/coreweave/samples/coreweavekubernetesengine_v1alpha1.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ metadata:
44
name: default-coreweavekubernetesengine
55
spec:
66
dependencies:
7+
gatewayAPI:
8+
managementPolicy: Managed
79
certManager:
810
managementPolicy: Managed
911
lws:

get_all_manifests.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ declare -A RHOAI_COMPONENT_MANIFESTS=(
6161

6262
# ODH Component Charts
6363
declare -A ODH_COMPONENT_CHARTS=(
64-
["cert-manager-operator"]="opendatahub-io:odh-gitops:main@99d7a56589872aea722797e90f12b8801aad1065:charts/cert-manager-operator"
65-
["lws-operator"]="opendatahub-io:odh-gitops:main@99d7a56589872aea722797e90f12b8801aad1065:charts/lws-operator"
66-
["sail-operator"]="opendatahub-io:odh-gitops:main@99d7a56589872aea722797e90f12b8801aad1065:charts/sail-operator"
64+
["cert-manager-operator"]="opendatahub-io:odh-gitops:main@f600f22bdec2fb6ee24ead6fa04b6b3d896781fb:charts/cert-manager-operator"
65+
["lws-operator"]="opendatahub-io:odh-gitops:main@f600f22bdec2fb6ee24ead6fa04b6b3d896781fb:charts/lws-operator"
66+
["sail-operator"]="opendatahub-io:odh-gitops:main@f600f22bdec2fb6ee24ead6fa04b6b3d896781fb:charts/sail-operator"
67+
["gateway-api"]="opendatahub-io:odh-gitops:main@f600f22bdec2fb6ee24ead6fa04b6b3d896781fb:charts/gateway-api"
6768
)
6869

6970
# RHOAI Component Charts

internal/controller/cloudmanager/azure/azurekubernetesengine_controller_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func TestAzureKubernetesEngine(t *testing.T) {
3737
wt := tc.NewWithT(t)
3838

3939
createAzureCR(t, wt, ccmcommon.Dependencies{
40+
GatewayAPI: ccmcommon.GatewayAPIDependency{ManagementPolicy: ccmcommon.Managed},
4041
CertManager: ccmcommon.CertManagerDependency{ManagementPolicy: ccmcommon.Managed},
4142
LWS: ccmcommon.LWSDependency{ManagementPolicy: ccmcommon.Managed},
4243
SailOperator: ccmcommon.SailOperatorDependency{ManagementPolicy: ccmcommon.Managed},

internal/controller/cloudmanager/common/charts.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package common
33
import (
44
"os"
55
"path/filepath"
6+
"strings"
67

78
helm "github.com/k8s-manifest-kit/renderer-helm/pkg"
89

@@ -32,6 +33,18 @@ type chartDef struct {
3233
// namespaces. Both ManagedNamespaces and BuildHelmCharts derive from this list.
3334
func allChartDefs() []chartDef {
3435
return []chartDef{
36+
{
37+
policyFn: func(d ccmcommon.Dependencies) ccmcommon.ManagementPolicy {
38+
return d.GatewayAPI.ManagementPolicy
39+
},
40+
chart: types.HelmChartInfo{
41+
Source: helm.Source{
42+
Chart: filepath.Join(DefaultChartsPath, "gateway-api"),
43+
ReleaseName: "gateway-api",
44+
Values: helm.Values(map[string]any{}),
45+
},
46+
},
47+
},
3548
{
3649
namespace: NamespaceCertManagerOperator,
3750
policyFn: func(d ccmcommon.Dependencies) ccmcommon.ManagementPolicy {
@@ -92,6 +105,9 @@ func ManagedNamespaces() []string {
92105
var namespaces []string
93106

94107
for _, def := range allChartDefs() {
108+
if strings.TrimSpace(def.namespace) == "" {
109+
continue
110+
}
95111
if _, ok := seen[def.namespace]; !ok {
96112
seen[def.namespace] = struct{}{}
97113
namespaces = append(namespaces, def.namespace)

internal/controller/cloudmanager/common/charts_test.go

Lines changed: 32 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,48 @@ func TestManagedNamespaces(t *testing.T) {
2525
})
2626
}
2727

28+
func getAllUnmanagedDependencies() ccmcommon.Dependencies {
29+
return ccmcommon.Dependencies{
30+
GatewayAPI: ccmcommon.GatewayAPIDependency{ManagementPolicy: ccmcommon.Unmanaged},
31+
CertManager: ccmcommon.CertManagerDependency{ManagementPolicy: ccmcommon.Unmanaged},
32+
LWS: ccmcommon.LWSDependency{ManagementPolicy: ccmcommon.Unmanaged},
33+
SailOperator: ccmcommon.SailOperatorDependency{ManagementPolicy: ccmcommon.Unmanaged},
34+
}
35+
}
36+
2837
func TestBuildHelmCharts(t *testing.T) {
38+
// expectedReleaseNames is the hardcoded ground truth for chart names and order.
39+
// Update this list when adding or removing a chart.
40+
expectedReleaseNames := []string{
41+
"gateway-api",
42+
"cert-manager-operator",
43+
"lws-operator",
44+
"sail-operator",
45+
}
46+
2947
t.Run("returns all charts in order when all managed", func(t *testing.T) {
3048
g := NewWithT(t)
3149

32-
deps := ccmcommon.Dependencies{
33-
CertManager: ccmcommon.CertManagerDependency{ManagementPolicy: ccmcommon.Managed},
34-
LWS: ccmcommon.LWSDependency{ManagementPolicy: ccmcommon.Managed},
35-
SailOperator: ccmcommon.SailOperatorDependency{ManagementPolicy: ccmcommon.Managed},
36-
}
50+
original := DefaultChartsPath
51+
DefaultChartsPath = "/test/charts"
52+
t.Cleanup(func() { DefaultChartsPath = original })
3753

38-
charts := BuildHelmCharts(deps)
54+
// Zero-value ManagementPolicy ("") is not "Unmanaged", so all charts are returned.
55+
// In practice, kubebuilder defaults ManagementPolicy to "Managed".
56+
charts := BuildHelmCharts(ccmcommon.Dependencies{})
3957

40-
g.Expect(charts).To(HaveLen(3))
41-
g.Expect(charts[0].ReleaseName).To(Equal("cert-manager-operator"))
42-
g.Expect(charts[1].ReleaseName).To(Equal("lws-operator"))
43-
g.Expect(charts[2].ReleaseName).To(Equal("sail-operator"))
58+
g.Expect(charts).To(HaveLen(len(expectedReleaseNames)))
59+
for i, name := range expectedReleaseNames {
60+
g.Expect(charts[i].ReleaseName).To(Equal(name))
61+
g.Expect(charts[i].Chart).To(Equal(filepath.Join("/test/charts", name)))
62+
}
4463
})
4564

4665
t.Run("excludes unmanaged charts and preserves order", func(t *testing.T) {
4766
g := NewWithT(t)
4867

49-
deps := ccmcommon.Dependencies{
50-
CertManager: ccmcommon.CertManagerDependency{ManagementPolicy: ccmcommon.Unmanaged},
51-
LWS: ccmcommon.LWSDependency{ManagementPolicy: ccmcommon.Managed},
52-
SailOperator: ccmcommon.SailOperatorDependency{ManagementPolicy: ccmcommon.Unmanaged},
53-
}
68+
deps := getAllUnmanagedDependencies()
69+
deps.LWS.ManagementPolicy = ccmcommon.Managed
5470

5571
charts := BuildHelmCharts(deps)
5672

@@ -61,47 +77,10 @@ func TestBuildHelmCharts(t *testing.T) {
6177
t.Run("returns empty slice when all unmanaged", func(t *testing.T) {
6278
g := NewWithT(t)
6379

64-
deps := ccmcommon.Dependencies{
65-
CertManager: ccmcommon.CertManagerDependency{ManagementPolicy: ccmcommon.Unmanaged},
66-
LWS: ccmcommon.LWSDependency{ManagementPolicy: ccmcommon.Unmanaged},
67-
SailOperator: ccmcommon.SailOperatorDependency{ManagementPolicy: ccmcommon.Unmanaged},
68-
}
80+
deps := getAllUnmanagedDependencies()
6981

7082
charts := BuildHelmCharts(deps)
7183

7284
g.Expect(charts).To(BeEmpty())
7385
})
74-
75-
t.Run("keeps charts when ManagementPolicy is zero value", func(t *testing.T) {
76-
g := NewWithT(t)
77-
78-
deps := ccmcommon.Dependencies{} // All zero values
79-
80-
charts := BuildHelmCharts(deps)
81-
82-
// Zero-value ManagementPolicy ("") is not "Unmanaged", so charts remain.
83-
// In practice, kubebuilder defaults ManagementPolicy to "Managed".
84-
g.Expect(charts).To(HaveLen(3))
85-
})
86-
87-
t.Run("chart paths use DefaultChartsPath", func(t *testing.T) {
88-
g := NewWithT(t)
89-
90-
original := DefaultChartsPath
91-
DefaultChartsPath = "/test/charts"
92-
t.Cleanup(func() { DefaultChartsPath = original })
93-
94-
deps := ccmcommon.Dependencies{
95-
CertManager: ccmcommon.CertManagerDependency{ManagementPolicy: ccmcommon.Managed},
96-
LWS: ccmcommon.LWSDependency{ManagementPolicy: ccmcommon.Managed},
97-
SailOperator: ccmcommon.SailOperatorDependency{ManagementPolicy: ccmcommon.Managed},
98-
}
99-
100-
charts := BuildHelmCharts(deps)
101-
102-
g.Expect(charts).To(HaveLen(3))
103-
g.Expect(charts[0].Chart).To(Equal(filepath.Join("/test/charts", "cert-manager-operator")))
104-
g.Expect(charts[1].Chart).To(Equal(filepath.Join("/test/charts", "lws-operator")))
105-
g.Expect(charts[2].Chart).To(Equal(filepath.Join("/test/charts", "sail-operator")))
106-
})
10786
}

0 commit comments

Comments
 (0)