Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(lib): allow chaining of TerraformIterator created resources #3272

Merged
merged 18 commits into from
Nov 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions examples/csharp/documentation/IteratorStack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,82 @@ public IteratorStack(Construct scope, string name) : base(scope, name)
}
});
// DOCS_BLOCK_END:iterators-count

// DOCS_BLOCK_START:iterators-chain
// We need a local to be able to pass the list to the iterator
TerraformLocal configuration = new TerraformLocal(this, "configuration", new Dictionary<string, object> {
{
"website",
new Dictionary<string, object> {
{ "name", "website-static-files" },
{ "tags", new Dictionary<string, string> {
{ "app", "website" }
}}
}
},
{
"images",
new Dictionary<string, object> {
{ "name", "images" },
{ "tags", new Dictionary<string, string> {
{ "app", "image-converter" }
}}
}
}
});
MapTerraformIterator s3BucketConfigurationIterator = MapTerraformIterator.FromMap(configuration.AsAnyMap);
S3Bucket s3Buckets = new S3Bucket(this, "complex-iterator-buckets", new S3BucketConfig
{
ForEach = s3BucketConfigurationIterator,
Bucket = s3BucketConfigurationIterator.GetString("name"),
Tags = mapIterator.GetStringMap("tags")
});

// This would be TerraformIterator.fromDataSources for data_sources
TerraformIterator s3BucketsIterator = TerraformIterator.FromResources(s3Buckets);
TerraformAsset helpFile = new TerraformAsset(this, "help", new TerraformAssetConfig
{
Path = "./help"
});
new S3BucketObject(this, "object", new S3BucketObjectConfig
{
ForEach = s3BucketsIterator,
Bucket = s3BucketsIterator.GetString("id"),
Key = "help",
Source = helpFile.Path
});
// DOCS_BLOCK_END:iterators-chain

/*
// DOCS_BLOCK_START:iterators-for-expression
TerraformLocal values = new TerraformLocal(this, "iterator-values", new Dictionary<string, object> {
{
"website",
new Dictionary<string, object> {
{ "name", "website-static-files" },
{ "tags", new Dictionary<string, string> {
{ "app", "website" }
}}
}
},
{
"images",
new Dictionary<string, object> {
{ "name", "images" },
{ "tags", new Dictionary<string, string> {
{ "app", "image-converter" }
}}
}
}
});
MapTerraformIterator mapIterator = MapTerraformIterator.FromMap(values.AsAnyMap);
new TerraformLocal(this, "list-of-keys", mapIterator.Keys());
new TerraformLocal(this, "list-of-values", mapIterator.Values());
new TerraformLocal(this, "list-of-names", mapIterator.PluckProperty("name"));
new TerraformLocal(this, "list-of-names-of-included", mapIterator.ForExpressionForList("val.name if val.included"));
new TerraformLocal(this, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.ForExpressionForMap("val.name", "val.tags if val.included"));
// DOCS_BLOCK_END:iterators-for-expression
*/
}
}
}
7 changes: 4 additions & 3 deletions examples/csharp/documentation/MyTerraformStack.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<WarningLevel>0</WarningLevel>
<NoWarn>CS8602</NoWarn>

</PropertyGroup>

<ItemGroup>
Expand Down Expand Up @@ -39,8 +40,8 @@
<ItemGroup>
<ProjectReference Include=".gen\vpc\vpc.csproj" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include=".gen\eks\eks.csproj" />
</ItemGroup>
</Project>
</Project>
1 change: 1 addition & 0 deletions examples/go/documentation/help
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Help file
52 changes: 52 additions & 0 deletions examples/go/documentation/iterators.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/hashicorp/aws/instance"
aws "github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/hashicorp/aws/provider"
"github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/hashicorp/aws/s3bucket"
"github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/hashicorp/aws/s3bucketobject"
"github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/integrations/github/datagithuborganization"
github "github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/integrations/github/provider"
"github.com/hashicorp/terraform-cdk/examples/go/documentation/generated/integrations/github/team"
Expand Down Expand Up @@ -98,5 +99,56 @@ func NewIteratorsStack(scope constructs.Construct, name string) cdktf.TerraformS
})
// DOCS_BLOCK_END:iterators-count

// DOCS_BLOCK_START:iterators-chain
config := cdktf.NewTerraformLocal(stack, jsii.String("config-local"), []map[string]interface{}{
{
"name": "website-static-files",
"tags": map[string]string{"app": "website"},
},
{
"name": "images",
"tags": map[string]string{"app": "image-converter"},
},
})

s3BucketConfigurationIterator := cdktf.TerraformIterator_FromList(config.Expression())
s3Buckets := s3bucket.NewS3Bucket(stack, jsii.String("complex-iterator-buckets"), &s3bucket.S3BucketConfig{
ForEach: s3BucketConfigurationIterator,
Bucket: s3BucketConfigurationIterator.GetString(jsii.String("name")),
Tags: s3BucketConfigurationIterator.GetStringMap(jsii.String("tags")),
})

s3BucketsIterator := cdktf.TerraformIterator_FromResources(s3Buckets)
helpFile := cdktf.NewTerraformAsset(stack, jsii.String("help"), &cdktf.TerraformAssetConfig{
Path: jsii.String("./help"),
})
s3bucketobject.NewS3BucketObject(stack, jsii.String("object"), &s3bucketobject.S3BucketObjectConfig{
ForEach: s3BucketsIterator,
Bucket: s3BucketsIterator.GetString(jsii.String("id")),
Key: jsii.String("help"),
Source: helpFile.Path(),
})
// DOCS_BLOCK_END:iterators-chain

// DOCS_BLOCK_START:iterators-for-expression
values := cdktf.NewTerraformLocal(stack, jsii.String("values"), []map[string]interface{}{
{
"name": "website-static-files",
"tags": map[string]string{"app": "website"},
},
{
"name": "images",
"tags": map[string]string{"app": "image-converter"},
},
})

mapIterator := cdktf.TerraformIterator_FromList(values.Expression())
cdktf.NewTerraformLocal(stack, jsii.String("list-of-keys"), mapIterator.Keys())
cdktf.NewTerraformLocal(stack, jsii.String("list-of-values"), mapIterator.Values())
cdktf.NewTerraformLocal(stack, jsii.String("list-of-names"), mapIterator.PluckProperty(jsii.String("name")))
cdktf.NewTerraformLocal(stack, jsii.String("list-of-names-of-included"), mapIterator.ForExpressionForList(jsii.String("val.name if val.included")))
cdktf.NewTerraformLocal(stack, jsii.String("map-with-names-as-key-and-tags-as-value-of-included"), mapIterator.ForExpressionForMap(jsii.String("val.name"), jsii.String("val.tags if val.included")))
// DOCS_BLOCK_END:iterators-for-expression

return stack
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
import com.hashicorp.cdktf.*;
import imports.aws.s3_bucket.S3Bucket;
import imports.aws.s3_bucket.S3BucketConfig;
import imports.aws.s3_bucket_object.S3BucketObject;
import imports.aws.s3_bucket_object.S3BucketObjectConfig;
import software.constructs.Construct;
import imports.aws.provider.AwsProvider;
import imports.aws.provider.AwsProviderConfig;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.nio.file.Paths;

public class MainIterator2 extends TerraformStack {
public MainIterator2(Construct scope, String id) {
super(scope, id);
Expand All @@ -32,5 +40,88 @@ public MainIterator2(Construct scope, String id) {
.bucket(Token.asString(terraformIterator.getString("")))
.build());
// DOCS_BLOCK_END:iterators-define-iterators

// DOCS_BLOCK_START:iterators-chain
TerraformLocal myComplexLocal = new TerraformLocal(this, "my-map", new HashMap() {
{
put("website", new HashMap() {
{
put("name", "website-static-files");
put("tags", new HashMap<String, String>() {
{
put("app", "website");
}
});
}
});
put("images", new HashMap() {
{
put("name", "images");
put("tags", new HashMap<String, String>() {
{
put("app", "image-converter");
}
});
}
});
}
});

TerraformIterator s3BucketConfigurationIterator = TerraformIterator.fromMap(myComplexLocal.getAsAnyMap());
S3Bucket s3Bucket = new S3Bucket(this, "buckets", S3BucketConfig.builder()
.forEach(s3BucketConfigurationIterator)
.bucket(s3BucketConfigurationIterator.getString("name"))
.tags(s3BucketConfigurationIterator.getStringMap("tags"))
.build());

TerraformAsset asset = new TerraformAsset(this, "help", TerraformAssetConfig.builder()
.path(Paths.get(System.getProperty("user.dir"), "help").toString())
.build()
);

// This would be TerraformIterator.fromDataSources for data_sources
TerraformIterator s3BucketIterator = TerraformIterator.fromResources(s3Bucket);
new S3BucketObject(this, "object", S3BucketObjectConfig.builder()
.forEach(s3BucketIterator)
.bucket(s3BucketIterator.getString("id"))
.key("help")
.source(asset.getPath())
.build()
);
// DOCS_BLOCK_END:iterators-chain

// DOCS_BLOCK_START:iterators-for-expression
TerraformLocal values = new TerraformLocal(this, "values", new HashMap() {
{
put("website", new HashMap() {
{
put("name", "website-static-files");
put("tags", new HashMap<String, String>() {
{
put("app", "website");
}
});
}
});
put("images", new HashMap() {
{
put("name", "images");
put("tags", new HashMap<String, String>() {
{
put("app", "image-converter");
}
});
}
});
}
});

TerraformIterator mapIterator = TerraformIterator.fromMap(values.getAsAnyMap());
new TerraformLocal(this, "list-of-keys", mapIterator.keys());
new TerraformLocal(this, "list-of-values", mapIterator.values());
new TerraformLocal(this, "list-of-names", mapIterator.pluckProperty("name"));
new TerraformLocal(this, "list-of-names-of-included", mapIterator.forExpressionForList("val.name if val.included"));
new TerraformLocal(this, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.forExpressionForMap("val.name", "val.tags if val.included"));
// DOCS_BLOCK_END:iterators-for-expression
}
}
59 changes: 58 additions & 1 deletion examples/python/documentation/iterators.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0

from cdktf import TerraformStack, Token, App, TerraformCount
from cdktf import TerraformStack, Token, TerraformCount, TerraformAsset
from constructs import Construct
from imports.aws.provider import AwsProvider
from imports.aws.instance import Instance
from imports.github.data_github_organization import DataGithubOrganization
from imports.github.provider import GithubProvider
from imports.github.team import Team
from imports.github.team_members import TeamMembers
from imports.aws.s3_bucket_object import S3BucketObject


# DOCS_BLOCK_START:iterators-define-iterators,iterators-iterators-complex-types
from imports.aws.s3_bucket import S3Bucket
Expand Down Expand Up @@ -105,3 +107,58 @@ def __init__(self, scope: Construct, id: str):
})
)
# DOCS_BLOCK_END:iterators-list-attributes

# DOCS_BLOCK_START:iterators-chain
map = TerraformLocal(self, "my-map", {
"website": {
"name": "website-static-files",
"tags": {"app": "website"}
},
"images": {
"name": "images",
"tags": {"app": "image-converter"}
}
})
s3_bucket_configuration_iterator = TerraformIterator.from_map(
map=map.as_any_map
)
s3_buckets = S3Bucket(self, "complex-iterator-buckets",
for_each=s3_bucket_configuration_iterator,
bucket=s3_bucket_configuration_iterator.get_string("name"),
tags=s3_bucket_configuration_iterator.get_map("tags")
)

# This would be TerraformIterator.from_data_sources for data_sources
s3_buckets_iterator = TerraformIterator.from_resources(s3_buckets)
help_file = TerraformAsset(self, "help",
path="./help"
)
S3BucketObject(self, "object",
for_each=s3_buckets_iterator,
bucket=s3_buckets_iterator.get_string("id"),
key="help",
source=help_file.path
)
# DOCS_BLOCK_END:iterators-chain


# DOCS_BLOCK_START:iterators-for-expression
values = TerraformLocal(self, "map-local", {
"website": {
"name": "website-static-files",
"tags": {"app": "website"}
},
"images": {
"name": "images",
"tags": {"app": "image-converter"}
}
})
mapIterator = TerraformIterator.from_map(
map=values.as_any_map
)
TerraformLocal(self, "list-of-keys", mapIterator.keys())
TerraformLocal(self, "list-of-values", mapIterator.values())
TerraformLocal(self, "list-of-names", mapIterator.pluck_property("name"))
TerraformLocal(self, "list-of-names-of-included", mapIterator.for_expression_for_list("val.name if val.included"))
TerraformLocal(self, "map-with-names-as-key-and-tags-as-value-of-included", mapIterator.for_expression_for_map("val.name", "val.tags if val.included"))
# DOCS_BLOCK_END:iterators-for-expression
2 changes: 1 addition & 1 deletion examples/typescript/documentation/aspect-tagging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// SPDX-License-Identifier: MPL-2.0
// DOCS_BLOCK_START:aspect-tagging
import { Construct, IConstruct } from "constructs";
import { Aspects, IAspect, TerraformStack, App } from "cdktf";
import { Aspects, IAspect, TerraformStack } from "cdktf";
import { AwsProvider } from "./.gen/providers/aws/provider";
import { S3Bucket } from "./.gen/providers/aws/s3-bucket";

Expand Down
11 changes: 7 additions & 4 deletions examples/typescript/documentation/cdktf.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
{
"language": "typescript",
"app": "npx ts-node main.ts",
"app": "npx tsc && npx tsx main.ts",
"terraformProviders": [
"aws@~> 3.0",
"kubernetes@~> 2.0",
"random@~> 3.1"
"aws@~> 5.26",
"kubernetes@~> 2.23",
"random@~> 3.5",
"dnsimple/dnsimple@~> 1.3",
"integrations/github@~> 5.42"

],
"terraformModules": [
"terraform-aws-modules/vpc/aws@~> 3.0",
Expand Down
Loading
Loading