cilium/cilium · error

unsupported release type: %T

Error message

unsupported release type: %T

What it means

With --dry-run-helm-values, cilium-cli type-asserts the upgraded Helm release to *v1release.Release so it can YAML-marshal the release's user-supplied values (v1rel.Config). This error means the release object returned by helm.Upgrade is not the concrete v1 release type, so its Config field cannot be read directly. It is a forward-compatibility guard against Helm abstracting releases behind other types.

Source

Thrown at cilium-cli/install/upgrade.go:67

		DryRun:           k.params.DryRun,
		DryRunHelmValues: k.params.DryRunHelmValues,
	}
	rel, err := helm.Upgrade(ctx, k8sClient.HelmActionConfig, upgradeParams)
	if err != nil {
		return err
	}

	if k.params.DryRun {
		accessor, err := release.NewAccessor(rel)
		if err != nil {
			return fmt.Errorf("failed to create release accessor: %w", err)
		}
		fmt.Println(accessor.Manifest())
	}
	if k.params.DryRunHelmValues {
		v1rel, ok := rel.(*v1release.Release)
		if !ok {
			return fmt.Errorf("unsupported release type: %T", rel)
		}
		helmValues, err := yaml.Marshal(v1rel.Config)
		if err != nil {
			return err
		}
		fmt.Println(string(helmValues))
	}
	if !k.params.Restart {
		fmt.Println("⚠️  You maybe need to restart Cilium pods for configmap changes to take effect")
		return nil
	}

	if err := k.client.DeletePodCollection(ctx, k.params.Namespace,
		metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: defaults.AgentPodSelector}); err != nil {
		return fmt.Errorf("⚠️  unable to restart Cilium pods: %w", err)
	}

	if err := k.client.DeletePodCollection(ctx, k.params.Namespace,

View on GitHub (pinned to ac7b90affa)

Solutions

  1. Upgrade cilium-cli to the latest stable release where the upgrade path returns *v1release.Release
  2. If building from source, sync helm.sh/helm/v4 to the pinned version in cilium-cli's go.mod
  3. Preview values instead via 'helm get values <release>' or 'helm upgrade --dry-run' outside cilium-cli
  4. Report the concrete %T value from the error to cilium-cli if it reproduces on the latest version

Example fix

// before
v1rel, ok := rel.(*v1release.Release)
if !ok {
	return fmt.Errorf("unsupported release type: %T", rel)
}
// after (use accessor instead of hard type assertion)
accessor, err := release.NewAccessor(rel)
if err != nil {
	return fmt.Errorf("failed to create release accessor: %w", err)
}
_ = accessor // use accessor API for values where available
v1rel, ok := rel.(*v1release.Release)
if !ok {
	return fmt.Errorf("unsupported release type: %T", rel)
}
Defensive patterns

Strategy: type-guard

Validate before calling

// Guard the assertion yourself before expecting values output
rel, err := helm.Upgrade(ctx, k8sClient.HelmActionConfig, upgradeParams)
if err != nil {
	return err
}
if _, ok := rel.(*v1release.Release); !ok {
	return fmt.Errorf("--dry-run-helm-values needs *v1release.Release, got %T", rel)
}

Type guard

func asV1Release(rel release.Release) (*v1release.Release, bool) {
	v1rel, ok := rel.(*v1release.Release)
	return v1rel, ok
}

Try / catch

err := installer.UpgradeWithHelm(ctx, k8sClient)
if err != nil && strings.Contains(err.Error(), "unsupported release type") {
	log.Printf("values preview skipped; fetch with 'helm get values <release>' instead: %v", err)
	err = nil // upgrade already applied
}

Prevention

When it happens

Trigger: k.params.DryRunHelmValues is set, and the Go type assertion rel.(*v1release.Release) fails because helm.Upgrade returned a release wrapped in a different concrete type (e.g. an accessor-backed or future Helm release representation).

Common situations: Helm library version drift between cilium-cli's internal helm wrapper and release/v1; custom builds where the upgrade path returns a generic release interface; running a preview/alpha cilium-cli against newer Helm APIs.

Related errors


AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31). Data as JSON: /api/errors/f6658405ac5edcc0. Report an issue: GitHub.