Files
kustomize/kyaml/kio/tree_test.go
Karl Isenberg 43868688d5 Use require for Error and NoError
Assert keeps going after failure, but require immediately fails
the tests, making it easier to find the output related to the test
failure, rather than having to comb through a bunch of subsequent
assertion failures. For equality tests, we may or may not want to
continue, but for error checks we almost always want to immediately
fail the test. Exceptions can be changed as-needed.
2024-03-20 13:19:18 -07:00

581 lines
12 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package kio_test
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
. "sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/yaml"
)
func TestPrinter_Write_Package_Structure(t *testing.T) {
in := `kind: Deployment
metadata:
labels:
app: nginx3
name: foo
namespace: default
annotations:
app: nginx3
config.kubernetes.io/path: foo-package/3/f3.yaml
spec:
replicas: 1
---
kind: Deployment
metadata:
labels:
app: nginx2
name: foo
namespace: default
annotations:
app: nginx2
config.kubernetes.io/path: foo-package/f1.yaml
spec:
replicas: 1
---
kind: Deployment
metadata:
labels:
app: nginx
annotations:
app: nginx
config.kubernetes.io/path: bar-package/f2.yaml
name: bar
spec:
replicas: 3
---
kind: Service
metadata:
name: foo
namespace: default
annotations:
app: nginx
config.kubernetes.io/path: foo-package/f1.yaml
spec:
selector:
app: nginx
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
}.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `
├── bar-package
│ └── [f2.yaml] Deployment bar
└── foo-package
├── [f1.yaml] Deployment default/foo
├── [f1.yaml] Service default/foo
└── 3
└── [f3.yaml] Deployment default/foo
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_Write_Package_Structure_base(t *testing.T) {
in := `kind: Deployment
metadata:
labels:
app: nginx3
name: foo
namespace: default
annotations:
app: nginx3
config.kubernetes.io/path: f3.yaml
spec:
replicas: 1
---
kind: Deployment
metadata:
labels:
app: nginx2
name: foo
namespace: default
annotations:
app: nginx2
config.kubernetes.io/path: foo-package/f1.yaml
spec:
replicas: 1
---
kind: Deployment
metadata:
labels:
app: nginx
annotations:
app: nginx
config.kubernetes.io/package:
config.kubernetes.io/path: bar-package/f2.yaml
name: bar
spec:
replicas: 3
---
kind: Service
metadata:
name: foo
namespace: default
annotations:
app: nginx
config.kubernetes.io/package: .
config.kubernetes.io/path: f1.yaml
spec:
selector:
app: nginx
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
}.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `
├── [f1.yaml] Service default/foo
├── [f3.yaml] Deployment default/foo
├── bar-package
│ └── [f2.yaml] Deployment bar
└── foo-package
└── [f1.yaml] Deployment default/foo
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_Write_Package_Structure_sort(t *testing.T) {
in := `apiVersion: extensions/v1
kind: Deployment
metadata:
labels:
app: nginx2
name: foo3
namespace: default
annotations:
app: nginx2
config.kubernetes.io/path: f1.yaml
spec:
replicas: 1
---
apiVersion: extensions/v1
kind: Deployment
metadata:
labels:
app: nginx2
name: foo3
namespace: default
annotations:
app: nginx2
config.kubernetes.io/path: f1.yaml
spec:
replicas: 1
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx2
name: foo3
namespace: default
annotations:
app: nginx2
config.kubernetes.io/path: f1.yaml
spec:
replicas: 1
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx2
name: foo2
namespace: default2
annotations:
app: nginx2
config.kubernetes.io/path: f1.yaml
spec:
replicas: 1
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx3
name: foo
namespace: default
annotations:
app: nginx3
config.kubernetes.io/path: f1.yaml
spec:
replicas: 1
---
kind: Deployment
metadata:
labels:
app: nginx
annotations:
app: nginx
config.kubernetes.io/path: bar-package/f2.yaml
name: bar
spec:
replicas: 3
---
kind: Service
metadata:
name: foo
namespace: default
annotations:
app: nginx
config.kubernetes.io/path: f1.yaml
spec:
selector:
app: nginx
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
}.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `
├── [f1.yaml] Deployment default/foo
├── [f1.yaml] Service default/foo
├── [f1.yaml] Deployment default/foo3
├── [f1.yaml] Deployment default/foo3
├── [f1.yaml] Deployment default/foo3
├── [f1.yaml] Deployment default2/foo2
└── bar-package
└── [f2.yaml] Deployment bar
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_metaError(t *testing.T) {
out := &bytes.Buffer{}
err := TreeWriter{Writer: out}.Write([]*yaml.RNode{{}})
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_Write_Graph_Structure(t *testing.T) {
in := `
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-0
namespace: myapp-staging
ownerReferences:
- apiVersion: apps/v1
kind: StatefulSet
name: cockroachdb
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-1
namespace: myapp-staging
ownerReferences:
- apiVersion: apps/v1
kind: StatefulSet
name: cockroachdb
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-2
namespace: myapp-staging
ownerReferences:
- apiVersion: apps/v1
kind: StatefulSet
name: cockroachdb
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.0
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cockroachdb
namespace: myapp-staging
ownerReferences:
- apiVersion: app.k8s.io/v1beta1
kind: Application
name: myapp
spec:
replicas: 3
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Service
metadata:
name: cockroachdb
namespace: myapp-staging
ownerReferences:
- apiVersion: app.k8s.io/v1beta1
kind: Application
name: myapp
---
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
labels:
app.kubernetes.io/name: myapp
name: myapp
namespace: myapp-staging
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructureGraph}},
}.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `.
└── [Resource] Application myapp-staging/myapp
├── [Resource] Service myapp-staging/cockroachdb
└── [Resource] StatefulSet myapp-staging/cockroachdb
├── [Resource] Pod myapp-staging/cockroachdb-0
├── [Resource] Pod myapp-staging/cockroachdb-1
└── [Resource] Pod myapp-staging/cockroachdb-2
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_Write_Structure_Defaulting_when_ownerRefs_present(t *testing.T) {
in := `
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-0
namespace: myapp-staging
ownerReferences:
- apiVersion: apps/v1
kind: StatefulSet
name: cockroachdb
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-1
namespace: myapp-staging
ownerReferences:
- apiVersion: apps/v1
kind: StatefulSet
name: cockroachdb
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-2
namespace: myapp-staging
ownerReferences:
- apiVersion: apps/v1
kind: StatefulSet
name: cockroachdb
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.0
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cockroachdb
namespace: myapp-staging
ownerReferences:
- apiVersion: app.k8s.io/v1beta1
kind: Application
name: myapp
spec:
replicas: 3
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Service
metadata:
name: cockroachdb
namespace: myapp-staging
ownerReferences:
- apiVersion: app.k8s.io/v1beta1
kind: Application
name: myapp
---
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
labels:
app.kubernetes.io/name: myapp
name: myapp
namespace: myapp-staging
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out}}, // Structure unspecified
}.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `.
└── [Resource] Application myapp-staging/myapp
├── [Resource] Service myapp-staging/cockroachdb
└── [Resource] StatefulSet myapp-staging/cockroachdb
├── [Resource] Pod myapp-staging/cockroachdb-0
├── [Resource] Pod myapp-staging/cockroachdb-1
└── [Resource] Pod myapp-staging/cockroachdb-2
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_Write_Structure_Defaulting_when_ownerRefs_absent(t *testing.T) {
in := `
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-0
namespace: myapp-staging
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-1
namespace: myapp-staging
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Pod
metadata:
name: cockroachdb-2
namespace: myapp-staging
spec:
containers:
- name: cockroachdb
image: cockraochdb:1.1.0
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cockroachdb
namespace: myapp-staging
spec:
replicas: 3
containers:
- name: cockroachdb
image: cockraochdb:1.1.1
---
apiVersion: v1
kind: Service
metadata:
name: cockroachdb
namespace: myapp-staging
---
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
labels:
app.kubernetes.io/name: myapp
name: myapp
namespace: myapp-staging
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out}}, // Structure unspecified
}.Execute()
if !assert.NoError(t, err) {
t.FailNow()
}
if !assert.Equal(t, `
├── [.] Service myapp-staging/cockroachdb
├── [.] StatefulSet myapp-staging/cockroachdb
├── [.] Pod myapp-staging/cockroachdb-0
├── [.] Pod myapp-staging/cockroachdb-1
├── [.] Pod myapp-staging/cockroachdb-2
└── [.] Application myapp-staging/myapp
`, out.String()) {
t.FailNow()
}
}
func TestPrinter_Write_error_when_owner_missing(t *testing.T) {
in := `
---
apiVersion: v1
kind: Service
metadata:
name: cockroachdb
namespace: myapp-staging
ownerReferences:
- apiVersion: app.k8s.io/v1beta1
kind: Application
name: nginx
---
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
labels:
app.kubernetes.io/name: myapp
name: myapp
namespace: myapp-staging
`
out := &bytes.Buffer{}
err := Pipeline{
Inputs: []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
Outputs: []Writer{TreeWriter{Writer: out}},
}.Execute()
require.Error(t, err)
assert.Equal(t, "owner 'Application myapp-staging/nginx' not found in input, but found as an owner of input objects", err.Error())
}