terraforming 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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)