Skip to content

Commit

Permalink
[sdk/nodejs] Support explicit providers for packaged components
Browse files Browse the repository at this point in the history
Updates the Node.js SDK to support passing an explicit provider.
  • Loading branch information
justinvp committed Jul 13, 2023
1 parent db1d8c7 commit bfcb673
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 12 deletions.
17 changes: 6 additions & 11 deletions sdk/nodejs/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import { ResourceError } from "./errors";
import * as log from "./log";
import { Input, Inputs, interpolate, Output, output } from "./output";
import { getResource, readResource, registerResource, registerResourceOutputs } from "./runtime/resource";
import { getResource, pkgFromType, readResource, registerResource, registerResourceOutputs } from "./runtime/resource";
import { unknownValue } from "./runtime/rpc";
import { getProject, getStack } from "./runtime/settings";
import { getStackResource } from "./runtime/state";
Expand Down Expand Up @@ -279,11 +279,10 @@ export abstract class Resource {

// getProvider fetches the provider for the given module member, if any.
public getProvider(moduleMember: string): ProviderResource | undefined {
const memComponents = moduleMember.split(":");
if (memComponents.length !== 3) {
const pkg = pkgFromType(moduleMember);
if (pkg === undefined) {
return undefined;
}
const pkg = memComponents[0];

return this.__providers[pkg];
}
Expand Down Expand Up @@ -384,12 +383,8 @@ export abstract class Resource {
// 1. opts.provider
// 2. a matching provider in opts.providers
// 3. a matching provider inherited from opts.parent
if (custom && opts.provider === undefined) {
let pkg = undefined;
const memComponents = t.split(":");
if (memComponents.length === 3) {
pkg = memComponents[0];
}
if ((custom || remote) && opts.provider === undefined) {
const pkg = pkgFromType(t);
const parentProvider = parent?.getProvider(t);

if (pkg && pkg in this.__providers) {
Expand All @@ -400,7 +395,7 @@ export abstract class Resource {
}

this.__protect = !!opts.protect;
this.__prov = custom ? opts.provider : undefined;
this.__prov = custom || remote ? opts.provider : undefined;
this.__version = opts.version;
this.__pluginDownloadURL = opts.pluginDownloadURL;

Expand Down
29 changes: 28 additions & 1 deletion sdk/nodejs/runtime/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -688,11 +688,26 @@ export async function prepareResource(
// If no parent was provided, parent to the root resource.
const parentURN = parent ? await parent.urn.promise() : undefined;

let providerRef: string | undefined;
let importID: ID | undefined;
if (custom) {
const customOpts = <CustomResourceOptions>opts;
importID = customOpts.import;
}

let providerRef: string | undefined;
let sendProvider = custom;
if (remote && opts.provider) {
// If it's a remote component and a provider was specified, only
// send the provider in the request if the provider's package is
// the same as the component's package. Otherwise, don't send it
// because the user specified `provider: someProvider` as shorthand
// for `providers: [someProvider]`.
const pkg = pkgFromType(type!);
if (pkg && pkg === opts.provider.getPackage()) {
sendProvider = true;
}
}
if (sendProvider) {
providerRef = await ProviderResource.register(opts.provider);
}

Expand Down Expand Up @@ -1114,3 +1129,15 @@ function runAsyncResourceOp(label: string, callback: () => Promise<void>, serial
}
}
}

/**
* Extract the pkg from the type token of the form "pkg:module:member".
* @internal
*/
export function pkgFromType(type: string): string | undefined {
const parts = type.split(":");
if (parts.length === 3) {
return parts[0];
}
return undefined;
}

0 comments on commit bfcb673

Please sign in to comment.