Skip to content

Commit d32b3be

Browse files
committed
init
1 parent ec9e9ee commit d32b3be

File tree

10 files changed

+176
-11
lines changed

10 files changed

+176
-11
lines changed

grpc.json

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{"method":"/pulumirpc.LanguageRuntime/GetPluginInfo","request":{},"response":{"version":"3.147.0-dev.0"},"metadata":{"kind":"language","mode":"client","runtime":"nodejs"}}
2+
{"method":"/pulumirpc.LanguageRuntime/GetRequiredPackages","request":{"info":{"rootDirectory":"/Users/zaid/projects/pulumi-terraform-module/tests/testdata/programs/ts/s3bucket-explicit-provider","programDirectory":"/Users/zaid/projects/pulumi-terraform-module/tests/testdata/programs/ts/s3bucket-explicit-provider","entryPoint":".","options":{"packagemanager":"npm"}}},"response":{"packages":[{"name":"aws","kind":"resource","version":"v6.70.0"},{"name":"terraform-module","kind":"resource","version":"v0.0.0-alpha.0+dev","parameterization":{"name":"bucket","version":"4.5.0","value":"ewogICJtb2R1bGUiOiAidGVycmFmb3JtLWF3cy1tb2R1bGVzL3MzLWJ1Y2tldC9hd3MiLAogICJ2ZXJzaW9uIjogIjQuNS4wIiwKICAicGFja2FnZU5hbWUiOiAiYnVja2V0Igp9"}},{"name":"terraform-module","kind":"resource","version":"v0.0.0-alpha.0+dev","parameterization":{"name":"bucket","version":"4.5.0","value":"ewogICJtb2R1bGUiOiAidGVycmFmb3JtLWF3cy1tb2R1bGVzL3MzLWJ1Y2tldC9hd3MiLAogICJ2ZXJzaW9uIjogIjQuNS4wIiwKICAicGFja2FnZU5hbWUiOiAiYnVja2V0Igp9"}}]},"metadata":{"kind":"language","mode":"client","runtime":"nodejs"}}
3+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"invokeTransforms"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
4+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"outputValues"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
5+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"secrets"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
6+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"aliasSpecs"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
7+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"resourceReferences"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
8+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"transforms"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
9+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"parameterization"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
10+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"deletedWith"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
11+
{"method":"/pulumirpc.ResourceMonitor/RegisterResource","request":{"type":"pulumi:pulumi:Stack","name":"ts-s3bucketmod-program-test","object":{},"acceptSecrets":true,"customTimeouts":{},"supportsPartialValues":true,"acceptResources":true,"aliasSpecs":true,"sourcePosition":{"uri":"file:///Users/zaid/projects/pulumi-terraform-module/tests/testdata/programs/ts/s3bucket-explicit-provider/node_modules/@pulumi/runtime/stack.ts","line":38,"column":23},"supportsResultReporting":true},"response":{"urn":"urn:pulumi:test::ts-s3bucketmod-program::pulumi:pulumi:Stack::ts-s3bucketmod-program-test","object":{}},"metadata":{"mode":"server"}}
12+
{"method":"/pulumirpc.ResourceMonitor/RegisterPackage","request":{"name":"terraform-module","version":"0.0.0-alpha.0+dev","parameterization":{"name":"bucket","version":"4.5.0","value":"ewogICJtb2R1bGUiOiAidGVycmFmb3JtLWF3cy1tb2R1bGVzL3MzLWJ1Y2tldC9hd3MiLAogICJ2ZXJzaW9uIjogIjQuNS4wIiwKICAicGFja2FnZU5hbWUiOiAiYnVja2V0Igp9"}},"response":{"ref":"7e3e1318-95a4-40a1-8641-4addc51b1bd5"},"metadata":{"mode":"server"}}
13+
{"method":"/pulumirpc.ResourceProvider/Handshake","request":{"engineAddress":"127.0.0.1:57372","rootDirectory":"/Users/zaid/projects/pulumi-terraform-module/bin","programDirectory":"/Users/zaid/projects/pulumi-terraform-module/bin"},"errors":["rpc error: code = Unimplemented desc = method Handshake not implemented"],"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
14+
{"method":"/pulumirpc.ResourceProvider/GetPluginInfo","request":{},"response":{"version":"0.0.0-alpha.0+dev"},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
15+
{"method":"/pulumirpc.ResourceProvider/Parameterize","request":{"value":{"name":"bucket","version":"0.0.0-alpha.0+dev","value":"ewogICJtb2R1bGUiOiAidGVycmFmb3JtLWF3cy1tb2R1bGVzL3MzLWJ1Y2tldC9hd3MiLAogICJ2ZXJzaW9uIjogIjQuNS4wIiwKICAicGFja2FnZU5hbWUiOiAiYnVja2V0Igp9"}},"response":{"name":"bucket","version":"4.5.0"},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
16+
{"method":"/pulumirpc.ResourceProvider/CheckConfig","request":{"urn":"urn:pulumi:test::ts-s3bucketmod-program::pulumi:providers:bucket::test-provider","olds":{},"news":{"aws":"{\"region\":\"us-east-1\"}","version":"0.0.0-alpha.0+dev"},"name":"test-provider","type":"pulumi:providers:bucket"},"response":{"inputs":{"aws":"{\"region\":\"us-east-1\"}","version":"0.0.0-alpha.0+dev"}},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
17+
{"method":"/pulumirpc.ResourceMonitor/RegisterResource","request":{"type":"pulumi:providers:bucket","name":"test-provider","parent":"urn:pulumi:test::ts-s3bucketmod-program::pulumi:pulumi:Stack::ts-s3bucketmod-program-test","custom":true,"object":{"aws":"{\"region\":\"us-east-1\"}"},"propertyDependencies":{"aws":{}},"acceptSecrets":true,"customTimeouts":{},"supportsPartialValues":true,"acceptResources":true,"aliasSpecs":true,"sourcePosition":{"uri":"file:///Users/zaid/projects/pulumi-terraform-module/tests/testdata/programs/ts/s3bucket-explicit-provider/sdks/bucket/provider.ts","line":37,"column":9},"supportsResultReporting":true,"packageRef":"7e3e1318-95a4-40a1-8641-4addc51b1bd5"},"response":{"urn":"urn:pulumi:test::ts-s3bucketmod-program::pulumi:providers:bucket::test-provider","id":"8877d0a6-775a-4701-959b-b52dec04ce7a","object":{"aws":"{\"region\":\"us-east-1\"}","version":"0.0.0-alpha.0+dev"}},"metadata":{"mode":"server"}}
18+
{"method":"/pulumirpc.ResourceProvider/Configure","request":{"variables":{"terraform-module:config:aws":"{\"region\":\"us-east-1\"}"},"args":{"aws":"{\"region\":\"us-east-1\"}","version":"0.0.0-alpha.0+dev"},"acceptSecrets":true,"acceptResources":true,"sendsOldInputs":true,"sendsOldInputsToDelete":true},"response":{"acceptSecrets":true,"supportsPreview":true,"acceptResources":true,"acceptOutputs":true},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
19+
{"method":"/pulumirpc.ResourceMonitor/RegisterPackage","request":{"name":"terraform-module","version":"0.0.0-alpha.0+dev","parameterization":{"name":"bucket","version":"4.5.0","value":"eyJtb2R1bGUiOiJ0ZXJyYWZvcm0tYXdzLW1vZHVsZXMvczMtYnVja2V0L2F3cyIsInZlcnNpb24iOiI0LjUuMCIsInBhY2thZ2VOYW1lIjoiYnVja2V0In0="}},"response":{"ref":"8229a1b8-c471-4982-bdeb-59fcec8e2dc6"},"metadata":{"mode":"server"}}
20+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"resourceReferences"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
21+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"outputValues"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
22+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"deletedWith"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
23+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"aliasSpecs"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
24+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"transforms"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
25+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"invokeTransforms"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
26+
{"method":"/pulumirpc.ResourceMonitor/SupportsFeature","request":{"id":"parameterization"},"response":{"hasSupport":true},"metadata":{"mode":"server"}}
27+
{"method":"/pulumirpc.ResourceMonitor/RegisterResource","request":{"type":"bucket:index:Module","name":"test-bucket","object":{},"acceptSecrets":true,"customTimeouts":{},"acceptResources":true,"sourcePosition":{"uri":"project://%2FUsers%2Fzaid%2Fprojects%2Fpulumi-terraform-module%2Fpkg%2Fmodprovider%2Fserver.go","line":298},"supportsResultReporting":true},"response":{"urn":"urn:pulumi:test::ts-s3bucketmod-program::bucket:index:Module::test-bucket","object":{}},"metadata":{"mode":"server"}}
28+
{"method":"/pulumirpc.ResourceProvider/Handshake","request":{"engineAddress":"127.0.0.1:57372","rootDirectory":"/Users/zaid/projects/pulumi-terraform-module/bin","programDirectory":"/Users/zaid/projects/pulumi-terraform-module/bin"},"errors":["rpc error: code = Unimplemented desc = method Handshake not implemented"],"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
29+
{"method":"/pulumirpc.ResourceProvider/GetPluginInfo","request":{},"response":{"version":"0.0.0-alpha.0+dev"},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
30+
{"method":"/pulumirpc.ResourceProvider/Parameterize","request":{"value":{"name":"bucket","version":"4.5.0","value":"eyJtb2R1bGUiOiJ0ZXJyYWZvcm0tYXdzLW1vZHVsZXMvczMtYnVja2V0L2F3cyIsInZlcnNpb24iOiI0LjUuMCIsInBhY2thZ2VOYW1lIjoiYnVja2V0In0="}},"response":{"name":"bucket","version":"4.5.0"},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
31+
{"method":"/pulumirpc.ResourceProvider/CheckConfig","request":{"urn":"urn:pulumi:test::ts-s3bucketmod-program::pulumi:providers:bucket::default_4_5_0","olds":{},"news":{"version":"4.5.0"},"name":"default_4_5_0","type":"pulumi:providers:bucket"},"response":{"inputs":{"version":"4.5.0"}},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
32+
{"method":"/pulumirpc.ResourceProvider/Configure","request":{"args":{"version":"4.5.0"},"acceptSecrets":true,"acceptResources":true,"sendsOldInputs":true,"sendsOldInputsToDelete":true},"response":{"acceptSecrets":true,"supportsPreview":true,"acceptResources":true,"acceptOutputs":true},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
33+
{"method":"/pulumirpc.ResourceProvider/Check","request":{"urn":"urn:pulumi:test::ts-s3bucketmod-program::bucket:index:Module$bucket:index:ModuleState::test-bucket-state","olds":{},"news":{"__module":"urn:pulumi:test::ts-s3bucketmod-program::bucket:index:Module::test-bucket","args":{"bucket":"207830-test-bucket"}},"randomSeed":"vu2kWmnljqjw/C+dUTKNJ/kcr+l9F3huGDgUFdWypUc=","name":"test-bucket-state","type":"bucket:index:ModuleState"},"response":{"inputs":{"__module":"urn:pulumi:test::ts-s3bucketmod-program::bucket:index:Module::test-bucket","args":{"bucket":"207830-test-bucket"}}},"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
34+
{"method":"/pulumirpc.ResourceProvider/Cancel","request":{},"errors":["rpc error: code = Unimplemented desc = method Cancel not implemented"],"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}
35+
{"method":"/pulumirpc.ResourceProvider/Cancel","request":{},"errors":["rpc error: code = Unimplemented desc = method Cancel not implemented"],"metadata":{"kind":"resource","mode":"client","name":"terraform-module"}}

pkg/modprovider/schema.go

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ func pulumiSchemaForModule(pargs *ParameterizeArgs, inferredModule *InferredModu
4141
Name: string(packageName),
4242
Version: string(pkgVer),
4343
Types: inferredModule.SupportingTypes,
44+
Provider: schema.ResourceSpec{
45+
InputProperties: inferredModule.ProvidersConfig.Variables,
46+
},
4447
Resources: map[string]schema.ResourceSpec{
4548
mainResourceToken: {
4649
IsComponent: true,

pkg/modprovider/server.go

+42-11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
emptypb "google.golang.org/protobuf/types/known/emptypb"
2828

2929
"github.com/pulumi/pulumi/pkg/v3/resource/provider"
30+
"github.com/pulumi/pulumi/sdk/v3/go/common/resource"
3031
"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
3132
"github.com/pulumi/pulumi/sdk/v3/go/common/tokens"
3233
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
@@ -51,16 +52,17 @@ func StartServer(hostClient *provider.HostClient) (pulumirpc.ResourceProviderSer
5152

5253
type server struct {
5354
pulumirpc.UnimplementedResourceProviderServer
54-
planStore *planStore
55-
params *ParameterizeArgs
56-
hostClient *provider.HostClient
57-
stateStore moduleStateStore
58-
moduleStateHandler *moduleStateHandler
59-
childHandler *childHandler
60-
packageName packageName
61-
packageVersion packageVersion
62-
componentTypeName componentTypeName
63-
inferredModuleSchema *InferredModuleSchema
55+
planStore *planStore
56+
params *ParameterizeArgs
57+
hostClient *provider.HostClient
58+
stateStore moduleStateStore
59+
moduleStateHandler *moduleStateHandler
60+
childHandler *childHandler
61+
packageName packageName
62+
packageVersion packageVersion
63+
componentTypeName componentTypeName
64+
inferredModuleSchema *InferredModuleSchema
65+
providerConfigurationByURN map[string]resource.PropertyMap
6466
}
6567

6668
func (s *server) Parameterize(
@@ -275,6 +277,7 @@ func (s *server) Construct(
275277
// TODO[https://github.com/pulumi/pulumi-terraform-module/issues/151] support Outputs in Unmarshal
276278
KeepOutputValues: false,
277279
})
280+
278281
if err != nil {
279282
return nil, fmt.Errorf("Construct failed to parse inputs: %s", err)
280283
}
@@ -328,10 +331,38 @@ func (s *server) Check(
328331
case isChildResourceType(req.GetType()):
329332
return s.childHandler.Check(ctx, req)
330333
default:
331-
return nil, fmt.Errorf("[Check]: type %q is not supported yet", req.GetType())
334+
return &pulumirpc.CheckResponse{Inputs: req.News}, nil
332335
}
333336
}
334337

338+
func (s *server) CheckConfig(
339+
ctx context.Context,
340+
req *pulumirpc.CheckRequest,
341+
) (*pulumirpc.CheckResponse, error) {
342+
if s.providerConfigurationByURN == nil {
343+
s.providerConfigurationByURN = make(map[string]resource.PropertyMap)
344+
}
345+
346+
config, err := plugin.UnmarshalProperties(req.GetNews(), plugin.MarshalOptions{
347+
KeepUnknowns: false,
348+
KeepSecrets: false,
349+
KeepResources: false,
350+
KeepOutputValues: false,
351+
})
352+
353+
if err != nil {
354+
return nil, fmt.Errorf("CheckConfig failed to parse inputs: %w", err)
355+
}
356+
357+
if len(config) > 0 {
358+
s.providerConfigurationByURN[req.Urn] = config
359+
}
360+
361+
return &pulumirpc.CheckResponse{
362+
Inputs: req.News,
363+
}, nil
364+
}
365+
335366
func (s *server) Diff(
336367
ctx context.Context,
337368
req *pulumirpc.DiffRequest,

pkg/modprovider/tfmodules.go

+13
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type InferredModuleSchema struct {
4545
Outputs map[string]schema.PropertySpec
4646
SupportingTypes map[string]schema.ComplexTypeSpec
4747
RequiredInputs []string
48+
ProvidersConfig schema.ConfigSpec
4849
}
4950

5051
var stringType = schema.TypeSpec{Type: "string"}
@@ -269,6 +270,18 @@ func InferModuleSchema(
269270
Outputs: make(map[string]schema.PropertySpec),
270271
RequiredInputs: []string{},
271272
SupportingTypes: map[string]schema.ComplexTypeSpec{},
273+
ProvidersConfig: schema.ConfigSpec{
274+
Variables: map[string]schema.PropertySpec{},
275+
},
276+
}
277+
278+
if module.ProviderRequirements != nil {
279+
for providerName, _ := range module.ProviderRequirements.RequiredProviders {
280+
inferredModuleSchema.ProvidersConfig.Variables[providerName] = schema.PropertySpec{
281+
Description: "provider configuration for " + providerName,
282+
TypeSpec: mapType(anyType),
283+
}
284+
}
272285
}
273286

274287
for variableName, variable := range module.Variables {

pkg/modprovider/tfmodules_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ func TestInferringModuleSchemaWorks(t *testing.T) {
139139
assert.Equal(t, expected.TypeSpec, actual.TypeSpec, "output %s type is incorrect", name)
140140
}
141141

142+
expectedConfigVariables := map[string]schema.PropertySpec{
143+
"aws": {
144+
TypeSpec: mapType(anyType),
145+
Description: "provider configuration for aws",
146+
},
147+
}
148+
assert.Equal(t,
149+
expectedConfigVariables,
150+
awsVpcSchema.ProvidersConfig.Variables,
151+
"required provider variables are incorrect")
142152
}
143153

144154
func TestResolveModuleSources(t *testing.T) {

tests/acc_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,35 @@ func TestS3BucketModSecret(t *testing.T) {
345345

346346
}
347347

348+
func TestS3BucketWithExplicitProvider(t *testing.T) {
349+
localProviderBinPath := ensureCompiledProvider(t)
350+
//skipLocalRunsWithoutCreds(t)
351+
testProgram := filepath.Join("testdata", "programs", "ts", "s3bucket-explicit-provider")
352+
integrationTest := pulumitest.NewPulumiTest(t, testProgram,
353+
opttest.Env("PULUMI_DEBUG_GRPC", "/Users/zaid/projects/pulumi-terraform-module/grpc.json"),
354+
opttest.LocalProviderPath("terraform-module", filepath.Dir(localProviderBinPath)),
355+
opttest.TestInPlace())
356+
357+
// Get a prefix for resource names
358+
prefix := generateTestResourcePrefix()
359+
360+
// Set prefix via config
361+
integrationTest.SetConfig(t, "prefix", prefix)
362+
integrationTest.SetConfig(t, "region", "us-east-1")
363+
364+
// Generate package
365+
//nolint:all
366+
pulumiPackageAdd(t, integrationTest, localProviderBinPath, "terraform-aws-modules/s3-bucket/aws", "4.5.0", "bucket")
367+
integrationTest.Up(t)
368+
369+
deploy := integrationTest.ExportStack(t)
370+
var deployment apitype.DeploymentV3
371+
err := json.Unmarshal(deploy.Deployment, &deployment)
372+
require.NoError(t, err)
373+
374+
integrationTest.Destroy(t)
375+
}
376+
348377
func TestIntegration(t *testing.T) {
349378

350379
type testCase struct {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
encryptionsalt: v1:AGXWldsKdOI=:v1:zHGh+t65ypGRMolQ:5r9m5W57yiKIC7je9ShwDr0ahl1owg==
2+
config:
3+
ts-s3bucketmod-program:prefix: "207830"
4+
ts-s3bucketmod-program:region: us-east-1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name: ts-s3bucketmod-program
2+
runtime:
3+
name: nodejs
4+
options:
5+
packagemanager: npm
6+
plugins:
7+
providers:
8+
- name: terraform-module
9+
path: /Users/zaid/projects/pulumi-terraform-module/bin
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import * as pulumi from "@pulumi/pulumi";
2+
import * as bucket from "@pulumi/bucket";
3+
4+
5+
const config = new pulumi.Config();
6+
const prefix = config.get('prefix') ?? pulumi.getStack();
7+
8+
const provider = new bucket.Provider("test-provider", {
9+
aws: {
10+
"region": "us-west-2"
11+
}
12+
})
13+
14+
const testBucket = new bucket.Module("test-bucket", {
15+
bucket: `${prefix}-test-bucket`
16+
}, { provider: provider });
17+
18+
export const bucketARN = testBucket.s3_bucket_arn
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "ts-s3bucketmod-program",
3+
"main": "index.ts",
4+
"devDependencies": {
5+
"@types/node": "^18",
6+
"typescript": "^5.0.0"
7+
},
8+
"dependencies": {
9+
"@pulumi/aws": "^6.0.0",
10+
"@pulumi/bucket": "file:sdks/bucket",
11+
"@pulumi/pulumi": "^3.113.0"
12+
}
13+
}

0 commit comments

Comments
 (0)