terraforming 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.travis.yml +3 -2
  4. data/CHANGELOG.md +12 -1
  5. data/CONTRIBUTING.md +38 -0
  6. data/README.md +11 -6
  7. data/lib/terraforming/cli.rb +10 -0
  8. data/lib/terraforming/resource/efs_file_system.rb +5 -1
  9. data/lib/terraforming/resource/eip.rb +5 -1
  10. data/lib/terraforming/resource/elasti_cache_cluster.rb +5 -1
  11. data/lib/terraforming/resource/elasti_cache_subnet_group.rb +5 -1
  12. data/lib/terraforming/resource/iam_group.rb +5 -1
  13. data/lib/terraforming/resource/iam_group_membership.rb +5 -1
  14. data/lib/terraforming/resource/iam_group_policy.rb +1 -1
  15. data/lib/terraforming/resource/iam_instance_profile.rb +5 -1
  16. data/lib/terraforming/resource/iam_policy.rb +5 -1
  17. data/lib/terraforming/resource/iam_policy_attachment.rb +5 -1
  18. data/lib/terraforming/resource/iam_role.rb +5 -1
  19. data/lib/terraforming/resource/iam_role_policy.rb +1 -1
  20. data/lib/terraforming/resource/iam_user_policy.rb +1 -1
  21. data/lib/terraforming/resource/kms_alias.rb +55 -0
  22. data/lib/terraforming/resource/kms_key.rb +84 -0
  23. data/lib/terraforming/template/tf/eip.erb +1 -1
  24. data/lib/terraforming/template/tf/elasti_cache_cluster.erb +1 -1
  25. data/lib/terraforming/template/tf/elasti_cache_subnet_group.erb +1 -1
  26. data/lib/terraforming/template/tf/elastic_filesystem.erb +1 -1
  27. data/lib/terraforming/template/tf/iam_group.erb +1 -1
  28. data/lib/terraforming/template/tf/iam_group_membership.erb +1 -1
  29. data/lib/terraforming/template/tf/iam_instance_profile.erb +1 -1
  30. data/lib/terraforming/template/tf/iam_policy.erb +1 -1
  31. data/lib/terraforming/template/tf/iam_policy_attachment.erb +1 -1
  32. data/lib/terraforming/template/tf/iam_role.erb +1 -1
  33. data/lib/terraforming/template/tf/kms_alias.erb +7 -0
  34. data/lib/terraforming/template/tf/kms_key.erb +13 -0
  35. data/lib/terraforming/template/tf/redshift.erb +1 -1
  36. data/lib/terraforming/version.rb +1 -1
  37. data/lib/terraforming.rb +2 -0
  38. data/script/generate +97 -0
  39. data/templates/resource.erb.erb +3 -0
  40. data/templates/resource.rb.erb +31 -0
  41. data/templates/resource_spec.rb.erb +39 -0
  42. metadata +11 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0207edd5bbc29b4447cf4a914e4a015baff47d71
4
- data.tar.gz: dfccf028d7c75bf7a9985c918381e35844def811
3
+ metadata.gz: 56b10bc1416e5223ef01c3c49a00f6108ae1a5f3
4
+ data.tar.gz: 395f5e9a6496791ef2b33301931351d1f5d6cf10
5
5
  SHA512:
6
- metadata.gz: 61254cf936a3ab76a5ea25b3c3ce53bc9384d6ba79322932fb6340d06884ad9c2824f9d654ed4370b72da7c0f4131d6c5aa97baf7a390a748c8dbc72285906c0
7
- data.tar.gz: 59059b7a2d224657436234c2ac2c77e685346e288f81bb2427e11b071f353f2c1e828dbb20f350fbecb602631061e7efdfc63c6287287405147022956a813435
6
+ metadata.gz: d217dc1d609b1afed2681887af7f7a9590c33d9f7812d7d50fd84cc09e09b338675806048fed7138a1e8428b478c5ad2242c7f17014c9271e8f3f0f9c6066cb5
7
+ data.tar.gz: 64f11e97d09bf707ec52a525b19daa8277be537dd9ecc8859783978f03a44b4869c325f61b9d1e2b3c55fcdae5919a90a20312dad79f656650041d1da6f7c8c1
data/.rubocop.yml CHANGED
@@ -79,3 +79,6 @@ Style/CollectionMethods:
79
79
  inject: "inject"
80
80
  detect: "find"
81
81
  find_all: "select"
82
+
83
+ Style/PerlBackrefs:
84
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,7 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.1
4
- - 2.2.5
3
+ - 2.4.0
4
+ - 2.3.3
5
+ - 2.2.6
5
6
  - 2.1.10
6
7
  env:
7
8
  global:
data/CHANGELOG.md CHANGED
@@ -1,4 +1,15 @@
1
- # [v0.12.0](https://github.com/dtan4/terraforming/releases/tag/v0.11.0) (2016-12-20)
1
+ # [v0.13.0](https://github.com/dtan4/terraforming/releases/tag/v0.13.0) (2017-01-12)
2
+
3
+ ## Resource
4
+
5
+ - AWS KMS Key Alias [#300](https://github.com/dtan4/terraforming/pull/300)
6
+ - AWS KMS Key [#299](https://github.com/dtan4/terraforming/pull/299)
7
+
8
+ ## Fixed / Updated
9
+
10
+ - Normalize all resource names in tf and tfstate files [#296](https://github.com/dtan4/terraforming/pull/296) (thanks @nabarunchatterjee)
11
+
12
+ # [v0.12.0](https://github.com/dtan4/terraforming/releases/tag/v0.12.0) (2016-12-20)
2
13
 
3
14
  ## Resource
4
15
 
data/CONTRIBUTING.md CHANGED
@@ -22,3 +22,41 @@ I love pull requests from everyone! By the way, I have a favor to ask you with y
22
22
  - Command name should be abbreviation.
23
23
  - e.g. `aws_iam_group_membership`: `iamgp`
24
24
  - Please check generation result by executing `terraform plan` with real resources. There should be NO diff with generated `.tf` and `.tfstate`.
25
+
26
+ `script/generate` generates new resource code / test skeletons.
27
+
28
+ ```bash
29
+ $ script/generate ec2
30
+ ==> Generate ec2.rb
31
+ ==> Generate ec2_spec.rb
32
+ ==> Generate ec2.erb
33
+
34
+ Add below code by hand.
35
+
36
+ lib/terraforming.rb:
37
+
38
+ require "terraforming/resource/ec2"
39
+
40
+ lib/terraforming/cli.rb:
41
+
42
+ module Terraforming
43
+ class CLI < Thor
44
+
45
+ # Subcommand name should be acronym.
46
+ desc "ec2", "Ec2"
47
+ def ec2
48
+ execute(Terraforming::Resource::Ec2, options)
49
+ end
50
+
51
+ spec/lib/terraforming/cli_spec.rb:
52
+
53
+ module Terraforming
54
+ describe CLI do
55
+ context "resources" do
56
+ describe "ec2" do
57
+ let(:klass) { Terraforming::Resource::Ec2
58
+ let(:command) { :ec2 }
59
+
60
+ it_behaves_like "CLI examples"
61
+ end
62
+ ```
data/README.md CHANGED
@@ -100,6 +100,8 @@ Commands:
100
100
  terraforming iamu # IAM User
101
101
  terraforming iamup # IAM User Policy
102
102
  terraforming igw # Internet Gateway
103
+ terraforming kmsa # KMS Key Alias
104
+ terraforming kmsk # KMS Key
103
105
  terraforming lc # Launch Configuration
104
106
  terraforming nacl # Network ACL
105
107
  terraforming nat # NAT Gateway
@@ -118,11 +120,12 @@ Commands:
118
120
  terraforming vpc # VPC
119
121
 
120
122
  Options:
121
- [--merge=MERGE] # tfstate file to merge
122
- [--overwrite], [--no-overwrite] # Overwrite existng tfstate
123
- [--tfstate], [--no-tfstate] # Generate tfstate
124
- [--profile=PROFILE] # AWS credentials profile
125
- [--region=REGION] # AWS region
123
+ [--merge=MERGE] # tfstate file to merge
124
+ [--overwrite], [--no-overwrite] # Overwrite existng tfstate
125
+ [--tfstate], [--no-tfstate] # Generate tfstate
126
+ [--profile=PROFILE] # AWS credentials profile
127
+ [--region=REGION] # AWS region
128
+ [--use-bundled-cert], [--no-use-bundled-cert] # Use the bundled CA certificate from AWS SDK
126
129
  ```
127
130
 
128
131
  ### Export tf
@@ -137,7 +140,7 @@ $ terraforming <resource> [--profile PROFILE]
137
140
  $ terraforming s3
138
141
  ```
139
142
 
140
- ```go
143
+ ```hcl
141
144
  resource "aws_s3_bucket" "hoge" {
142
145
  bucket = "hoge"
143
146
  acl = "private"
@@ -375,6 +378,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
375
378
 
376
379
  ## Contributing
377
380
 
381
+ Please read [Contribution Guide](CONTRIBUTING.md) at first.
382
+
378
383
  1. Fork it ( https://github.com/dtan4/terraforming/fork )
379
384
  2. Create your feature branch (`git checkout -b my-new-feature`)
380
385
  3. Commit your changes (`git commit -am 'Add some feature'`)
@@ -119,6 +119,16 @@ module Terraforming
119
119
  execute(Terraforming::Resource::IAMUserPolicy, options)
120
120
  end
121
121
 
122
+ desc "kmsa", "KMS Key Alias"
123
+ def kmsa
124
+ execute(Terraforming::Resource::KMSAlias, options)
125
+ end
126
+
127
+ desc "kmsk", "KMS Key"
128
+ def kmsk
129
+ execute(Terraforming::Resource::KMSKey, options)
130
+ end
131
+
122
132
  desc "lc", "Launch Configuration"
123
133
  def lc
124
134
  execute(Terraforming::Resource::LaunchConfiguration, options)
@@ -29,7 +29,7 @@ module Terraforming
29
29
  "tags.Name" => efs.name,
30
30
  }
31
31
 
32
- resources["aws_efs_file_system.#{efs.file_system_id}"] = {
32
+ resources["aws_efs_file_system.#{module_name_of(efs)}"] = {
33
33
  "type" => "aws_efs_file_system",
34
34
  "depends_on" => [],
35
35
  "primary" => {
@@ -51,6 +51,10 @@ module Terraforming
51
51
  def file_systems
52
52
  @client.describe_file_systems.data.file_systems.flatten
53
53
  end
54
+
55
+ def module_name_of(efs)
56
+ normalize_module_name(efs.file_system_id)
57
+ end
54
58
  end
55
59
  end
56
60
  end
@@ -32,7 +32,7 @@ module Terraforming
32
32
  "vpc" => vpc?(addr).to_s,
33
33
  }
34
34
  attributes.delete_if { |_k, v| v.nil? }
35
- resources["aws_eip.#{addr.allocation_id}"] = {
35
+ resources["aws_eip.#{module_name_of(addr)}"] = {
36
36
  "type" => "aws_eip",
37
37
  "primary" => {
38
38
  "id" => addr.allocation_id,
@@ -53,6 +53,10 @@ module Terraforming
53
53
  def vpc?(addr)
54
54
  addr.domain.eql?("vpc")
55
55
  end
56
+
57
+ def module_name_of(addr)
58
+ normalize_module_name(addr.allocation_id)
59
+ end
56
60
  end
57
61
  end
58
62
  end
@@ -42,7 +42,7 @@ module Terraforming
42
42
  cache_cluster.cache_nodes[0].endpoint.port.to_s
43
43
  end
44
44
 
45
- resources["aws_elasticache_cluster.#{cache_cluster.cache_cluster_id}"] = {
45
+ resources["aws_elasticache_cluster.#{module_name_of(cache_cluster)}"] = {
46
46
  "type" => "aws_elasticache_cluster",
47
47
  "primary" => {
48
48
  "id" => cache_cluster.cache_cluster_id,
@@ -71,6 +71,10 @@ module Terraforming
71
71
  def security_group_names_of(cache_cluster)
72
72
  cache_cluster.cache_security_groups.map { |sg| sg.cache_security_group_name }
73
73
  end
74
+
75
+ def module_name_of(cache_cluster)
76
+ normalize_module_name(cache_cluster.cache_cluster_id)
77
+ end
74
78
  end
75
79
  end
76
80
  end
@@ -26,7 +26,7 @@ module Terraforming
26
26
  "name" => cache_subnet_group.cache_subnet_group_name,
27
27
  "subnet_ids.#" => subnet_ids_of(cache_subnet_group).length.to_s,
28
28
  }
29
- resources["aws_elasticache_subnet_group.#{cache_subnet_group.cache_subnet_group_name}"] = {
29
+ resources["aws_elasticache_subnet_group.#{module_name_of(cache_subnet_group)}"] = {
30
30
  "type" => "aws_elasticache_subnet_group",
31
31
  "primary" => {
32
32
  "id" => cache_subnet_group.cache_subnet_group_name,
@@ -47,6 +47,10 @@ module Terraforming
47
47
  def subnet_ids_of(cache_subnet_group)
48
48
  cache_subnet_group.subnets.map { |sn| sn.subnet_identifier }
49
49
  end
50
+
51
+ def module_name_of(cache_subnet_group)
52
+ normalize_module_name(cache_subnet_group.cache_subnet_group_name)
53
+ end
50
54
  end
51
55
  end
52
56
  end
@@ -28,7 +28,7 @@ module Terraforming
28
28
  "path" => group.path,
29
29
  "unique_id" => group.group_id,
30
30
  }
31
- resources["aws_iam_group.#{group.group_name}"] = {
31
+ resources["aws_iam_group.#{module_name_of(group)}"] = {
32
32
  "type" => "aws_iam_group",
33
33
  "primary" => {
34
34
  "id" => group.group_name,
@@ -45,6 +45,10 @@ module Terraforming
45
45
  def iam_groups
46
46
  @client.list_groups.map(&:groups).flatten
47
47
  end
48
+
49
+ def module_name_of(group)
50
+ normalize_module_name(group.group_name)
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -29,7 +29,7 @@ module Terraforming
29
29
  "name" => membership_name,
30
30
  "users.#" => group_members_of(group).length.to_s,
31
31
  }
32
- resources["aws_iam_group_membership.#{group.group_name}"] = {
32
+ resources["aws_iam_group_membership.#{module_name_of(group)}"] = {
33
33
  "type" => "aws_iam_group_membership",
34
34
  "primary" => {
35
35
  "id" => membership_name,
@@ -54,6 +54,10 @@ module Terraforming
54
54
  def membership_name_of(group)
55
55
  "#{group.group_name}-group-membership"
56
56
  end
57
+
58
+ def module_name_of(group)
59
+ normalize_module_name(group.group_name)
60
+ end
57
61
  end
58
62
  end
59
63
  end
@@ -42,7 +42,7 @@ module Terraforming
42
42
  private
43
43
 
44
44
  def unique_name(policy)
45
- "#{policy.group_name}_#{policy.policy_name}"
45
+ "#{normalize_module_name(policy.group_name)}_#{normalize_module_name(policy.policy_name)}"
46
46
  end
47
47
 
48
48
  def iam_group_policy_id_of(policy)
@@ -28,7 +28,7 @@ module Terraforming
28
28
  "path" => profile.path,
29
29
  "roles.#" => profile.roles.length.to_s,
30
30
  }
31
- resources["aws_iam_instance_profile.#{profile.instance_profile_name}"] = {
31
+ resources["aws_iam_instance_profile.#{module_name_of(profile)}"] = {
32
32
  "type" => "aws_iam_instance_profile",
33
33
  "primary" => {
34
34
  "id" => profile.instance_profile_name,
@@ -45,6 +45,10 @@ module Terraforming
45
45
  def iam_instance_profiles
46
46
  @client.list_instance_profiles.map(&:instance_profiles).flatten
47
47
  end
48
+
49
+ def module_name_of(profile)
50
+ normalize_module_name(profile.instance_profile_name)
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -29,7 +29,7 @@ module Terraforming
29
29
  "description" => iam_policy_description(policy),
30
30
  "policy" => prettify_policy(version.document, breakline: true, unescape: true),
31
31
  }
32
- resources["aws_iam_policy.#{policy.policy_name}"] = {
32
+ resources["aws_iam_policy.#{module_name_of(policy)}"] = {
33
33
  "type" => "aws_iam_policy",
34
34
  "primary" => {
35
35
  "id" => policy.arn,
@@ -54,6 +54,10 @@ module Terraforming
54
54
  def iam_policy_version_of(policy)
55
55
  @client.get_policy_version(policy_arn: policy.arn, version_id: policy.default_version_id).policy_version
56
56
  end
57
+
58
+ def module_name_of(policy)
59
+ normalize_module_name(policy.policy_name)
60
+ end
57
61
  end
58
62
  end
59
63
  end
@@ -29,7 +29,7 @@ module Terraforming
29
29
  "users.#" => policy_attachment[:entities].policy_users.length.to_s,
30
30
  "roles.#" => policy_attachment[:entities].policy_roles.length.to_s,
31
31
  }
32
- resources["aws_iam_policy_attachment.#{policy_attachment[:name]}"] = {
32
+ resources["aws_iam_policy_attachment.#{module_name_of(policy_attachment)}"] = {
33
33
  "type" => "aws_iam_policy_attachment",
34
34
  "primary" => {
35
35
  "id" => policy_attachment[:name],
@@ -77,6 +77,10 @@ module Terraforming
77
77
  }
78
78
  end
79
79
  end
80
+
81
+ def module_name_of(policy_attachment)
82
+ normalize_module_name(policy_attachment[:name])
83
+ end
80
84
  end
81
85
  end
82
86
  end
@@ -30,7 +30,7 @@ module Terraforming
30
30
  "path" => role.path,
31
31
  "unique_id" => role.role_id,
32
32
  }
33
- resources["aws_iam_role.#{role.role_name}"] = {
33
+ resources["aws_iam_role.#{module_name_of(role)}"] = {
34
34
  "type" => "aws_iam_role",
35
35
  "primary" => {
36
36
  "id" => role.role_name,
@@ -47,6 +47,10 @@ module Terraforming
47
47
  def iam_roles
48
48
  @client.list_roles.map(&:roles).flatten
49
49
  end
50
+
51
+ def module_name_of(role)
52
+ normalize_module_name(role.role_name)
53
+ end
50
54
  end
51
55
  end
52
56
  end
@@ -42,7 +42,7 @@ module Terraforming
42
42
  private
43
43
 
44
44
  def unique_name(policy)
45
- "#{policy.role_name}_#{policy.policy_name}"
45
+ "#{normalize_module_name(policy.role_name)}_#{normalize_module_name(policy.policy_name)}"
46
46
  end
47
47
 
48
48
  def iam_role_policy_id_of(policy)
@@ -42,7 +42,7 @@ module Terraforming
42
42
  private
43
43
 
44
44
  def unique_name(policy)
45
- "#{policy.user_name}_#{policy.policy_name}"
45
+ "#{normalize_module_name(policy.user_name)}_#{normalize_module_name(policy.policy_name)}"
46
46
  end
47
47
 
48
48
  def iam_user_policy_id_of(policy)
@@ -0,0 +1,55 @@
1
+ module Terraforming
2
+ module Resource
3
+ class KMSAlias
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::KMS::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::KMS::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/kms_alias")
20
+ end
21
+
22
+ def tfstate
23
+ aliases.inject({}) do |resources, als|
24
+ resources["aws_kms_alias.#{module_name_of(als)}"] = {
25
+ "type" => "aws_kms_alias",
26
+ "primary" => {
27
+ "id" => als.alias_name,
28
+ "attributes" => {
29
+ "arn" => als.alias_arn,
30
+ "id" => als.alias_name,
31
+ "name" => als.alias_name,
32
+ "target_key_id" => als.target_key_id,
33
+ },
34
+ },
35
+ }
36
+ resources
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def aliases
43
+ @client.list_aliases.aliases.reject { |als| managed_master_key_alias?(als) }
44
+ end
45
+
46
+ def managed_master_key_alias?(als)
47
+ als.alias_name =~ %r{\Aalias/aws/}
48
+ end
49
+
50
+ def module_name_of(als)
51
+ normalize_module_name(als.alias_name.gsub(%r{\Aalias/}, ""))
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,84 @@
1
+ module Terraforming
2
+ module Resource
3
+ class KMSKey
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::KMS::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::KMS::Client.new)
11
+ self.new(client).tfstate
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/kms_key")
20
+ end
21
+
22
+ def tfstate
23
+ keys.inject({}) do |resources, key|
24
+ resources["aws_kms_key.#{module_name_of(key)}"] = {
25
+ "type" => "aws_kms_key",
26
+ "primary" => {
27
+ "id" => key.key_id,
28
+ "attributes" => {
29
+ "arn" => key.arn,
30
+ "description" => key.description,
31
+ "enable_key_rotation" => key_rotation_status_of(key).key_rotation_enabled.to_s,
32
+ "id" => key.key_id,
33
+ "is_enabled" => key.enabled.to_s,
34
+ "key_id" => key.key_id,
35
+ "key_usage" => key_usage_of(key),
36
+ "policy" => key_policy_of(key),
37
+ },
38
+ },
39
+ }
40
+ resources
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def aliases
47
+ @aliases ||= @client.list_aliases.aliases
48
+ end
49
+
50
+ def keys
51
+ @client
52
+ .list_keys
53
+ .keys
54
+ .reject { |key| managed_master_key?(key) }
55
+ .map { |key| @client.describe_key(key_id: key.key_id) }
56
+ .map(&:key_metadata)
57
+ end
58
+
59
+ def key_policy_of(key)
60
+ policies = @client.list_key_policies(key_id: key.key_id).policy_names
61
+
62
+ return "" if policies.empty?
63
+
64
+ @client.get_key_policy(key_id: key.key_id, policy_name: policies[0]).policy
65
+ end
66
+
67
+ def key_rotation_status_of(key)
68
+ @client.get_key_rotation_status(key_id: key.key_id)
69
+ end
70
+
71
+ def key_usage_of(key)
72
+ key.key_usage.tr("_", "/")
73
+ end
74
+
75
+ def managed_master_key?(key)
76
+ !aliases.select { |a| a.target_key_id == key.key_id && a.alias_name =~ %r{\Aalias/aws/} }.empty?
77
+ end
78
+
79
+ def module_name_of(key)
80
+ normalize_module_name(key.key_id)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,5 +1,5 @@
1
1
  <% eips.each do |addr| -%>
2
- resource "aws_eip" "<%= addr.allocation_id %>" {
2
+ resource "aws_eip" "<%= module_name_of(addr) %>" {
3
3
  <% if addr.instance_id -%>
4
4
  instance = "<%= addr.instance_id %>"
5
5
  <% elsif addr.network_interface_id -%>
@@ -1,5 +1,5 @@
1
1
  <% cache_clusters.each do |cache_cluster| -%>
2
- resource "aws_elasticache_cluster" "<%= cache_cluster.cache_cluster_id %>" {
2
+ resource "aws_elasticache_cluster" "<%= module_name_of(cache_cluster) %>" {
3
3
  cluster_id = "<%= cache_cluster.cache_cluster_id %>"
4
4
  engine = "<%= cache_cluster.engine %>"
5
5
  engine_version = "<%= cache_cluster.engine_version %>"
@@ -1,5 +1,5 @@
1
1
  <% cache_subnet_groups.each do |cache_subnet_group| -%>
2
- resource "aws_elasticache_subnet_group" "<%= cache_subnet_group.cache_subnet_group_name %>" {
2
+ resource "aws_elasticache_subnet_group" "<%= module_name_of(cache_subnet_group) %>" {
3
3
  name = "<%= cache_subnet_group.cache_subnet_group_name %>"
4
4
  description = "<%= cache_subnet_group.cache_subnet_group_description %>"
5
5
  subnet_ids = <%= subnet_ids_of(cache_subnet_group).inspect %>
@@ -1,5 +1,5 @@
1
1
  <% file_systems.each_with_index do |efs, idx| -%>
2
- resource "aws_efs_file_system" "<%= efs.file_system_id %>" {
2
+ resource "aws_efs_file_system" "<%= module_name_of(efs) %>" {
3
3
  <% if efs.creation_token -%>
4
4
  creation_token = "<%= efs.creation_token %>"
5
5
  <% end -%>
@@ -1,5 +1,5 @@
1
1
  <% iam_groups.each do |group| -%>
2
- resource "aws_iam_group" "<%= group.group_name %>" {
2
+ resource "aws_iam_group" "<%= module_name_of(group) %>" {
3
3
  name = "<%= group.group_name %>"
4
4
  path = "<%= group.path %>"
5
5
  }
@@ -1,5 +1,5 @@
1
1
  <% iam_groups.each do |group| -%>
2
- resource "aws_iam_group_membership" "<%= group.group_name %>" {
2
+ resource "aws_iam_group_membership" "<%= module_name_of(group) %>" {
3
3
  name = "<%= membership_name_of(group) %>"
4
4
  users = <%= group_members_of(group).inspect %>
5
5
  group = "<%= group.group_name %>"
@@ -1,5 +1,5 @@
1
1
  <% iam_instance_profiles.each do |profile| -%>
2
- resource "aws_iam_instance_profile" "<%= profile.instance_profile_name %>" {
2
+ resource "aws_iam_instance_profile" "<%= module_name_of(profile) %>" {
3
3
  name = "<%= profile.instance_profile_name %>"
4
4
  path = "<%= profile.path %>"
5
5
  roles = <%= profile.roles.map { |role| role.role_name }.inspect %>
@@ -1,6 +1,6 @@
1
1
  <% iam_policies.each do |policy| -%>
2
2
  <%- version = iam_policy_version_of(policy) -%>
3
- resource "aws_iam_policy" "<%= policy.policy_name %>" {
3
+ resource "aws_iam_policy" "<%= module_name_of(policy) %>" {
4
4
  name = "<%= policy.policy_name %>"
5
5
  path = "<%= policy.path %>"
6
6
  description = "<%= iam_policy_description(policy) %>"
@@ -1,5 +1,5 @@
1
1
  <% iam_policy_attachments.each do |policy_attachment| -%>
2
- resource "aws_iam_policy_attachment" "<%= policy_attachment[:name] %>" {
2
+ resource "aws_iam_policy_attachment" "<%= module_name_of(policy_attachment) %>" {
3
3
  name = "<%= policy_attachment[:name] %>"
4
4
  policy_arn = "<%= policy_attachment[:arn] %>"
5
5
  groups = <%= policy_attachment[:entities].policy_groups.map(&:group_name).inspect %>
@@ -1,5 +1,5 @@
1
1
  <% iam_roles.each do |role| -%>
2
- resource "aws_iam_role" "<%= role.role_name %>" {
2
+ resource "aws_iam_role" "<%= module_name_of(role) %>" {
3
3
  name = "<%= role.role_name %>"
4
4
  path = "<%= role.path %>"
5
5
  assume_role_policy = <<POLICY
@@ -0,0 +1,7 @@
1
+ <% aliases.each do |als| -%>
2
+ resource "aws_kms_alias" "<%= module_name_of(als) %>" {
3
+ name = "<%= als.alias_name %>"
4
+ target_key_id = "<%= als.target_key_id %>"
5
+ }
6
+
7
+ <% end -%>
@@ -0,0 +1,13 @@
1
+ <% keys.each do |key| -%>
2
+ resource "aws_kms_key" "<%= module_name_of(key) %>" {
3
+ description = "<%= key.description %>"
4
+ key_usage = "<%= key_usage_of(key) %>"
5
+ is_enabled = <%= key.enabled %>
6
+ enable_key_rotation = <%= key_rotation_status_of(key).key_rotation_enabled %>
7
+
8
+ policy = <<POLICY
9
+ <%= key_policy_of(key).strip %>
10
+ POLICY
11
+ }
12
+
13
+ <% end -%>
@@ -1,5 +1,5 @@
1
1
  <% clusters.each do |cluster| -%>
2
- resource "aws_redshift_cluster" "<%= cluster.cluster_identifier %>" {
2
+ resource "aws_redshift_cluster" "<%= module_name_of(cluster) %>" {
3
3
  cluster_identifier = "<%= cluster.cluster_identifier %>"
4
4
  <%- if cluster.db_name -%>
5
5
  database_name = "<%= cluster.db_name %>"
@@ -1,3 +1,3 @@
1
1
  module Terraforming
2
- VERSION = "0.12.0"
2
+ VERSION = "0.13.0"
3
3
  end
data/lib/terraforming.rb CHANGED
@@ -30,6 +30,8 @@ require "terraforming/resource/iam_role"
30
30
  require "terraforming/resource/iam_role_policy"
31
31
  require "terraforming/resource/iam_user"
32
32
  require "terraforming/resource/iam_user_policy"
33
+ require "terraforming/resource/kms_alias"
34
+ require "terraforming/resource/kms_key"
33
35
  require "terraforming/resource/launch_configuration"
34
36
  require "terraforming/resource/internet_gateway"
35
37
  require "terraforming/resource/nat_gateway"
data/script/generate ADDED
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "erb"
4
+
5
+ USAGE = <<-EOS
6
+ Usage: script/generate RESOURCE
7
+ RESOURCE must be snake_case
8
+
9
+ Example:
10
+ script/generate EC2
11
+ EOS
12
+
13
+ def camelize(string)
14
+ string
15
+ .sub(/^[a-z\d]*/) { |match| match.capitalize }
16
+ .gsub(%r{(?:_|(/))([a-z\d]*)}i) { "#{$1}#{$2.capitalize}" }
17
+ .gsub('/'.freeze, '::'.freeze)
18
+ end
19
+
20
+ def generate_resource_erb(resource)
21
+ template = File.join("templates", "resource.erb.erb")
22
+ ERB.new(open(template).read, nil, "-").result(binding)
23
+ end
24
+
25
+ def generate_resource_rb(resource)
26
+ template = File.expand_path(File.join("templates", "resource.rb.erb"))
27
+ ERB.new(open(template).read, nil, "-").result(binding)
28
+ end
29
+
30
+ def generate_resource_spec_rb(resource)
31
+ template = File.join("templates", "resource_spec.rb.erb")
32
+ ERB.new(open(template).read, nil, "-").result(binding)
33
+ end
34
+
35
+ def humanize(string)
36
+ string
37
+ .sub(/\A_+/, ''.freeze)
38
+ .sub(/_id\z/, ''.freeze)
39
+ .tr('_'.freeze, ' '.freeze)
40
+ .gsub(/([a-z\d]*)/i) { |match| match.downcase }
41
+ .split(" ")
42
+ .map { |w| w[0].upcase + w[1..-1] }
43
+ .join(" ")
44
+ end
45
+
46
+
47
+
48
+ if ARGV.length != 1
49
+ $stderr.puts USAGE
50
+ exit 1
51
+ end
52
+
53
+ resource = ARGV[0]
54
+
55
+ puts "==> Generate #{resource}.rb"
56
+ resource_rb = generate_resource_rb(resource)
57
+ File.open(File.join("lib", "terraforming", "resource", "#{resource}.rb"), "w+") { |f| f.write(resource_rb) }
58
+
59
+ puts "==> Generate #{resource}_spec.rb"
60
+ resource_spec_rb = generate_resource_spec_rb(resource)
61
+ File.open(File.join("spec", "lib", "terraforming", "resource", "#{resource}_spec.rb"), "w+") { |f| f.write(resource_spec_rb) }
62
+
63
+ puts "==> Generate #{resource}.erb"
64
+ resource_erb = generate_resource_erb(resource)
65
+ File.open(File.join("lib", "terraforming", "template", "tf", "#{resource}.erb"), "w+") { |f| f.write(resource_erb) }
66
+
67
+ puts <<-EOS
68
+
69
+ Add below code by hand.
70
+
71
+ lib/terraforming.rb:
72
+
73
+ require "terraforming/resource/#{resource}"
74
+
75
+ lib/terraforming/cli.rb:
76
+
77
+ module Terraforming
78
+ class CLI < Thor
79
+
80
+ # Subcommand name should be acronym.
81
+ desc "#{resource}", "#{humanize(resource)}"
82
+ def #{resource}
83
+ execute(Terraforming::Resource::#{camelize(resource)}, options)
84
+ end
85
+
86
+ spec/lib/terraforming/cli_spec.rb:
87
+
88
+ module Terraforming
89
+ describe CLI do
90
+ context "resources" do
91
+ describe "#{resource}" do
92
+ let(:klass) { Terraforming::Resource::#{camelize(resource)} }
93
+ let(:command) { :#{resource} }
94
+
95
+ it_behaves_like "CLI examples"
96
+ end
97
+ EOS
@@ -0,0 +1,3 @@
1
+ resource "aws_<%= resource %>" "resource_name" {
2
+
3
+ }
@@ -0,0 +1,31 @@
1
+ module Terraforming
2
+ module Resource
3
+ class <%= camelize(resource) %>
4
+ include Terraforming::Util
5
+
6
+ # TODO: Select appropriate Client class from here:
7
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
8
+ def self.tf(client: Aws::SomeResource::Client.new)
9
+ self.new(client).tf
10
+ end
11
+
12
+ # TODO: Select appropriate Client class from here:
13
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
14
+ def self.tfstate(client: Aws::SomeResource::Client.new)
15
+ self.new(client).tfstate
16
+ end
17
+
18
+ def initialize(client)
19
+ @client = client
20
+ end
21
+
22
+ def tf
23
+ apply_template(@client, "tf/<%= resource %>")
24
+ end
25
+
26
+ def tfstate
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ module Terraforming
4
+ module Resource
5
+ describe <%= camelize(resource) %> do
6
+ let(:client) do
7
+ # TODO: Select appropriate Client class from here:
8
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
9
+ Aws::SomeResource::Client.new(stub_responses: true)
10
+ end
11
+
12
+ describe ".tf" do
13
+ xit "should generate tf" do
14
+ expect(described_class.tf(client: client)).to eq <<-EOS
15
+ resource "aws_<%= resource %>" "resource_name" {
16
+
17
+ }
18
+
19
+ EOS
20
+ end
21
+ end
22
+
23
+ describe ".tfstate" do
24
+ xit "should generate tfstate" do
25
+ expect(described_class.tfstate(client: client)).to eq({
26
+ "aws_<%= resource %>.resource_name" => {
27
+ "type" => "aws_<%= resource %>",
28
+ "primary" => {
29
+ "id" => "",
30
+ "attributes" => {
31
+ }
32
+ }
33
+ }
34
+ })
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terraforming
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daisuke Fujita
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-20 00:00:00.000000000 Z
11
+ date: 2017-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -169,6 +169,8 @@ files:
169
169
  - lib/terraforming/resource/iam_user.rb
170
170
  - lib/terraforming/resource/iam_user_policy.rb
171
171
  - lib/terraforming/resource/internet_gateway.rb
172
+ - lib/terraforming/resource/kms_alias.rb
173
+ - lib/terraforming/resource/kms_key.rb
172
174
  - lib/terraforming/resource/launch_configuration.rb
173
175
  - lib/terraforming/resource/nat_gateway.rb
174
176
  - lib/terraforming/resource/network_acl.rb
@@ -208,6 +210,8 @@ files:
208
210
  - lib/terraforming/template/tf/iam_user.erb
209
211
  - lib/terraforming/template/tf/iam_user_policy.erb
210
212
  - lib/terraforming/template/tf/internet_gateway.erb
213
+ - lib/terraforming/template/tf/kms_alias.erb
214
+ - lib/terraforming/template/tf/kms_key.erb
211
215
  - lib/terraforming/template/tf/launch_configuration.erb
212
216
  - lib/terraforming/template/tf/nat_gateway.erb
213
217
  - lib/terraforming/template/tf/network_acl.erb
@@ -227,7 +231,11 @@ files:
227
231
  - lib/terraforming/util.rb
228
232
  - lib/terraforming/version.rb
229
233
  - script/console
234
+ - script/generate
230
235
  - script/setup
236
+ - templates/resource.erb.erb
237
+ - templates/resource.rb.erb
238
+ - templates/resource_spec.rb.erb
231
239
  - terraforming.gemspec
232
240
  homepage: https://github.com/dtan4/terraforming
233
241
  licenses:
@@ -249,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
257
  version: '0'
250
258
  requirements: []
251
259
  rubyforge_project:
252
- rubygems_version: 2.5.2
260
+ rubygems_version: 2.6.8
253
261
  signing_key:
254
262
  specification_version: 4
255
263
  summary: Export existing AWS resources to Terraform style (tf, tfstate)