Skip to content

Commit 42cef24

Browse files
scaffolder: generate getDependencies method for versioned halders
1 parent 21170cb commit 42cef24

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

tools/scaffolder/internal/generate/controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func FromConfig(resultPath, crdKind, controllerOutDir, indexerOutDir, typesPath
8080

8181
// Generate version-specific handlers
8282
for _, mapping := range parsedConfig.Mappings {
83-
if err := generateVersionHandlerFile(controllerDir, resourceName, typesPath, mapping, override); err != nil {
83+
if err := generateVersionHandlerFile(controllerDir, resourceName, typesPath, resultPath, mapping, override); err != nil {
8484
return fmt.Errorf("failed to generate handler for version %s: %w", mapping.Version, err)
8585
}
8686
}

tools/scaffolder/internal/generate/versioned_handler.go

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/dave/jennifer/jen"
1010
)
1111

12-
func generateVersionHandlerFile(dir, resourceName, typesPath string, mapping MappingWithConfig, override bool) error {
12+
func generateVersionHandlerFile(dir, resourceName, typesPath, resultPath string, mapping MappingWithConfig, override bool) error {
1313
atlasResourceName := strings.ToLower(resourceName)
1414
versionSuffix := mapping.Version
1515
apiPkg := typesPath
@@ -24,6 +24,11 @@ func generateVersionHandlerFile(dir, resourceName, typesPath string, mapping Map
2424
return nil
2525
}
2626
}
27+
28+
referenceFields, err := ParseReferenceFields(resultPath, resourceName)
29+
if err != nil {
30+
return fmt.Errorf("failed to parse reference fields: %w", err)
31+
}
2732

2833
f := jen.NewFile(atlasResourceName)
2934
AddLicenseHeader(f)
@@ -55,6 +60,9 @@ func generateVersionHandlerFile(dir, resourceName, typesPath string, mapping Map
5560

5661
generateVersionStateHandlers(f, resourceName, apiPkg, versionSuffix)
5762

63+
// Generate getDependencies method to be used in for api translation calls
64+
generateGetDependenciesMethod(f, resourceName, apiPkg, versionSuffix, referenceFields)
65+
5866
// Generate For and SetupWithManager methods to satisfy StateHandler interface
5967
generateVersionInterfaceMethods(f, resourceName, apiPkg, versionSuffix)
6068

@@ -97,6 +105,76 @@ func generateVersionStateHandlers(f *jen.File, resourceName, apiPkg, versionSuff
97105
}
98106
}
99107

108+
// generateGetDependenciesMethod generates the getDependencies method for the version-specific handler
109+
func generateGetDependenciesMethod(f *jen.File, resourceName, apiPkg, versionSuffix string, referenceFields []ReferenceField) {
110+
resourceVarName := strings.ToLower(resourceName)
111+
112+
blockStatements := []jen.Code{
113+
jen.Var().Id("deps").Index().Qual("sigs.k8s.io/controller-runtime/pkg/client", "Object"),
114+
jen.Line(),
115+
}
116+
117+
if len(referenceFields) == 0 {
118+
blockStatements = append(blockStatements, jen.Return(jen.Id("deps"), jen.Nil()))
119+
} else {
120+
for _, ref := range referenceFields {
121+
// No array-based refs
122+
if strings.Contains(ref.FieldPath, ".items.") {
123+
continue
124+
}
125+
126+
fieldAccessPath := strings.Replace(buildFieldAccessPath(ref.FieldPath), "resource", resourceVarName, 1)
127+
128+
refKind := ref.ReferencedKind
129+
refVarName := strings.ToLower(refKind)
130+
131+
// TODO: simplify?
132+
var refPkgQual *jen.Statement
133+
if refKind == "Secret" {
134+
refPkgQual = jen.Qual("k8s.io/api/core/v1", refKind)
135+
} else {
136+
refPkgQual = jen.Qual(apiPkg, refKind)
137+
}
138+
139+
blockStatements = append(blockStatements,
140+
jen.Comment(fmt.Sprintf("Check if %s is present", ref.FieldName)),
141+
jen.If(jen.Id(fieldAccessPath).Op("!=").Nil()).Block(
142+
jen.Id(refVarName).Op(":=").Op("&").Add(refPkgQual).Values(),
143+
jen.Err().Op(":=").Id("h").Dot("kubeClient").Dot("Get").Call(
144+
jen.Id("ctx"),
145+
jen.Qual("sigs.k8s.io/controller-runtime/pkg/client", "ObjectKey").Values(jen.Dict{
146+
jen.Id("Name"): jen.Id(fieldAccessPath).Dot("Name"),
147+
jen.Id("Namespace"): jen.Id(resourceVarName).Dot("GetNamespace").Call(),
148+
}),
149+
jen.Id(refVarName),
150+
),
151+
jen.If(jen.Err().Op("!=").Nil()).Block(
152+
jen.Return(jen.Id("deps"), jen.Qual("fmt", "Errorf").Call(
153+
jen.Lit(fmt.Sprintf("failed to get %s %%s/%%s: %%w", refKind)),
154+
jen.Id(resourceVarName).Dot("GetNamespace").Call(),
155+
jen.Id(fieldAccessPath).Dot("Name"),
156+
jen.Err(),
157+
)),
158+
),
159+
jen.Line(),
160+
jen.Id("deps").Op("=").Append(jen.Id("deps"), jen.Id(refVarName)),
161+
),
162+
jen.Line(),
163+
)
164+
}
165+
166+
blockStatements = append(blockStatements, jen.Return(jen.Id("deps"), jen.Nil()))
167+
}
168+
169+
f.Func().Params(jen.Id("h").Op("*").Id("Handler"+versionSuffix)).Id("getDependencies").Params(
170+
jen.Id("ctx").Qual("context", "Context"),
171+
jen.Id(resourceVarName).Op("*").Qual(apiPkg, resourceName),
172+
).Params(
173+
jen.Index().Qual("sigs.k8s.io/controller-runtime/pkg/client", "Object"),
174+
jen.Error(),
175+
).Block(blockStatements...)
176+
}
177+
100178
// generateVersionInterfaceMethods generates For and SetupWithManager methods for version-specific handlers
101179
func generateVersionInterfaceMethods(f *jen.File, resourceName, apiPkg, versionSuffix string) {
102180
// For method

0 commit comments

Comments
 (0)