Skip to content

Commit b5ae00d

Browse files
committed
starlark/types: provider kwargs and alias
Signed-off-by: Máximo Cuadros <[email protected]>
1 parent eb859ba commit b5ae00d

File tree

6 files changed

+68
-38
lines changed

6 files changed

+68
-38
lines changed

starlark/types/computed.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func (c *Computed) doNested(name, path string, t cty.Type, index int) *Computed
8989
}
9090

9191
}
92+
9293
func (c *Computed) Index(i int) starlark.Value {
9394
path := fmt.Sprintf("%s.%d", c.path, i)
9495

starlark/types/fixtures/aws.tf

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
provider "aws" {
2-
alias = "id_40"
2+
alias = "id_1"
33
version = "2.13.0"
44
region = "us-west-2"
55
}
66

7-
data "aws_ami" "id_44" {
8-
provider = aws.id_40
7+
data "aws_ami" "id_5" {
8+
provider = aws.id_1
99
most_recent = true
1010
owners = ["099720109477"]
1111

@@ -20,8 +20,8 @@ data "aws_ami" "id_44" {
2020
}
2121
}
2222

23-
resource "aws_autoscaling_group" "id_47" {
24-
provider = aws.id_40
23+
resource "aws_autoscaling_group" "id_8" {
24+
provider = aws.id_1
2525
availability_zones = ["us-east-1a"]
2626
desired_capacity = 1
2727
max_size = 1
@@ -30,7 +30,7 @@ resource "aws_autoscaling_group" "id_47" {
3030
mixed_instances_policy {
3131
launch_template {
3232
launch_template_specification {
33-
launch_template_id = "${aws_launch_template.id_46.id}"
33+
launch_template_id = "${aws_launch_template.id_7.id}"
3434
}
3535

3636
override {
@@ -44,9 +44,9 @@ resource "aws_autoscaling_group" "id_47" {
4444
}
4545
}
4646

47-
resource "aws_instance" "id_45" {
48-
provider = aws.id_40
49-
ami = "${data.aws_ami.id_44.id}"
47+
resource "aws_instance" "id_6" {
48+
provider = aws.id_1
49+
ami = "${data.aws_ami.id_5.id}"
5050
instance_type = "t2.micro"
5151

5252
credit_specification {
@@ -55,47 +55,47 @@ resource "aws_instance" "id_45" {
5555

5656
network_interface {
5757
device_index = 0
58-
network_interface_id = "${aws_network_interface.id_43.id}"
58+
network_interface_id = "${aws_network_interface.id_4.id}"
5959
}
6060
}
6161

62-
resource "aws_instance" "id_49" {
63-
provider = aws.id_40
62+
resource "aws_instance" "id_10" {
63+
provider = aws.id_1
6464
ami = "ami-2757f631"
6565
instance_type = "t2.micro"
66-
depends_on = [aws_s3_bucket.id_48]
66+
depends_on = [aws_s3_bucket.id_9]
6767
}
6868

69-
resource "aws_launch_template" "id_46" {
70-
provider = aws.id_40
71-
image_id = "${data.aws_ami.id_44.id}"
69+
resource "aws_launch_template" "id_7" {
70+
provider = aws.id_1
71+
image_id = "${data.aws_ami.id_5.id}"
7272
instance_type = "c5.large"
7373
name_prefix = "example"
7474
}
7575

76-
resource "aws_network_interface" "id_43" {
77-
provider = aws.id_40
76+
resource "aws_network_interface" "id_4" {
77+
provider = aws.id_1
7878
private_ips = ["172.16.10.100"]
79-
subnet_id = "${aws_subnet.id_42.id}"
79+
subnet_id = "${aws_subnet.id_3.id}"
8080
tags = { Name = "primary_network_iterface" }
8181
}
8282

83-
resource "aws_s3_bucket" "id_48" {
84-
provider = aws.id_40
83+
resource "aws_s3_bucket" "id_9" {
84+
provider = aws.id_1
8585
acl = "private"
8686
bucket = "terraform-getting-started-guide"
8787
}
8888

89-
resource "aws_subnet" "id_42" {
90-
provider = aws.id_40
89+
resource "aws_subnet" "id_3" {
90+
provider = aws.id_1
9191
availability_zone = "us-west-2a"
9292
cidr_block = "172.16.0.0/24"
9393
tags = { Name = "tf-example" }
94-
vpc_id = "${aws_vpc.id_41.id}"
94+
vpc_id = "${aws_vpc.id_2.id}"
9595
}
9696

97-
resource "aws_vpc" "id_41" {
98-
provider = aws.id_40
97+
resource "aws_vpc" "id_2" {
98+
provider = aws.id_1
9999
cidr_block = "172.16.0.0/16"
100100
tags = { Name = "tf-example" }
101101
}

starlark/types/provider.go

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,16 @@ import (
1313
)
1414

1515
func BuiltinProvider(pm *terraform.PluginManager) starlark.Value {
16-
return starlark.NewBuiltin("provider", func(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, _ []starlark.Tuple) (starlark.Value, error) {
17-
var name, version starlark.String
16+
return starlark.NewBuiltin("provider", func(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
17+
var name, version, alias starlark.String
1818
switch len(args) {
19+
case 3:
20+
var ok bool
21+
alias, ok = args.Index(2).(starlark.String)
22+
if !ok {
23+
return nil, fmt.Errorf("expected string, go %s", args.Index(2).Type())
24+
}
25+
fallthrough
1926
case 2:
2027
var ok bool
2128
version, ok = args.Index(1).(starlark.String)
@@ -33,22 +40,29 @@ func BuiltinProvider(pm *terraform.PluginManager) starlark.Value {
3340
return nil, fmt.Errorf("unexpected positional arguments count")
3441
}
3542

36-
return MakeProvider(pm, name.GoString(), version.GoString())
43+
p, err := MakeProvider(pm, name.GoString(), version.GoString(), alias.GoString())
44+
if err != nil {
45+
return nil, err
46+
}
47+
48+
return p, p.loadKeywordArgs(kwargs)
3749
})
3850
}
3951

52+
// Provider represents a provider as a starlark.Value.
4053
type Provider struct {
41-
name string
42-
provider *plugin.GRPCProvider
43-
meta discovery.PluginMeta
54+
name, alias string
55+
provider *plugin.GRPCProvider
56+
meta discovery.PluginMeta
4457

4558
dataSources *MapSchema
4659
resources *MapSchema
4760

4861
*Resource
4962
}
5063

51-
func MakeProvider(pm *terraform.PluginManager, name, version string) (*Provider, error) {
64+
// MakeProvider returns a new Provider instance from a given name version and alias.
65+
func MakeProvider(pm *terraform.PluginManager, name, version, alias string) (*Provider, error) {
5266
cli, meta, err := pm.Provider(name, version, false)
5367
if err != nil {
5468
return nil, err
@@ -64,16 +78,21 @@ func MakeProvider(pm *terraform.PluginManager, name, version string) (*Provider,
6478
return nil, err
6579
}
6680

81+
if alias == "" {
82+
alias = NameGenerator()
83+
}
84+
6785
provider := raw.(*plugin.GRPCProvider)
6886
response := provider.GetSchema()
6987

7088
defer cli.Kill()
7189
p := &Provider{
7290
name: name,
91+
alias: alias,
7392
provider: provider,
7493
meta: meta,
7594

76-
Resource: MakeResource(NameGenerator(), name, ProviderKind, response.Provider.Block, nil),
95+
Resource: MakeResource(alias, name, ProviderKind, response.Provider.Block, nil),
7796
}
7897

7998
p.dataSources = NewMapSchema(p, name, DataSourceKind, response.DataSources)
@@ -94,6 +113,8 @@ func (p *Provider) Type() string {
94113
// Attr honors the starlark.HasAttrs interface.
95114
func (p *Provider) Attr(name string) (starlark.Value, error) {
96115
switch name {
116+
case "alias":
117+
return starlark.String(p.alias), nil
97118
case "version":
98119
return starlark.String(p.meta.Version), nil
99120
case "data":

starlark/types/provider_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import (
1313
"go.starlark.net/starlarktest"
1414
)
1515

16+
var id int
17+
1618
func init() {
17-
var id int
1819
NameGenerator = func() string {
1920
id++
2021
return fmt.Sprintf("id_%d", id)
@@ -48,6 +49,8 @@ func TestHCL(t *testing.T) {
4849
}
4950

5051
func test(t *testing.T, filename string) {
52+
id = 0
53+
5154
log.SetOutput(ioutil.Discard)
5255
thread := &starlark.Thread{Load: load}
5356
starlarktest.SetReporter(thread, t)

starlark/types/testdata/provider.star

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,9 @@ assert.eq(len(p.resource.instance), 2)
1818
p.region = "us-west-2"
1919
assert.eq(p.region, "us-west-2")
2020

21-
ignition = provider("ignition")
21+
alias = provider("aws", "2.13.0", "alias")
22+
assert.eq(alias.alias, "alias")
23+
assert.eq(alias.version, "2.13.0")
24+
25+
kwargs = provider("aws", region="foo")
26+
assert.eq(kwargs.region, "foo")

starlark/types/testdata/resource.star

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ assert.fails(lambda: qux.foo, "Resource<data.ignition_user> has no .foo field or
1818

1919
# attr id
2020
assert.eq(type(qux.id), "Computed")
21-
assert.eq(str(qux.id), '"${data.ignition_user.id_18.id}"')
21+
assert.eq(str(qux.id), '"${data.ignition_user.id_2.id}"')
2222

2323
# attr output assignation
2424
aws = provider("aws", "2.13.0")
@@ -34,7 +34,7 @@ assert.fails(invalidType, "expected bool, got string")
3434
group = aws.resource.autoscaling_group()
3535

3636
# attr optional computed
37-
assert.eq(str(group.name), '"${aws_autoscaling_group.id_22.name}"')
37+
assert.eq(str(group.name), '"${aws_autoscaling_group.id_6.name}"')
3838

3939
group.name = "foo"
4040
assert.eq(group.name, "foo")

0 commit comments

Comments
 (0)