mirror of https://github.com/pulumi/pulumi.git
77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
import * as pulumi from "@pulumi/pulumi";
|
|
import * as dynamic from "@pulumi/pulumi/dynamic";
|
|
import * as provider from "@pulumi/pulumi/provider";
|
|
|
|
let currentID = 0;
|
|
|
|
class Resource extends dynamic.Resource {
|
|
constructor(name: string, echo: pulumi.Input<any>, opts?: pulumi.CustomResourceOptions) {
|
|
const provider = {
|
|
create: async (inputs: any) => ({
|
|
id: (currentID++).toString(),
|
|
outs: undefined,
|
|
}),
|
|
};
|
|
|
|
super(provider, name, {echo}, opts);
|
|
}
|
|
}
|
|
|
|
class Component extends pulumi.ComponentResource {
|
|
public readonly echo: pulumi.Output<any>;
|
|
public readonly childId: pulumi.Output<pulumi.ID>;
|
|
public readonly secret: pulumi.Output<string>;
|
|
|
|
constructor(name: string, echo: pulumi.Input<any>, secret: pulumi.Output<string>, opts?: pulumi.ComponentResourceOptions) {
|
|
super("testcomponent:index:Component", name, {}, opts);
|
|
|
|
this.echo = pulumi.output(echo);
|
|
this.childId = (new Resource(`child-${name}`, echo, {parent: this})).id;
|
|
this.secret = secret;
|
|
|
|
this.registerOutputs({
|
|
echo: this.echo,
|
|
childId: this.childId,
|
|
secret: this.secret,
|
|
})
|
|
}
|
|
}
|
|
|
|
class Provider implements provider.Provider {
|
|
public readonly version = "0.0.1";
|
|
|
|
construct(name: string, type: string, inputs: pulumi.Inputs,
|
|
options: pulumi.ComponentResourceOptions): Promise<provider.ConstructResult> {
|
|
if (type != "testcomponent:index:Component") {
|
|
throw new Error(`unknown resource type ${type}`);
|
|
}
|
|
|
|
const config = new pulumi.Config();
|
|
const secretKey = "secret";
|
|
const fullSecretKey = `${config.name}:${secretKey}`;
|
|
// use internal pulumi prop to check secretness
|
|
const isSecret = (pulumi.runtime as any).isConfigSecret(fullSecretKey);
|
|
if (!isSecret) {
|
|
throw new Error(`expected config with key "${secretKey}" to be secret.`)
|
|
}
|
|
const secret = config.requireSecret(secretKey);
|
|
|
|
|
|
const component = new Component(name, inputs["echo"], secret, options);
|
|
return Promise.resolve({
|
|
urn: component.urn,
|
|
state: {
|
|
echo: component.echo,
|
|
childId: component.childId,
|
|
secret: secret,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
export function main(args: string[]) {
|
|
return provider.main(new Provider(), args);
|
|
}
|
|
|
|
main(process.argv.slice(2));
|