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
101179func generateVersionInterfaceMethods (f * jen.File , resourceName , apiPkg , versionSuffix string ) {
102180 // For method
0 commit comments