Files
kustomize/kyaml/yaml/merge3/element_test.go
Natasha Sarkar 155c42679c cleaned comments
2020-11-09 20:17:51 -08:00

1544 lines
24 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package merge3_test
//nolint:lll
var elementTestCases = []testCase{
//
// Test Case
//
{
description: `Add an element to an existing list`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:1
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:1
- name: baz
image: baz:2
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:1
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:1
- image: baz:2
name: baz
`},
//
// Test Case
//
{
description: `Add an element to a non-existing list`,
origin: `
apiVersion: apps/v1
kind: Deployment`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
local: `
apiVersion: apps/v1
kind: Deployment
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: foo:bar
name: foo
`},
{
description: `Add an element to a non-existing list, existing in dest`,
origin: `
apiVersion: apps/v1
kind: Deployment`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: baz
image: baz:bar
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: baz
image: baz:bar
- image: foo:bar
name: foo
`},
//
// Test Case
// TODO(pwittrock): Figure out if there is something better we can do here
// This element is missing from the destination -- only the new fields are added
{
description: `Add a field to the element, element missing from dest`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command:
- run.sh
`,
local: `
apiVersion: apps/v1
kind: Deployment
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- command:
- run.sh
name: foo
`},
//
// Test Case
//
{
description: `Update a field on the elem, element missing from the dest`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command:
- run.sh
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command:
- run2.sh
`,
local: `
apiVersion: apps/v1
kind: Deployment
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- command:
- run2.sh
name: foo
`},
//
// Test Case
//
{
description: `Update a field on the elem, element present in the dest`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`},
//
// Test Case
//
{description: `Add a field on the elem, element present in the dest`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`},
//
// Test Case
//
{
description: `Add a field on the elem, element and field present in the dest`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`},
//
// Test Case
//
{
description: `Ignore an element`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers: null
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers: null
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`},
//
// Test Case
//
{
description: `Leave deleted`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
`,
local: `
apiVersion: apps/v1
kind: Deployment
`,
expected: `
apiVersion: apps/v1
kind: Deployment
`},
//
// Test Case
//
{
description: `Remove an element -- matching`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`},
//
// Test Case
//
{
description: `Remove an element -- field missing from update`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`},
//
// Test Case
//
{
description: `Remove an element -- element missing`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
- name: baz
image: baz:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
- name: baz
image: baz:bar
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`},
//
// Test Case
//
{
description: `Remove an element -- empty containers`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers: null
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`},
//
// Test Case
//
{
description: `Remove an element -- missing list field`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run.sh']
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec: {}
`},
//
// Test Case
//
{
description: `infer merge keys merge'`,
origin: `
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
`,
update: `
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
command: ['run2.sh']
`,
local: `
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
expected: `
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`,
infer: true,
},
//
// Test Case
//
{
description: `no infer merge keys merge using schema`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
command: ['run2.sh']
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
image: foo:bar
command: ['run2.sh']
`,
infer: false,
},
//
// Test Case
//
{
description: `no infer merge keys merge using explicit schema as line comment'`,
origin: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
`,
update: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
command: ['run2.sh']
`,
local: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
containers: # {"items":{"$ref": "#/definitions/io.k8s.api.core.v1.Container"},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy": "merge"}
- name: foo # hell ow
image: foo:bar
`,
expected: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
containers: # {"items":{"$ref": "#/definitions/io.k8s.api.core.v1.Container"},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy": "merge"}
- name: foo # hell ow
image: foo:bar
command: ['run2.sh']
`,
infer: false,
},
//
// Test Case
//
{
description: `no infer merge keys merge using explicit schema as head comment'`,
origin: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
`,
update: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
containers:
- name: foo
command: ['run2.sh']
`,
local: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
# {"items":{"$ref": "#/definitions/io.k8s.api.core.v1.Container"},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy": "merge"}
containers:
- name: foo # hell ow
image: foo:bar
`,
expected: `
apiVersion: custom
kind: Deployment
spec:
template:
spec:
# {"items":{"$ref": "#/definitions/io.k8s.api.core.v1.Container"},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy": "merge"}
containers:
- name: foo # hell ow
image: foo:bar
command: ['run2.sh']
`,
infer: false,
},
//
// Test Case
//
{
description: `no infer merge keys merge using explicit schema to parent field'`,
origin: `
apiVersion: custom
kind: Deployment
spec:
containers:
- name: foo
`,
update: `
apiVersion: custom
kind: Deployment
spec:
containers:
- name: foo
command: ['run2.sh']
`,
local: `
apiVersion: custom
kind: Deployment
spec: # {"$ref":"#/definitions/io.k8s.api.core.v1.PodSpec"}
containers:
- name: foo # hell ow
image: foo:bar
`,
expected: `
apiVersion: custom
kind: Deployment
spec: # {"$ref":"#/definitions/io.k8s.api.core.v1.PodSpec"}
containers:
- name: foo # hell ow
image: foo:bar
command: ['run2.sh']
`,
infer: false,
},
//
// Test Case
//
{
description: `no infer merge keys merge using explicit schema to parent field header'`,
origin: `
apiVersion: custom
kind: Deployment
spec:
containers:
- name: foo
`,
update: `
apiVersion: custom
kind: Deployment
spec:
containers:
- name: foo
command: ['run2.sh']
`,
local: `
apiVersion: custom
kind: Deployment
# {"$ref":"#/definitions/io.k8s.api.core.v1.PodSpec"}
spec:
containers:
- name: foo # hell ow
image: foo:bar
`,
expected: `
apiVersion: custom
kind: Deployment
# {"$ref":"#/definitions/io.k8s.api.core.v1.PodSpec"}
spec:
containers:
- name: foo # hell ow
image: foo:bar
command: ['run2.sh']
`,
infer: false,
},
// The following test cases are regression tests
// that should not be broken as a result of
// #3111, #3159
//
// Test Case
//
{
description: `Add a containerPort to an existing list`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
- containerPort: 80
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
- containerPort: 80
`},
//
// Test Case
//
{
description: `Add a containerPort to a non-existing list, existing in dest`,
origin: `
apiVersion: apps/v1
kind: Deployment`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 80
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 80
- containerPort: 8080
`},
//
// Test Case
//
{
description: `Add a name to containerPort`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
name: 8080-port-update
- containerPort: 80
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
- containerPort: 80
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
name: 8080-port-update
- containerPort: 80
`},
//
// Test Case
//
{
description: `Update protocol for a port`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
`,
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
`},
//
// Test Case
//
{
description: `Append container port`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
`,
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 80
protocol: HTTP
`,
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 80
protocol: HTTP
- containerPort: 8080
protocol: TCP
`},
{
description: `Update container-port name`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
name: foo
`,
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
name: bar
`,
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
name: foo
`,
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
name: bar
`},
//
// Test Case
//
{
description: `Add a containerPort with protocol to an existing list`,
origin: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
- containerPort: 8080
protocol: TCP
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
- containerPort: 8080
protocol: TCP
`},
//
// Test Case
//
{
description: `Add a containerPort with protocol to a non-existing list, existing in dest`,
origin: `
apiVersion: apps/v1
kind: Deployment`,
update: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
local: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
`,
expected: `
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 8080
protocol: UDP
`},
//
// Test Case
//
{
description: `Merge with name for same container-port`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
name: original
`,
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
name: original
- containerPort: 8080
protocol: TCP
name: updated
`,
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
name: original
- containerPort: 8080
protocol: HTTP
name: local
`,
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
name: original
- containerPort: 8080
protocol: HTTP
name: local
- containerPort: 8080
name: updated
protocol: TCP
`},
{
description: `Retain local protocol`,
origin: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: UDP
`,
update: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: TCP
`,
local: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: HTTP
`,
expected: `
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
spec:
containers:
- image: test-image
name: test-deployment
ports:
- containerPort: 8080
protocol: HTTP
- containerPort: 8080
protocol: TCP
`},
}