Skip to content

Commit 40f5af6

Browse files
committed
fix: extra-resources
1 parent 50b5716 commit 40f5af6

File tree

2 files changed

+76
-9
lines changed

2 files changed

+76
-9
lines changed

pkg/grpc/handler.go

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ func parseInput(req *fnv1.RunFunctionRequest) (*types.XFuncJSInput, error) {
8787

8888
// prepareResources prepares the resources from the request
8989
type resourceBundle struct {
90-
oxr *resource.Composite
91-
dxr *resource.Composite
92-
observed map[resource.Name]resource.ObservedComposed
93-
desired map[resource.Name]*resource.DesiredComposed
90+
oxr *resource.Composite
91+
dxr *resource.Composite
92+
observed map[resource.Name]resource.ObservedComposed
93+
desired map[resource.Name]*resource.DesiredComposed
94+
extraResources map[string][]resource.Extra
9495
}
9596

9697
func prepareResources(req *fnv1.RunFunctionRequest) (*resourceBundle, error) {
@@ -123,16 +124,17 @@ func prepareResources(req *fnv1.RunFunctionRequest) (*resourceBundle, error) {
123124
}
124125

125126
// Get extra resources
126-
_, err = request.GetExtraResources(req)
127+
extraResources, err := request.GetExtraResources(req)
127128
if err != nil {
128129
return nil, errors.Wrapf(err, "cannot get extra resources from %T", req)
129130
}
130131

131132
return &resourceBundle{
132-
oxr: oxr,
133-
dxr: dxr,
134-
observed: observed,
135-
desired: desired,
133+
oxr: oxr,
134+
dxr: dxr,
135+
observed: observed,
136+
desired: desired,
137+
extraResources: extraResources,
136138
}, nil
137139
}
138140

@@ -153,6 +155,19 @@ func createEnhancedInput(xfuncjsInput *types.XFuncJSInput, resources *resourceBu
153155
},
154156
}
155157

158+
// Add extra resources if present
159+
if len(resources.extraResources) > 0 {
160+
extraResourcesMap := make(map[string]interface{})
161+
for name, extras := range resources.extraResources {
162+
extrasList := make([]interface{}, len(extras))
163+
for i, extra := range extras {
164+
extrasList[i] = extra.Resource.UnstructuredContent()
165+
}
166+
extraResourcesMap[name] = extrasList
167+
}
168+
enhancedInput["extraResources"] = extraResourcesMap
169+
}
170+
156171
// Convert the enhanced input to JSON
157172
enhancedInputJSON, err := json.Marshal(enhancedInput)
158173
if err != nil {
@@ -233,6 +248,21 @@ func buildResponse(rsp *fnv1.RunFunctionResponse, jsResponse *JSResponse, resour
233248
}
234249
}
235250

251+
// Process extra resource requirements if present
252+
if len(jsResponse.ExtraResourceRequirements) > 0 {
253+
extraResources := make(map[string]*fnv1.ResourceSelector)
254+
for name, requirement := range jsResponse.ExtraResourceRequirements {
255+
extraResources[name] = requirement.ToResourceSelector()
256+
log.Debug("Requesting ExtraResources", "name", name, "selector", extraResources[name])
257+
}
258+
259+
// Set requirements in the response
260+
if rsp.Requirements == nil {
261+
rsp.Requirements = &fnv1.Requirements{}
262+
}
263+
rsp.Requirements.ExtraResources = extraResources
264+
}
265+
236266
// Process context data if present
237267
if err := processContext(rsp, jsResponse, log); err != nil {
238268
return err

pkg/grpc/localresource.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,43 @@ type JSResponse struct {
1616
Events []CreateEvent `json:"events,omitempty"`
1717
// Context is a map of context data to add to the response
1818
Context map[string]interface{} `json:"context,omitempty"`
19+
// ExtraResourceRequirements is a map of resource name to resource requirements
20+
ExtraResourceRequirements map[string]ExtraResourceRequirement `json:"extraResourceRequirements,omitempty"`
21+
}
22+
23+
// ExtraResourceRequirement defines a requirement for extra resources
24+
type ExtraResourceRequirement struct {
25+
// APIVersion of the resource
26+
APIVersion string `json:"apiVersion"`
27+
// Kind of the resource
28+
Kind string `json:"kind"`
29+
// MatchLabels defines the labels to match the resource
30+
MatchLabels map[string]string `json:"matchLabels,omitempty"`
31+
// MatchName defines the name to match the resource
32+
MatchName string `json:"matchName,omitempty"`
33+
}
34+
35+
// ToResourceSelector converts the ExtraResourceRequirement to a fnv1.ResourceSelector
36+
func (e *ExtraResourceRequirement) ToResourceSelector() *fnv1.ResourceSelector {
37+
out := &fnv1.ResourceSelector{
38+
ApiVersion: e.APIVersion,
39+
Kind: e.Kind,
40+
}
41+
42+
if e.MatchName == "" && len(e.MatchLabels) > 0 {
43+
out.Match = &fnv1.ResourceSelector_MatchLabels{
44+
MatchLabels: &fnv1.MatchLabels{Labels: e.MatchLabels},
45+
}
46+
return out
47+
}
48+
49+
if e.MatchName != "" {
50+
out.Match = &fnv1.ResourceSelector_MatchName{
51+
MatchName: e.MatchName,
52+
}
53+
}
54+
55+
return out
1956
}
2057

2158
// JSResource represents a resource in the JavaScript function response

0 commit comments

Comments
 (0)