Fix: patchOutputs bug for multiple outputs (#5101)

Signed-off-by: Somefive <yd219913@alibaba-inc.com>

Signed-off-by: Somefive <yd219913@alibaba-inc.com>
This commit is contained in:
Somefive
2022-11-22 10:52:49 +08:00
committed by GitHub
parent 139009546c
commit 8252b1eada
2 changed files with 56 additions and 3 deletions
+2 -3
View File
@@ -365,10 +365,9 @@ func (td *traitDef) Complete(ctx process.Context, abstractTemplate string, param
for _, auxiliary := range auxiliaries {
target := outputsPatcher.LookupPath(value.FieldPath(auxiliary.Name))
if !target.Exists() {
return errors.WithMessagef(err, "trait=%s, to=%s, invalid patch trait into auxiliary workload", td.name, auxiliary.Name)
continue
}
patcher := outputsPatcher.LookupPath(value.FieldPath(auxiliary.Name))
if err := auxiliary.Ins.Unify(patcher); err != nil {
if err = auxiliary.Ins.Unify(target); err != nil {
return errors.WithMessagef(err, "trait=%s, to=%s, invalid patch trait into auxiliary workload", td.name, auxiliary.Name)
}
}
+54
View File
@@ -1480,3 +1480,57 @@ if len(context.outputs.ingress.status.loadBalancer.ingress) == 0 {
assert.Equal(t, ca.expMessage, gotMessage, message)
}
}
func TestTraitPatchSingleOutput(t *testing.T) {
baseTemplate := `
output: {
apiVersion: "apps/v1"
kind: "Deployment"
spec: selector: matchLabels: "app.oam.dev/component": context.name
}
outputs: gameconfig: {
apiVersion: "v1"
kind: "ConfigMap"
metadata: name: context.name + "game-config"
data: {}
}
outputs: sideconfig: {
apiVersion: "v1"
kind: "ConfigMap"
metadata: name: context.name + "side-config"
data: {}
}
parameter: {}
`
traitTemplate := `
patchOutputs: sideconfig: data: key: "val"
parameter: {}
`
ctx := process.NewContext(process.ContextData{
AppName: "myapp",
CompName: "test",
Namespace: "default",
AppRevisionName: "myapp-v1",
})
wt := NewWorkloadAbstractEngine("-", &packages.PackageDiscover{})
if err := wt.Complete(ctx, baseTemplate, map[string]interface{}{}); err != nil {
t.Error(err)
return
}
td := NewTraitAbstractEngine("single-patch", &packages.PackageDiscover{})
r := require.New(t)
err := td.Complete(ctx, traitTemplate, map[string]string{})
r.NoError(err)
base, assists := ctx.Output()
r.NotNil(base)
r.Equal(2, len(assists))
got, err := assists[1].Ins.Unstructured()
r.NoError(err)
val, ok, err := unstructured.NestedString(got.Object, "data", "key")
r.NoError(err)
r.True(ok)
r.Equal("val", val)
}