@@ -30,6 +30,14 @@ func fromYAML(input string) (any, error) {
3030 return output , err
3131}
3232
33+ func getRootComponentVersion (compGetter * ocmcli.ComponentGetter ) * ocmcli.ComponentVersion {
34+ if compGetter == nil {
35+ panic ("ComponentGetter must not be nil" )
36+ }
37+
38+ return compGetter .RootComponentVersion ()
39+ }
40+
3341func getComponentVersionByReference (ctx context.Context , compGetter * ocmcli.ComponentGetter , args ... interface {}) * ocmcli.ComponentVersion {
3442 logger := log .GetLogger ()
3543
@@ -62,6 +70,37 @@ func getComponentVersionByReference(ctx context.Context, compGetter *ocmcli.Comp
6270 return cv
6371}
6472
73+ func getComponentVersionForResource (ctx context.Context , compGetter * ocmcli.ComponentGetter , args ... interface {}) * ocmcli.ComponentVersion {
74+ logger := log .GetLogger ()
75+
76+ if compGetter == nil {
77+ panic ("ComponentGetter must not be nil" )
78+ }
79+
80+ if len (args ) < 1 {
81+ panic ("at least 1 argument is expected" )
82+ }
83+
84+ var err error
85+ parentCv := compGetter .RootComponentVersion ()
86+ referenceName := args [len (args )- 1 ].(string )
87+
88+ if len (args ) == 2 {
89+ parentCv = args [0 ].(* ocmcli.ComponentVersion )
90+ }
91+
92+ logger .Tracef ("Template_Func: getComponentVersionForResource called with parent component version: %s and reference name: %s" , parentCv .Component .Name , referenceName )
93+
94+ cv , err := compGetter .GetComponentVersionForResourceRecursive (ctx , parentCv , referenceName )
95+ if err != nil || cv == nil {
96+ if err != nil {
97+ logger .Errorf ("Template_Func: getComponentVersionForResource error getting component version for resource %s from parent component version %s: %v" , referenceName , parentCv .Component .Name , err )
98+ }
99+ return nil
100+ }
101+ return cv
102+ }
103+
65104func componentVersionAsMap (cv * ocmcli.ComponentVersion ) map [string ]interface {} {
66105 if cv == nil {
67106 return nil
@@ -212,6 +251,10 @@ func (t *TemplateExecution) WithOCMComponentGetter(ctx context.Context, compGett
212251 "getOCMRepository" : func () string {
213252 return getOCMRepository (compGetter )
214253 },
254+ // getRootComponentVersion returns the root ComponentVersion from the ComponentGetter.
255+ "getRootComponentVersion" : func () * ocmcli.ComponentVersion {
256+ return getRootComponentVersion (compGetter )
257+ },
215258 // getComponentVersionByReference returns a ComponentVersion based on the provided reference name.
216259 // It can take either one or two arguments:
217260 // - One argument: the reference name (string). The search starts from the root component version.
@@ -222,6 +265,16 @@ func (t *TemplateExecution) WithOCMComponentGetter(ctx context.Context, compGett
222265 "getComponentVersionByReference" : func (args ... interface {}) * ocmcli.ComponentVersion {
223266 return getComponentVersionByReference (ctx , compGetter , args ... )
224267 },
268+ // getComponentVersionForResource returns a ComponentVersion that contains the specified resource.
269+ // It can take either one or two arguments:
270+ // - One argument: the resource name (string). The search starts from the root component version.
271+ // - Two arguments: the first argument is a ComponentVersion to start the search from, and the second argument is the resource name (string).
272+ // If the ComponentVersion is not found, it returns nil.
273+ // If the ComponentGetter is nil, it panics.
274+ // If the number of arguments is less than 1, it panics.
275+ "getComponentVersionForResource" : func (args ... interface {}) * ocmcli.ComponentVersion {
276+ return getComponentVersionForResource (ctx , compGetter , args ... )
277+ },
225278 // componentVersionAsMap converts a ComponentVersion to a map[string]interface{}.
226279 // If the ComponentVersion is nil, it returns nil.
227280 "componentVersionAsMap" : func (cv * ocmcli.ComponentVersion ) map [string ]interface {} {
0 commit comments