Skip to content

[Bug] Incomplete diff showing when using parent chart and dependencies with kustomize #716

@hubertbits

Description

@hubertbits

Hello,

helm-diff is showing an incomplete diff
... if resources are added via kustomize and the helm chart is local and has dependencies.
helm-diff is behaving correctly
... when not using dependencies and just using a local helm chart with kustomize postRenderer.

Needed resources are provided as code under section resources so it can be reproduced locally.

Versions

# kubectl version with installed kustomize (https://kubectl.docs.kubernetes.io/installation/kustomize/)
Client Version: v1.32.0
Kustomize Version: v5.5.0

# helm version
version.BuildInfo{Version:"v3.16.4", GitCommit:"7877b45b63f95635153b29a42c0c2f4273ec45ca", GitTreeState:"dirty", GoVersion:"go1.23.4"}

# helm diff version
3.9.13

For the sake of this example no complex configuration should be needed as we are just about to throw a diff against a kubernetes cluster and verify if the additional resources come up in the output diff when running helm diff upgrade command as shown under resources/helm-upgrade-command.

Please note that the vpa subchart in goldlocks is set to enabled: false to avoid mis-interpretation.

Actual Result

After running the diff command helmChartAfterKustomize.yaml is showing the VerticalPodAutoscaler that was added to the manifest via vpa-controller.yaml where as in the diff_output.txt or stdout its no where to be found that its to be added.

Expected Result

The diff output should show added resource via postRenderer -> kustomize

Resources

The following instructions under resources should create a directory structure like so

.
├── helm
│   └── Chart.yaml
│   └── values.yaml
├── all.yaml # auto created when helm post-renderer is executed
├── diff_output.txt # auto created when helm diff upgrade is run
├── helmChartAfterKustomize.yaml # auto created when helm post-renderer is executed
├── kustomization.yaml
└── vpa-controller.yaml

helm upgrade command

  helm diff upgrade \
    --allow-unreleased \
    --color \
    --post-renderer ./kustomize.sh \
    --three-way-merge \
    --values values.yaml \
    --version "1.0.0" \
    goldilocks helm \
  | tee >(sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g' > diff_output.txt)

kustomize.sh

#!/usr/bin/env bash
set -euo pipefail

kustomizeInput=$(</dev/stdin)

printf "%s" "${kustomizeInput}" > all.yaml

kustomizeOutput=$(kubectl kustomize .)

# add YAML resource separator at the beginning
kustomizeOutput="---
${kustomizeOutput}"

# create local copy for debugging purpose
printf "%s" "${kustomizeOutput}" | envsubst | tee helmChartAfterKustomize.yaml

create helm/Chart.yaml

---
apiVersion: v2
name: goldilocks-dashboard
description: A Parent Helm chart for our goldilocks dashboard
type: application
version: 1.0.0
dependencies:
- name: goldilocks
  repository: "https://charts.fairwinds.com/stable"
  version: 9.0.1
- name: oauth2-proxy
  alias: proxy-dashboard
  repository: https://oauth2-proxy.github.io/manifests
  version: 7.8.1

create helm/values.yaml

---
# for a list of all available attributes see
# see https://artifacthub.io/packages/helm/fairwinds-stable/goldilocks?modal=values
goldilocks: {}

# for a list of all available attributes see
# see https://artifacthub.io/packages/helm/oauth2-proxy/oauth2-proxy?modal=values
proxy-dashboard: {}

create values.yaml

---
goldilocks:
  vpa:
    enabled: false

  dashboard:
    ingress:
      enabled: false

kustomization.yaml

---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - all.yaml
  - vpa-controller.yaml

vpa-controller.yaml

---
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: goldilocks-controller
  namespace: goldilocks
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: goldilocks-controller
  updatePolicy:
    updateMode: Auto

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions