diff --git a/api/filters/fieldspec/fieldspec.go b/api/filters/fieldspec/fieldspec.go index 3811afec9..d728e9ebc 100644 --- a/api/filters/fieldspec/fieldspec.go +++ b/api/filters/fieldspec/fieldspec.go @@ -64,7 +64,7 @@ func (fltr Filter) filter(obj *yaml.RNode) error { // found the field -- set its value return fltr.SetValue(obj) } - if obj.IsTaggedNull() { + if obj.IsTaggedNull() || obj.IsNil() { return nil } switch obj.YNode().Kind { diff --git a/api/internal/target/multitransformer.go b/api/internal/target/multitransformer.go index 8eccb4956..98d6378d5 100644 --- a/api/internal/target/multitransformer.go +++ b/api/internal/target/multitransformer.go @@ -42,6 +42,14 @@ func (o *multiTransformer) transform(m resmap.ResMap) error { return err } } + for _, r := range m.Resources() { + if r.IsEmpty() { + err := m.Remove(r.CurId()) + if err != nil { + return err + } + } + } return nil } diff --git a/api/krusty/multiplepatch_test.go b/api/krusty/multiplepatch_test.go index a093007bc..488c0e437 100644 --- a/api/krusty/multiplepatch_test.go +++ b/api/krusty/multiplepatch_test.go @@ -1213,3 +1213,52 @@ spec: name: server `) } + +// test for #3616 +func TestSmpDeleteOnResource(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteK(".", ` +resources: +- workloads.yaml +patches: +- patch: | + apiVersion: monitoring.coreos.com/v1 + kind: PrometheusRule + metadata: + name: rule1 + $patch: delete +`) + th.WriteF("workloads.yaml", ` +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + labels: + role: alert-rules + name: rule1 +spec: + groups: + - name: rabbitmq.rules +--- +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + labels: + role: alert-rules + name: rule2 +spec: + groups: + - name: rabbitmq.rules +`) + m := th.Run(".", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + labels: + role: alert-rules + name: rule2 +spec: + groups: + - name: rabbitmq.rules +`) +}