Skip to content

Commit 4476a5b

Browse files
authored
Merge pull request #125 from truongnht/support-ToEnvironmentFieldPath-in-spec.environment.patches
fix: Add back support for To|FromEnvironmentFieldPath type in environment patches
2 parents 901f6a0 + cf8cbaa commit 4476a5b

File tree

5 files changed

+119
-7
lines changed

5 files changed

+119
-7
lines changed

fn_test.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,114 @@ func TestRunFunction(t *testing.T) {
896896
Context: contextWithEnvironment(map[string]interface{}{
897897
"widgets": "30",
898898
})}}},
899+
"PatchToCompositeSupportsFromEnvironmentFieldPath": {
900+
reason: "A basic FromEnvironmentFieldPath patch should work with environment.patches.",
901+
args: args{
902+
req: &fnv1beta1.RunFunctionRequest{
903+
Input: resource.MustStructObject(&v1beta1.Resources{
904+
Resources: []v1beta1.ComposedTemplate{
905+
{
906+
Name: "cool-resource",
907+
Base: &runtime.RawExtension{Raw: []byte(`{"apiVersion":"example.org/v1","kind":"CD"}`)},
908+
}},
909+
Environment: &v1beta1.Environment{
910+
Patches: []v1beta1.EnvironmentPatch{
911+
{
912+
Type: v1beta1.PatchTypeFromEnvironmentFieldPath,
913+
Patch: v1beta1.Patch{
914+
FromFieldPath: ptr.To[string]("widgets"),
915+
ToFieldPath: ptr.To[string]("spec.watchers"),
916+
Transforms: []v1beta1.Transform{
917+
{
918+
Type: v1beta1.TransformTypeConvert,
919+
Convert: &v1beta1.ConvertTransform{
920+
ToType: v1beta1.TransformIOTypeInt64,
921+
},
922+
},
923+
{
924+
Type: v1beta1.TransformTypeMath,
925+
Math: &v1beta1.MathTransform{
926+
Type: v1beta1.MathTransformTypeMultiply,
927+
Multiply: ptr.To[int64](3),
928+
}}}}}}}}),
929+
Observed: &fnv1beta1.State{
930+
Composite: &fnv1beta1.Resource{
931+
Resource: resource.MustStructJSON(`{"apiVersion":"example.org/v1","kind":"CD","spec":{}}`),
932+
},
933+
Resources: map[string]*fnv1beta1.Resource{},
934+
},
935+
Context: contextWithEnvironment(map[string]interface{}{
936+
"widgets": "10",
937+
})},
938+
},
939+
want: want{
940+
rsp: &fnv1beta1.RunFunctionResponse{
941+
Meta: &fnv1beta1.ResponseMeta{Ttl: durationpb.New(response.DefaultTTL)},
942+
Desired: &fnv1beta1.State{
943+
Composite: &fnv1beta1.Resource{
944+
// spec.watchers = 10 * 3 = 30
945+
Resource: resource.MustStructJSON(`{"apiVersion":"example.org/v1","kind":"CD","spec":{"watchers":30}}`),
946+
},
947+
Resources: map[string]*fnv1beta1.Resource{
948+
"cool-resource": {
949+
Resource: resource.MustStructJSON(`{"apiVersion":"example.org/v1","kind":"CD"}`),
950+
}}},
951+
Context: contextWithEnvironment(map[string]interface{}{
952+
"widgets": "10",
953+
})}}},
954+
"EnvironmentPatchSupportsToEnvironmentFieldPath": {
955+
reason: "ToEnvironmentFieldPath patch should work with environment.patches.",
956+
args: args{
957+
req: &fnv1beta1.RunFunctionRequest{
958+
Input: resource.MustStructObject(&v1beta1.Resources{
959+
Resources: []v1beta1.ComposedTemplate{
960+
{
961+
Name: "cool-resource",
962+
Base: &runtime.RawExtension{Raw: []byte(`{"apiVersion":"example.org/v1","kind":"CD"}`)},
963+
}},
964+
Environment: &v1beta1.Environment{
965+
Patches: []v1beta1.EnvironmentPatch{
966+
{
967+
Type: v1beta1.PatchTypeToEnvironmentFieldPath,
968+
Patch: v1beta1.Patch{
969+
FromFieldPath: ptr.To[string]("spec.watchers"),
970+
ToFieldPath: ptr.To[string]("widgets"),
971+
Transforms: []v1beta1.Transform{
972+
{
973+
Type: v1beta1.TransformTypeMath,
974+
Math: &v1beta1.MathTransform{
975+
Type: v1beta1.MathTransformTypeMultiply,
976+
Multiply: ptr.To[int64](3),
977+
},
978+
},
979+
{
980+
Type: v1beta1.TransformTypeConvert,
981+
Convert: &v1beta1.ConvertTransform{
982+
ToType: v1beta1.TransformIOTypeString,
983+
},
984+
}}}}}}}),
985+
Observed: &fnv1beta1.State{
986+
Composite: &fnv1beta1.Resource{
987+
Resource: resource.MustStructJSON(`{"apiVersion":"example.org/v1","kind":"CD","spec":{"watchers":10}}`),
988+
},
989+
Resources: map[string]*fnv1beta1.Resource{},
990+
},
991+
Context: contextWithEnvironment(nil)},
992+
},
993+
want: want{
994+
rsp: &fnv1beta1.RunFunctionResponse{
995+
Meta: &fnv1beta1.ResponseMeta{Ttl: durationpb.New(response.DefaultTTL)},
996+
Desired: &fnv1beta1.State{
997+
Composite: &fnv1beta1.Resource{
998+
Resource: resource.MustStructJSON(`{"apiVersion":"example.org/v1","kind":"CD"}`),
999+
},
1000+
Resources: map[string]*fnv1beta1.Resource{
1001+
"cool-resource": {
1002+
Resource: resource.MustStructJSON(`{"apiVersion":"example.org/v1","kind":"CD"}`),
1003+
}}},
1004+
Context: contextWithEnvironment(map[string]interface{}{
1005+
"widgets": "30",
1006+
})}}},
8991007
"EnvironmentPatchOptionalNotFoundSkipped": {
9001008
reason: "A basic ToEnvironment patch with optional or not field path policy should be skipped",
9011009
args: args{

input/v1beta1/resources_patches.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ type EnvironmentPatch struct {
109109
// Type sets the patching behaviour to be used. Each patch type may require
110110
// its own fields to be set on the Patch object.
111111
// +optional
112-
// +kubebuilder:validation:Enum=FromCompositeFieldPath;ToCompositeFieldPath;CombineFromComposite;CombineToComposite
112+
// +kubebuilder:validation:Enum=FromCompositeFieldPath;ToCompositeFieldPath;CombineFromComposite;CombineToComposite;FromEnvironmentFieldPath;ToEnvironmentFieldPath
113113
// +kubebuilder:default=FromCompositeFieldPath
114114
Type PatchType `json:"type,omitempty"`
115115

package/input/pt.fn.crossplane.io_resources.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ spec:
371371
- ToCompositeFieldPath
372372
- CombineFromComposite
373373
- CombineToComposite
374+
- FromEnvironmentFieldPath
375+
- ToEnvironmentFieldPath
374376
type: string
375377
type: object
376378
type: array

patches.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,21 +198,21 @@ func ApplyCombineFromVariablesPatch(p PatchInterface, from, to runtime.Object) e
198198
func ApplyEnvironmentPatch(p *v1beta1.EnvironmentPatch, env *unstructured.Unstructured, oxr, dxr *composite.Unstructured) error {
199199
switch p.GetType() {
200200
// From observed XR to environment.
201-
case v1beta1.PatchTypeFromCompositeFieldPath:
201+
case v1beta1.PatchTypeFromCompositeFieldPath,
202+
v1beta1.PatchTypeToEnvironmentFieldPath:
202203
return ApplyFromFieldPathPatch(p, oxr, env)
203204
case v1beta1.PatchTypeCombineFromComposite:
204205
return ApplyCombineFromVariablesPatch(p, oxr, env)
205206

206207
// From environment to desired XR.
207-
case v1beta1.PatchTypeToCompositeFieldPath:
208+
case v1beta1.PatchTypeToCompositeFieldPath,
209+
v1beta1.PatchTypeFromEnvironmentFieldPath:
208210
return ApplyFromFieldPathPatch(p, env, dxr)
209211
case v1beta1.PatchTypeCombineToComposite:
210212
return ApplyCombineFromVariablesPatch(p, env, dxr)
211213

212214
// Invalid patch types in this context.
213-
case v1beta1.PatchTypeFromEnvironmentFieldPath,
214-
v1beta1.PatchTypeCombineFromEnvironment,
215-
v1beta1.PatchTypeToEnvironmentFieldPath,
215+
case v1beta1.PatchTypeCombineFromEnvironment,
216216
v1beta1.PatchTypeCombineToEnvironment:
217217
// Nothing to do.
218218

validate.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ func ValidateEnvironment(e *v1beta1.Environment) *field.Error {
103103
v1beta1.PatchTypeFromCompositeFieldPath,
104104
v1beta1.PatchTypeToCompositeFieldPath,
105105
v1beta1.PatchTypeCombineFromComposite,
106-
v1beta1.PatchTypeCombineToComposite:
106+
v1beta1.PatchTypeCombineToComposite,
107+
v1beta1.PatchTypeFromEnvironmentFieldPath,
108+
v1beta1.PatchTypeToEnvironmentFieldPath:
107109
default:
108110
return field.Invalid(field.NewPath("patches").Index(i).Key("type"), p.GetType(), "invalid environment patch type")
109111
}

0 commit comments

Comments
 (0)