diff --git a/changelog/pending/20221116--engine--always-keep-resources-when-pulumi-pulumi-getresource-is-invoked.yaml b/changelog/pending/20221116--engine--always-keep-resources-when-pulumi-pulumi-getresource-is-invoked.yaml new file mode 100644 index 000000000000..086aa1befa0e --- /dev/null +++ b/changelog/pending/20221116--engine--always-keep-resources-when-pulumi-pulumi-getresource-is-invoked.yaml @@ -0,0 +1,4 @@ +changes: +- type: fix + scope: engine + description: Always keep resources when pulumi:pulumi:getResource is invoked diff --git a/changelog/pending/20221116--sdk-go-nodejs-python--set-acceptresources-when-invoking-pulumi-pulumi-getresource.yaml b/changelog/pending/20221116--sdk-go-nodejs-python--set-acceptresources-when-invoking-pulumi-pulumi-getresource.yaml new file mode 100644 index 000000000000..88b16d496c46 --- /dev/null +++ b/changelog/pending/20221116--sdk-go-nodejs-python--set-acceptresources-when-invoking-pulumi-pulumi-getresource.yaml @@ -0,0 +1,4 @@ +changes: +- type: fix + scope: sdk/go,nodejs,python + description: Set acceptResources when invoking pulumi:pulumi:getResource diff --git a/pkg/resource/deploy/source_eval.go b/pkg/resource/deploy/source_eval.go index bcdad1fd5fc6..f897565b58be 100644 --- a/pkg/resource/deploy/source_eval.go +++ b/pkg/resource/deploy/source_eval.go @@ -710,11 +710,20 @@ func (rm *resmon) Invoke(ctx context.Context, req *pulumirpc.ResourceInvokeReque if err != nil { return nil, fmt.Errorf("invocation of %v returned an error: %w", tok, err) } + + // Respect `AcceptResources` unless `tok` is for the built-in `pulumi:pulumi:getResource` function, + // in which case always keep resources to maintain the original behavior for older SDKs that are not + // setting the `AccceptResources` flag. + keepResources := req.GetAcceptResources() + if tok == "pulumi:pulumi:getResource" { + keepResources = true + } + mret, err := plugin.MarshalProperties(ret, plugin.MarshalOptions{ Label: label, KeepUnknowns: true, KeepSecrets: true, - KeepResources: req.GetAcceptResources(), + KeepResources: keepResources, }) if err != nil { return nil, fmt.Errorf("failed to marshal %v return: %w", tok, err) diff --git a/sdk/go/pulumi/context.go b/sdk/go/pulumi/context.go index 73fcbd3717f7..05245cf9722c 100644 --- a/sdk/go/pulumi/context.go +++ b/sdk/go/pulumi/context.go @@ -723,8 +723,9 @@ func (ctx *Context) getResource(urn string) (*pulumirpc.RegisterResourceResponse tok := "pulumi:pulumi:getResource" logging.V(9).Infof("Invoke(%s, #args=%d): RPC call being made synchronously", tok, len(resolvedArgsMap)) resp, err := ctx.monitor.Invoke(ctx.ctx, &pulumirpc.ResourceInvokeRequest{ - Tok: "pulumi:pulumi:getResource", - Args: rpcArgs, + Tok: "pulumi:pulumi:getResource", + Args: rpcArgs, + AcceptResources: !disableResourceReferences, }) if err != nil { return nil, fmt.Errorf("invoke(%s, ...): error: %v", tok, err) diff --git a/sdk/nodejs/runtime/resource.ts b/sdk/nodejs/runtime/resource.ts index 8c5711dc0297..443bdd75c7ce 100644 --- a/sdk/nodejs/runtime/resource.ts +++ b/sdk/nodejs/runtime/resource.ts @@ -114,6 +114,7 @@ export function getResource(res: Resource, parent: Resource | undefined, props: req.setArgs(gstruct.Struct.fromJavaScript(inputs)); req.setProvider(""); req.setVersion(""); + req.setAcceptresources(!utils.disableResourceReferences); // Now run the operation, serializing the invocation if necessary. const opLabel = `monitor.getResource(${label})`; diff --git a/sdk/python/lib/pulumi/runtime/resource.py b/sdk/python/lib/pulumi/runtime/resource.py index 75b3845ad29c..ffcd79fe485f 100644 --- a/sdk/python/lib/pulumi/runtime/resource.py +++ b/sdk/python/lib/pulumi/runtime/resource.py @@ -243,8 +243,17 @@ async def do_get(): monitor = settings.get_monitor() inputs = await rpc.serialize_properties({"urn": urn}, {}) + + accept_resources = not ( + os.getenv("PULUMI_DISABLE_RESOURCE_REFERENCES", "").upper() + in {"TRUE", "1"} + ) req = resource_pb2.ResourceInvokeRequest( - tok="pulumi:pulumi:getResource", args=inputs, provider="", version="" + tok="pulumi:pulumi:getResource", + args=inputs, + provider="", + version="", + acceptResources=accept_resources, ) def do_invoke():