Use OpenAPI when merging (3way) resources

- When merging (3way) resources use the patch strategy from the openAPI if the definition exists for the field
- Allow disabling of guessing patch strategy merge keys when no definition exists
- Support defining strategy and key directly on configuration fields through line and header coments
- Support attaching schema to parent fields of lists, and propagating -- e.g. that a field is a PodTemplate
This commit is contained in:
Phillip Wittrock
2020-02-27 10:08:40 -08:00
parent 8991b193c6
commit 5d1a0346b5
24 changed files with 991 additions and 507 deletions

View File

@@ -7,267 +7,267 @@ var mapTestCases = []testCase{
//
// Test Case
//
{`Add the annotations map field`,
`
{description: `Add the annotations map field`,
origin: `
kind: Deployment`,
`
update: `
kind: Deployment
metadata:
annotations:
d: e # add these annotations
`,
`
local: `
kind: Deployment`,
`
expected: `
kind: Deployment
metadata:
annotations:
d: e # add these annotations`, nil},
d: e # add these annotations`},
//
// Test Case
//
{`Add an annotation to the field`,
`
{description: `Add an annotation to the field`,
origin: `
kind: Deployment
metadata:
annotations:
a: b`,
`
update: `
kind: Deployment
metadata:
annotations:
a: b
d: e # add these annotations`,
`
local: `
kind: Deployment
metadata:
annotations:
g: h # keep these annotations`,
`
expected: `
kind: Deployment
metadata:
annotations:
g: h # keep these annotations
d: e # add these annotations`, nil},
d: e # add these annotations`},
//
// Test Case
//
{`Add an annotation to the field, field missing from dest`,
`
{description: `Add an annotation to the field, field missing from dest`,
origin: `
kind: Deployment
metadata:
annotations:
a: b # ignored because unchanged`,
`
update: `
kind: Deployment
metadata:
annotations:
a: b # ignore because unchanged
d: e`,
`
local: `
kind: Deployment`,
`
expected: `
kind: Deployment
metadata:
annotations:
d: e`, nil},
d: e`},
//
// Test Case
//
{`Update an annotation on the field, field messing rom the dest`,
`
{description: `Update an annotation on the field, field messing rom the dest`,
origin: `
kind: Deployment
metadata:
annotations:
a: b
d: c`,
`
update: `
kind: Deployment
metadata:
annotations:
a: b
d: e # set these annotations`,
`
local: `
kind: Deployment
metadata:
annotations:
g: h # keep these annotations`,
`
expected: `
kind: Deployment
metadata:
annotations:
g: h # keep these annotations
d: e # set these annotations`, nil},
d: e # set these annotations`},
//
// Test Case
//
{`Add an annotation to the field, field missing from dest`,
`
{description: `Add an annotation to the field, field missing from dest`,
origin: `
kind: Deployment
metadata:
annotations:
a: b # ignored because unchanged`,
`
update: `
kind: Deployment
metadata:
annotations:
a: b # ignore because unchanged
d: e`,
`
local: `
kind: Deployment`,
`
expected: `
kind: Deployment
metadata:
annotations:
d: e`, nil},
d: e`},
//
// Test Case
//
{`Remove an annotation`,
`
{description: `Remove an annotation`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
a: b`,
`
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {}`,
`
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
c: d
a: b`,
`
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
c: d`, nil},
c: d`},
//
// Test Case
//
// TODO(#36) support ~annotations~: {} deletion
{`Specify a field as empty that isn't present in the source`,
`
{description: `Specify a field as empty that isn't present in the source`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo`,
`
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
annotations: null`,
`
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
annotations:
a: b`,
`
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo`, nil},
name: foo`},
//
// Test Case
//
{`Remove an annotation`,
`
{description: `Remove an annotation`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
a: b`,
`
update: `
apiVersion: apps/v1
kind: Deployment`,
`
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
c: d
a: b`,
`
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
c: d`, nil},
c: d`},
//
// Test Case
//
{`Remove annotations field`,
`
{description: `Remove annotations field`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
a: b`,
`
update: `
apiVersion: apps/v1
kind: Deployment`,
`
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo`,
`
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
`, nil},
`},
//
// Test Case
//
{`Remove annotations field, but keep in dest`,
`
{description: `Remove annotations field, but keep in dest`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
a: b`,
`
update: `
apiVersion: apps/v1
kind: Deployment`,
`
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
annotations:
foo: bar # keep this annotation even though the parent field was removed`,
`
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
annotations:
foo: bar # keep this annotation even though the parent field was removed`, nil},
foo: bar # keep this annotation even though the parent field was removed`},
//
// Test Case
//
{`Remove annotations, but they are already empty`,
`
{description: `Remove annotations, but they are already empty`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
@@ -275,24 +275,24 @@ metadata:
annotations:
a: b
`,
`
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
`,
`
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
annotations: {}
`,
`
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
annotations: {}
`, nil},
`},
}