Documentation

Overview

The package provide functions that allows to compare set of Kubernetes resources using the logic equivalent to `kubectl diff`.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func CreateTwoWayMergePatch

func CreateTwoWayMergePatch(orig, new, dataStruct interface{}) ([]byte, bool, error)

CreateTwoWayMergePatch is a helper to construct a two-way merge patch from objects (instead of bytes)

func GetLastAppliedConfigAnnotation

func GetLastAppliedConfigAnnotation(live *unstructured.Unstructured) *unstructured.Unstructured

func HideSecretData

HideSecretData replaces secret data values in specified target, live secrets and in last applied configuration of live secret with stars. Also preserves differences between target, live and last applied config values. E.g. if all three are equal the values would be replaced with same number of stars. If all the are different then number of stars in replacement should be different.

func Normalize

func Normalize(un *unstructured.Unstructured, normalizer Normalizer, options DiffOptions)

func NormalizeSecret

func NormalizeSecret(un *unstructured.Unstructured)

NormalizeSecret mutates the supplied object and encodes stringData to data, and converts nils to empty strings. If the object is not a secret, or is an invalid secret, then returns the same object.

func PrintDiff

func PrintDiff(name string, live *unstructured.Unstructured, target *unstructured.Unstructured) error

PrintDiff prints a diff between two unstructured objects to stdout using an external diff utility Honors the diff utility set in the KUBECTL_EXTERNAL_DIFF environment variable

Types

type DiffOptions

type DiffOptions struct {
	// If set to true then differences caused by aggregated roles in RBAC resources are ignored.
	IgnoreAggregatedRoles bool `json:"ignoreAggregatedRoles,omitempty"`
}

Holds diffing settings

func GetDefaultDiffOptions

func GetDefaultDiffOptions() DiffOptions

Returns the default diff options

type DiffResult

type DiffResult struct {
	// Modified is set to true if resources are not matching
	Modified bool
	// Contains YAML representation of a live resource with applied normalizations
	NormalizedLive []byte
	// Contains "expected" YAML representation of a live resource
	PredictedLive []byte
}

Holds diffing result of two resources

func Diff

func Diff(config, live *unstructured.Unstructured, normalizer Normalizer, options DiffOptions) (*DiffResult, error)

Diff performs a diff on two unstructured objects. If the live object happens to have a "kubectl.kubernetes.io/last-applied-configuration", then perform a three way diff.

Example

Code:

expectedResource := unstructured.Unstructured{}
if err := yaml.Unmarshal([]byte(`
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - image: nginx:1.7.9
    name: nginx
    resources:
      requests:
        cpu: 0.2
`), &expectedResource); err != nil {
	panic(err)
}

liveResource := unstructured.Unstructured{}
if err := yaml.Unmarshal([]byte(`
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-123
  creationTimestamp: "2020-03-30T21:34:59Z"
  labels:
    pod-template-hash: 84bf9649fd
  name: argo-cd-cli-84bf9649fd-tm59q
  resourceVersion: "233081332"
  uid: 9a5ae31a-eed2-4f82-81fe-833799c54f99
spec:
  containers:
  - image: nginx:1.7.9
    name: nginx
    resources:
      requests:
        cpu: 0.1
`), &liveResource); err != nil {
	panic(err)
}
diff, err := Diff(&expectedResource, &liveResource, GetNoopNormalizer(), GetDefaultDiffOptions())
if err != nil {
	panic(err)
}
if diff.Modified {
	println("Resources are different")
}

func ThreeWayDiff

func ThreeWayDiff(orig, config, live *unstructured.Unstructured) (*DiffResult, error)

ThreeWayDiff performs a diff with the understanding of how to incorporate the last-applied-configuration annotation in the diff. Inputs are assumed to be stripped of type information

func TwoWayDiff

func TwoWayDiff(config, live *unstructured.Unstructured) (*DiffResult, error)

TwoWayDiff performs a three-way diff and uses specified config as a recently applied config

type DiffResultList

type DiffResultList struct {
	Diffs    []DiffResult
	Modified bool
}

Holds result of two resources sets comparison

func DiffArray

func DiffArray(configArray, liveArray []*unstructured.Unstructured, normalizer Normalizer, options DiffOptions) (*DiffResultList, error)

DiffArray performs a diff on a list of unstructured objects. Objects are expected to match environments

type Normalizer

type Normalizer interface {
	Normalize(un *unstructured.Unstructured) error
}

Normalizer updates resource before comparing it

func GetNoopNormalizer

func GetNoopNormalizer() Normalizer

GetNoopNormalizer returns normalizer that does not apply any resource modifications

Source Files