Skip to content

Commit

Permalink
Fix error for helm.Release previews with computed values
Browse files Browse the repository at this point in the history
The helm.Release resource was not checking for computed
values in the configuration during preview, which led to
various failures in code that expects only resolved values.
  • Loading branch information
lblackstone committed Oct 7, 2021
1 parent eed4677 commit 8de76db
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 22 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## HEAD (Unreleased)

- Fix error for helm.Release previews with computed values (https://github.com/pulumi/pulumi-kubernetes/pull/1760)

## 3.8.0 (October 6, 2021)

Breaking change note:
Expand Down
47 changes: 25 additions & 22 deletions provider/pkg/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -1148,12 +1148,6 @@ func (k *kubeProvider) Check(ctx context.Context, req *pulumirpc.CheckRequest) (
//

urn := resource.URN(req.GetUrn())
if isHelmRelease(urn) {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Check(ctx, req, !k.suppressHelmReleaseBetaWarning)
}
return nil, fmt.Errorf("can't use Helm Release with unreachable cluster. Reason: %q", k.clusterUnreachableReason)
}

// Utilities for determining whether a resource's GVK exists.
gvkExists := func(gvk schema.GroupVersionKind) bool {
Expand Down Expand Up @@ -1342,6 +1336,13 @@ func (k *kubeProvider) Check(ctx context.Context, req *pulumirpc.CheckRequest) (
}
}

if isHelmRelease(urn) && !hasComputedValue(newInputs) {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Check(ctx, req, !k.suppressHelmReleaseBetaWarning)
}
return nil, fmt.Errorf("can't use Helm Release with unreachable cluster. Reason: %q", k.clusterUnreachableReason)
}

// Return new, possibly-autonamed inputs.
return &pulumirpc.CheckResponse{Inputs: autonamedInputs, Failures: failures}, nil
}
Expand Down Expand Up @@ -1391,12 +1392,6 @@ func (k *kubeProvider) Diff(ctx context.Context, req *pulumirpc.DiffRequest) (*p
//

urn := resource.URN(req.GetUrn())
if isHelmRelease(urn) {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Diff(ctx, req)
}
return nil, fmt.Errorf("can't use Helm Release with unreachable cluster. Reason: %q", k.clusterUnreachableReason)
}

label := fmt.Sprintf("%s.Diff(%s)", k.label(), urn)
logger.V(9).Infof("%s executing", label)
Expand Down Expand Up @@ -1431,6 +1426,13 @@ func (k *kubeProvider) Diff(ctx context.Context, req *pulumirpc.DiffRequest) (*p
return nil, err
}

if isHelmRelease(urn) && hasComputedValue(newInputs) {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Diff(ctx, req)
}
return nil, fmt.Errorf("can't use Helm Release with unreachable cluster. Reason: %q", k.clusterUnreachableReason)
}

namespacedKind, err := clients.IsNamespacedKind(gvk, k.clientSet)
if err != nil {
if clients.IsNoNamespaceInfoErr(err) {
Expand Down Expand Up @@ -1598,7 +1600,8 @@ func (k *kubeProvider) Create(
// comments in those methods for details.
//
urn := resource.URN(req.GetUrn())
if isHelmRelease(urn) {

if isHelmRelease(urn) && !req.GetPreview() {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Create(ctx, req)
}
Expand Down Expand Up @@ -2063,15 +2066,6 @@ func (k *kubeProvider) Update(
}
newInputs := propMapToUnstructured(newResInputs)

if isHelmRelease(urn) {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Update(ctx, req)
}
return nil, fmt.Errorf("can't update Helm Release with unreachable cluster. Reason: %q", k.clusterUnreachableReason)
}
// Ignore old state; we'll get it from Kubernetes later.
oldInputs, _ := parseCheckpointObject(oldState)

// If this is a preview and the input values contain unknowns, return them as-is. This is compatible with
// prior behavior implemented by the Pulumi engine. Similarly, if the server does not support server-side
// dry run, return the inputs as-is.
Expand All @@ -2082,6 +2076,15 @@ func (k *kubeProvider) Update(
return &pulumirpc.UpdateResponse{Properties: req.News}, nil
}

if isHelmRelease(urn) {
if !k.clusterUnreachable {
return k.helmReleaseProvider.Update(ctx, req)
}
return nil, fmt.Errorf("can't update Helm Release with unreachable cluster. Reason: %q", k.clusterUnreachableReason)
}
// Ignore old state; we'll get it from Kubernetes later.
oldInputs, _ := parseCheckpointObject(oldState)

annotatedInputs, err := withLastAppliedConfig(newInputs)
if err != nil {
return nil, pkgerrors.Wrapf(
Expand Down

0 comments on commit 8de76db

Please sign in to comment.