terraforming 0.0.5 → 0.1.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/README.md +12 -2
  4. data/lib/terraforming.rb +4 -0
  5. data/lib/terraforming/cli.rb +33 -20
  6. data/lib/terraforming/resource/db_parameter_group.rb +5 -5
  7. data/lib/terraforming/resource/db_security_group.rb +5 -5
  8. data/lib/terraforming/resource/db_subnet_group.rb +5 -5
  9. data/lib/terraforming/resource/ec2.rb +5 -5
  10. data/lib/terraforming/resource/elb.rb +9 -5
  11. data/lib/terraforming/resource/iam_group.rb +5 -5
  12. data/lib/terraforming/resource/iam_group_policy.rb +6 -6
  13. data/lib/terraforming/resource/iam_instance_profile.rb +52 -0
  14. data/lib/terraforming/resource/iam_policy.rb +6 -6
  15. data/lib/terraforming/resource/iam_role.rb +53 -0
  16. data/lib/terraforming/resource/iam_role_policy.rb +69 -0
  17. data/lib/terraforming/resource/iam_user.rb +5 -5
  18. data/lib/terraforming/resource/iam_user_policy.rb +6 -6
  19. data/lib/terraforming/resource/network_acl.rb +10 -5
  20. data/lib/terraforming/resource/rds.rb +5 -5
  21. data/lib/terraforming/resource/route53_record.rb +5 -5
  22. data/lib/terraforming/resource/route53_zone.rb +5 -5
  23. data/lib/terraforming/resource/s3.rb +5 -5
  24. data/lib/terraforming/resource/security_group.rb +86 -7
  25. data/lib/terraforming/resource/subnet.rb +5 -5
  26. data/lib/terraforming/resource/vpc.rb +5 -5
  27. data/lib/terraforming/template/tf/elb.erb +4 -1
  28. data/lib/terraforming/template/tf/iam_group_policy.erb +1 -1
  29. data/lib/terraforming/template/tf/iam_instance_profile.erb +8 -0
  30. data/lib/terraforming/template/tf/iam_policy.erb +1 -1
  31. data/lib/terraforming/template/tf/iam_role.erb +10 -0
  32. data/lib/terraforming/template/tf/iam_role_policy.erb +10 -0
  33. data/lib/terraforming/template/tf/iam_user_policy.erb +1 -1
  34. data/lib/terraforming/template/tf/network_acl.erb +2 -1
  35. data/lib/terraforming/template/tf/security_group.erb +11 -2
  36. data/lib/terraforming/util.rb +21 -6
  37. data/lib/terraforming/version.rb +1 -1
  38. data/terraforming.gemspec +1 -1
  39. metadata +11 -12
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class IAMGroupPolicy
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::IAM::Client.new)
6
+ def self.tf(client: Aws::IAM::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::IAM::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,13 +19,13 @@ module Terraforming
19
19
  apply_template(@client, "tf/iam_group_policy")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = iam_group_policies.inject({}) do |result, policy|
24
24
  attributes = {
25
25
  "group" => policy.group_name,
26
26
  "id" => iam_group_policy_id_of(policy),
27
27
  "name" => policy.policy_name,
28
- "policy" => CGI.unescape(policy.policy_document)
28
+ "policy" => prettify_policy(policy.policy_document, true)
29
29
  }
30
30
  result["aws_iam_group_policy.#{policy.policy_name}"] = {
31
31
  "type" => "aws_iam_group_policy",
@@ -38,7 +38,7 @@ module Terraforming
38
38
  result
39
39
  end
40
40
 
41
- generate_tfstate(resources)
41
+ generate_tfstate(resources, tfstate_base)
42
42
  end
43
43
 
44
44
  private
@@ -0,0 +1,52 @@
1
+ module Terraforming
2
+ module Resource
3
+ class IAMInstanceProfile
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::IAM::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/iam_instance_profile")
20
+ end
21
+
22
+ def tfstate(tfstate_base)
23
+ resources = iam_instance_profiles.inject({}) do |result, profile|
24
+ attributes = {
25
+ "arn" => profile.arn,
26
+ "id" => profile.instance_profile_name,
27
+ "name" => profile.instance_profile_name,
28
+ "path" => profile.path,
29
+ "roles.#" => profile.roles.length.to_s,
30
+ }
31
+ result["aws_iam_instance_profile.#{profile.instance_profile_name}"] = {
32
+ "type" => "aws_iam_instance_profile",
33
+ "primary" => {
34
+ "id" => profile.instance_profile_name,
35
+ "attributes" => attributes
36
+ }
37
+ }
38
+
39
+ result
40
+ end
41
+
42
+ generate_tfstate(resources, tfstate_base)
43
+ end
44
+
45
+ private
46
+
47
+ def iam_instance_profiles
48
+ @client.list_instance_profiles.instance_profiles
49
+ end
50
+ end
51
+ end
52
+ end
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class IAMPolicy
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::IAM::Client.new)
6
+ def self.tf(client: Aws::IAM::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::IAM::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,14 +19,14 @@ module Terraforming
19
19
  apply_template(@client, "tf/iam_policy")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = iam_policies.inject({}) do |result, policy|
24
24
  version = iam_policy_version_of(policy)
25
25
  attributes = {
26
26
  "id" => policy.arn,
27
27
  "name" => policy.policy_name,
28
28
  "path" => policy.path,
29
- "policy" => CGI.unescape(version.document),
29
+ "policy" => prettify_policy(version.document, true),
30
30
  }
31
31
  result["aws_iam_policy.#{policy.policy_name}"] = {
32
32
  "type" => "aws_iam_policy",
@@ -39,7 +39,7 @@ module Terraforming
39
39
  result
40
40
  end
41
41
 
42
- generate_tfstate(resources)
42
+ generate_tfstate(resources, tfstate_base)
43
43
  end
44
44
 
45
45
  private
@@ -0,0 +1,53 @@
1
+ module Terraforming
2
+ module Resource
3
+ class IAMRole
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::IAM::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/iam_role")
20
+ end
21
+
22
+ def tfstate(tfstate_base)
23
+ resources = iam_roles.inject({}) do |result, role|
24
+ attributes = {
25
+ "arn" => role.arn,
26
+ "assume_role_policy" => prettify_policy(role.assume_role_policy_document, true),
27
+ "id" => role.role_name,
28
+ "name" => role.role_name,
29
+ "path" => role.path,
30
+ "unique_id" => role.role_id,
31
+ }
32
+ result["aws_iam_role.#{role.role_name}"] = {
33
+ "type" => "aws_iam_role",
34
+ "primary" => {
35
+ "id" => role.role_name,
36
+ "attributes" => attributes
37
+ }
38
+ }
39
+
40
+ result
41
+ end
42
+
43
+ generate_tfstate(resources, tfstate_base)
44
+ end
45
+
46
+ private
47
+
48
+ def iam_roles
49
+ @client.list_roles.roles
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,69 @@
1
+ module Terraforming
2
+ module Resource
3
+ class IAMRolePolicy
4
+ include Terraforming::Util
5
+
6
+ def self.tf(client: Aws::IAM::Client.new)
7
+ self.new(client).tf
8
+ end
9
+
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ def tf
19
+ apply_template(@client, "tf/iam_role_policy")
20
+ end
21
+
22
+ def tfstate(tfstate_base)
23
+ resources = iam_role_policies.inject({}) do |result, policy|
24
+ attributes = {
25
+ "id" => iam_role_policy_id_of(policy),
26
+ "name" => policy.policy_name,
27
+ "policy" => prettify_policy(policy.policy_document, true),
28
+ "role" => policy.role_name,
29
+ }
30
+ result["aws_iam_role_policy.#{policy.policy_name}"] = {
31
+ "type" => "aws_iam_role_policy",
32
+ "primary" => {
33
+ "id" => iam_role_policy_id_of(policy),
34
+ "attributes" => attributes
35
+ }
36
+ }
37
+
38
+ result
39
+ end
40
+
41
+ generate_tfstate(resources, tfstate_base)
42
+ end
43
+
44
+ private
45
+
46
+ def iam_roles
47
+ @client.list_roles.roles
48
+ end
49
+
50
+ def iam_role_policy_id_of(policy)
51
+ "#{policy.role_name}:#{policy.policy_name}"
52
+ end
53
+
54
+ def iam_role_policy_names_in(role)
55
+ @client.list_role_policies(role_name: role.role_name).policy_names
56
+ end
57
+
58
+ def iam_role_policy_of(role, policy_name)
59
+ @client.get_role_policy(role_name: role.role_name, policy_name: policy_name)
60
+ end
61
+
62
+ def iam_role_policies
63
+ iam_roles.map do |role|
64
+ iam_role_policy_names_in(role).map { |policy_name| iam_role_policy_of(role, policy_name) }
65
+ end.flatten
66
+ end
67
+ end
68
+ end
69
+ end
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class IAMUser
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::IAM::Client.new)
6
+ def self.tf(client: Aws::IAM::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::IAM::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,7 +19,7 @@ module Terraforming
19
19
  apply_template(@client, "tf/iam_user")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = iam_users.inject({}) do |result, user|
24
24
  attributes = {
25
25
  "arn"=> user.arn,
@@ -39,7 +39,7 @@ module Terraforming
39
39
  result
40
40
  end
41
41
 
42
- generate_tfstate(resources)
42
+ generate_tfstate(resources, tfstate_base)
43
43
  end
44
44
 
45
45
  private
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class IAMUserPolicy
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::IAM::Client.new)
6
+ def self.tf(client: Aws::IAM::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::IAM::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::IAM::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,12 +19,12 @@ module Terraforming
19
19
  apply_template(@client, "tf/iam_user_policy")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = iam_user_policies.inject({}) do |result, policy|
24
24
  attributes = {
25
25
  "id" => iam_user_policy_id_of(policy),
26
26
  "name" => policy.policy_name,
27
- "policy" => CGI.unescape(policy.policy_document),
27
+ "policy" => prettify_policy(policy.policy_document, true),
28
28
  "user" => policy.user_name,
29
29
  }
30
30
  result["aws_iam_user_policy.#{policy.policy_name}"] = {
@@ -38,7 +38,7 @@ module Terraforming
38
38
  result
39
39
  end
40
40
 
41
- generate_tfstate(resources)
41
+ generate_tfstate(resources, tfstate_base)
42
42
  end
43
43
 
44
44
  private
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class NetworkACL
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::EC2::Client.new)
6
+ def self.tf(client: Aws::EC2::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::EC2::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::EC2::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,12 +19,13 @@ module Terraforming
19
19
  apply_template(@client, "tf/network_acl")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = network_acls.inject({}) do |result, network_acl|
24
24
  attributes = {
25
25
  "egress.#" => egresses_of(network_acl).length.to_s,
26
26
  "id" => network_acl.network_acl_id,
27
27
  "ingress.#" => ingresses_of(network_acl).length.to_s,
28
+ "subnet_ids.#" => subnet_ids_of(network_acl).length.to_s,
28
29
  "tags.#" => network_acl.tags.length.to_s,
29
30
  "vpc_id" => network_acl.vpc_id,
30
31
  }
@@ -39,7 +40,7 @@ module Terraforming
39
40
  result
40
41
  end
41
42
 
42
- generate_tfstate(resources)
43
+ generate_tfstate(resources, tfstate_base)
43
44
  end
44
45
 
45
46
  private
@@ -72,6 +73,10 @@ module Terraforming
72
73
  @client.describe_network_acls.network_acls
73
74
  end
74
75
 
76
+ def subnet_ids_of(network_acl)
77
+ network_acl.associations.map { |association| association.subnet_id }
78
+ end
79
+
75
80
  def to_port_of(entry)
76
81
  entry.port_range ? entry.port_range.to : 0
77
82
  end
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class RDS
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::RDS::Client.new)
6
+ def self.tf(client: Aws::RDS::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::RDS::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::RDS::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,7 +19,7 @@ module Terraforming
19
19
  apply_template(@client, "tf/rds")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = db_instances.inject({}) do |result, instance|
24
24
  attributes = {
25
25
  "address" => instance.endpoint.address,
@@ -59,7 +59,7 @@ module Terraforming
59
59
  result
60
60
  end
61
61
 
62
- generate_tfstate(resources)
62
+ generate_tfstate(resources, tfstate_base)
63
63
  end
64
64
 
65
65
  private
@@ -3,12 +3,12 @@ module Terraforming
3
3
  class Route53Record
4
4
  include Terraforming::Util
5
5
 
6
- def self.tf(client = Aws::Route53::Client.new)
6
+ def self.tf(client: Aws::Route53::Client.new)
7
7
  self.new(client).tf
8
8
  end
9
9
 
10
- def self.tfstate(client = Aws::Route53::Client.new)
11
- self.new(client).tfstate
10
+ def self.tfstate(client: Aws::Route53::Client.new, tfstate_base: nil)
11
+ self.new(client).tfstate(tfstate_base)
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -19,7 +19,7 @@ module Terraforming
19
19
  apply_template(@client, "tf/route53_record")
20
20
  end
21
21
 
22
- def tfstate
22
+ def tfstate(tfstate_base)
23
23
  resources = records.inject({}) do |result, r|
24
24
  record, zone_id = r[:record], r[:zone_id]
25
25
  record_id = record_id_of(record, zone_id)
@@ -48,7 +48,7 @@ module Terraforming
48
48
  result
49
49
  end
50
50
 
51
- generate_tfstate(resources)
51
+ generate_tfstate(resources, tfstate_base)
52
52
  end
53
53
 
54
54
  private