practice_terraforming 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4510b6b15bd49f015c16da4633554e11faed8e43
4
- data.tar.gz: 07e6b2fd44fd6a531d30ed90b95c6c5eef9e8487
3
+ metadata.gz: b42585c37ce1598af09698143df455795bca85f1
4
+ data.tar.gz: 49986467336da38ef6b73b87083e21ef5509704c
5
5
  SHA512:
6
- metadata.gz: f33ef2d0902a23427eac11f2a922d1708987f4aadd7dd552d77e56c373b8cd75b7ad980cecad9988c6d2085c058a5a7664939f42c5ad71d8925e6db9b02afa55
7
- data.tar.gz: dd33fef40a74793bd1e271c966e5f5f57534ffdc864a7152e92bad22a6737fd52379835631b51b8744f65f0d8823c3229be1dc7deef23cbdbd23659c4c5f7ea9
6
+ metadata.gz: fef6df2db079223937804390f0e8907234b4a704d58d38a706f2a78a45bf3265ecfe0fc76e01a05866ececfafd116500db1c7498dc8cbda5182331bd8d834d52
7
+ data.tar.gz: 0c92d2943898a7b4c4ca3cf7cb81fe6f5abac565eccc85a5eb583dc0f101723fb395a8d3d8f7b215a0e63e6ce0c2aa8b88b8e6bd4a3250e75c2da07c1d0ba0b2
data/README.md CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  # PracticeTerraforming
4
4
 
5
- This is just for practice!
5
+ ## Description
6
+
7
+ This is just for practice! There's not `IAMRolePolicyAttachment`, `IAMUserPolicyAttachment` and `IAMGroupPolicyAttachment` in the original repo. So, I implemented them and also sent pull requests. This repo is used to check before sending those pull requests.
6
8
 
7
9
  ## Installation
8
10
 
9
- Add this line to your application's Gemfile:
11
+ Add this line to your application's Gemfile (https://rubygems.org/gems/practice_terraforming):
10
12
 
11
13
  ```ruby
12
14
  gem 'practice_terraforming'
@@ -32,7 +34,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
34
 
33
35
  ## Contributing
34
36
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/practice_terraforming. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
37
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nakamasato/practice_terraforming. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
38
 
37
39
  ## License
38
40
 
@@ -40,7 +42,7 @@ The gem is available as open source under the terms of the [MIT License](https:/
40
42
 
41
43
  ## Code of Conduct
42
44
 
43
- Everyone interacting in the PracticeTerraforming project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/practice_terraforming/blob/master/CODE_OF_CONDUCT.md).
45
+ Everyone interacting in the PracticeTerraforming project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/nakamasato/practice_terraforming/blob/master/CODE_OF_CONDUCT.md).
44
46
 
45
47
  # How I created this
46
48
 
@@ -104,46 +106,46 @@ Wrote dependencies with `spec.add_dependency` and `spec.add_development_dependen
104
106
 
105
107
  ## Create Resource
106
108
 
107
- 0. generate templates with `script/generate`
109
+ `. generate templates with `script/generate`
108
110
 
109
- ```
110
- script/generate iam_policy_attachment
111
- ==> Generate iam_policy_attachment.rb
112
- ==> Generate iam_policy_attachment_spec.rb
113
- ==> Generate iam_policy_attachment.erb
111
+ ```
112
+ script/generate iam_policy_attachment
113
+ ==> Generate iam_policy_attachment.rb
114
+ ==> Generate iam_policy_attachment_spec.rb
115
+ ==> Generate iam_policy_attachment.erb
114
116
 
115
- Add below code by hand.
117
+ Add below code by hand.
116
118
 
117
- lib/practice_terraforming.rb:
119
+ lib/practice_terraforming.rb:
118
120
 
119
- require "practice_terraforming/resource/iam_policy_attachment"
121
+ require "practice_terraforming/resource/iam_policy_attachment"
120
122
 
121
- lib/practice_terraforming/cli.rb:
123
+ lib/practice_terraforming/cli.rb:
122
124
 
123
- module PracticeTerraforming
124
- class CLI < Thor
125
+ module PracticeTerraforming
126
+ class CLI < Thor
125
127
 
126
- # Subcommand name should be acronym.
127
- desc "iam_policy_attachment", "Iam Policy Attachment"
128
- def iam_policy_attachment
129
- execute(PracticeTerraforming::Resource::IamPolicyAttachment, options)
130
- end
128
+ # Subcommand name should be acronym.
129
+ desc "iam_policy_attachment", "Iam Policy Attachment"
130
+ def iam_policy_attachment
131
+ execute(PracticeTerraforming::Resource::IamPolicyAttachment, options)
132
+ end
131
133
 
132
- spec/lib/practice_terraforming/cli_spec.rb:
134
+ spec/lib/practice_terraforming/cli_spec.rb:
133
135
 
134
- module PracticeTerraforming
135
- describe CLI do
136
- context "resources" do
137
- describe "iam_policy_attachment" do
138
- let(:klass) { PracticeTerraforming::Resource::IamPolicyAttachment }
139
- let(:command) { :iam_policy_attachment }
136
+ module PracticeTerraforming
137
+ describe CLI do
138
+ context "resources" do
139
+ describe "iam_policy_attachment" do
140
+ let(:klass) { PracticeTerraforming::Resource::IamPolicyAttachment }
141
+ let(:command) { :iam_policy_attachment }
140
142
 
141
- it_behaves_like "CLI examples"
142
- end
143
- ```
143
+ it_behaves_like "CLI examples"
144
+ end
145
+ ```
144
146
 
145
147
  1. As the message says, add those codes.
146
- 2. `lib/practice_terraforming/resource/iam_policy_attachment.rb`: Change Aws client and write logic in `tfstate` method
148
+ 1. `lib/practice_terraforming/resource/iam_policy_attachment.rb`: Change Aws client and write logic in `tfstate` method
147
149
 
148
150
  Use aws-sdk-<resource> to get the input data and write the logic to generate tf/tfstate file.
149
151
  1. tf -> only need to update the template file, which appears in the next step
@@ -153,7 +155,7 @@ spec/lib/practice_terraforming/cli_spec.rb:
153
155
  - <api method name, e.g. entities_for_policy> -> get the resource info with aws-sdk
154
156
  - other -> make a list of resources to be used in `tfstate` method
155
157
 
156
- 3. `lib/practice_terraforming/template/tf/iam_policy_attachment.erb`: Update the erb based on the corresponding terraform resource.
158
+ 1. `lib/practice_terraforming/template/tf/iam_policy_attachment.erb`: Update the erb based on the corresponding terraform resource.
157
159
 
158
160
  ```
159
161
  <% iam_policy_attachments.each do |policy_attachment| -%>
@@ -168,53 +170,53 @@ spec/lib/practice_terraforming/cli_spec.rb:
168
170
  <% end -%>
169
171
  ```
170
172
 
171
- 4. `spec/lib/practice_terraforming/resource/iam_policy_attachment_spec.rb`: Change Aws client and write test for tf and tfstate
173
+ 1. `spec/lib/practice_terraforming/resource/iam_policy_attachment_spec.rb`: Change Aws client and write test for tf and tfstate
172
174
 
173
175
  Test Perspective:
174
176
  1. Create aws sdk result using stub.
175
177
  2. Use the module to generate tf/tfstate.
176
178
  3. Compare expected one and generated one.
177
- ```
178
- irb(main):007:0> client.list_policies.policies[0]
179
- => #<struct Aws::IAM::Types::Policy policy_name="test-policy", policy_id="ABCDEFG", arn="arn:aws:iam::123456789:policy/test-policy", path="/", default_version_id="v1", attachment_count=1, permissions_boundary_usage_count=0, is_attachable=true, description=nil, create_date=2019-01-01 00:00:00 UTC, update_date=2019-01-02 00:00:00 UTC>
180
- client.list_entities_for_policy(policy_arn: "arn:aws:iam::351540792571:policy/ai-suggest-batch-user-policy")
181
- irb(main):008:0> client.list_entities_for_policy(policy_arn: "arn:aws:iam::123456789:policy/test-policy")
182
- => #<struct Aws::IAM::Types::ListEntitiesForPolicyResponse policy_groups=[#<struct Aws::IAM::Types::PolicyGroup group_name="test-group", group_id="ABCDEFG">], policy_users=[], policy_roles=[], is_truncated=false, marker=nil>
183
- ```
184
179
 
185
- ```
186
- let(:policies) do
187
- [
180
+ ```
181
+ irb(main):007:0> client.list_policies.policies[0]
182
+ => #<struct Aws::IAM::Types::Policy policy_name="test-policy", policy_id="ABCDEFG", arn="arn:aws:iam::123456789:policy/test-policy", path="/", default_version_id="v1", attachment_count=1, permissions_boundary_usage_count=0, is_attachable=true, description=nil, create_date=2019-01-01 00:00:00 UTC, update_date=2019-01-02 00:00:00 UTC>
183
+ irb(main):008:0> client.list_entities_for_policy(policy_arn: "arn:aws:iam::123456789:policy/test-policy")
184
+ => #<struct Aws::IAM::Types::ListEntitiesForPolicyResponse policy_groups=[#<struct Aws::IAM::Types::PolicyGroup group_name="test-group", group_id="ABCDEFG">], policy_users=[], policy_roles=[], is_truncated=false, marker=nil>
185
+ ```
186
+
187
+ ```
188
+ let(:policies) do
189
+ [
190
+ {
191
+ policy_name: "test-policy",
192
+ policy_id: "ABCDEFG",
193
+ arn: "arn:aws:iam::123456789:policy/test-policy",
194
+ path: "/",
195
+ default_version_id: "v1",
196
+ attachment_count: 1,
197
+ is_attachable: true,
198
+ create_date: Time.parse("2019-01-01 00:00:00 UTC"),
199
+ update_date: Time.parse("2019-01-02 00:00:00 UTC"),
200
+ description: nil,
201
+ }
202
+ ]
203
+ end
204
+
205
+ let(:entities_for_policy) do
188
206
  {
189
- policy_name: "test-policy",
190
- policy_id: "ABCDEFG",
191
- arn: "arn:aws:iam::123456789:policy/test-policy",
192
- path: "/",
193
- default_version_id: "v1",
194
- attachment_count: 1,
195
- is_attachable: true,
196
- create_date: Time.parse("2019-01-01 00:00:00 UTC"),
197
- update_date: Time.parse("2019-01-02 00:00:00 UTC"),
198
- description: nil,
199
- }
200
- ]
201
- end
202
-
203
- let(:entities_for_policy) do
204
- {
205
- policy_groups: [
206
- { group_name: "test-group", group_id: "ABCDEFG" },
207
- ],
208
- policy_users: [],
209
- policy_roles: [],
210
- }
211
- end
212
-
213
- before do
214
- client.stub_responses(:list_policies, policies: policies)
215
- client.stub_responses(:list_entities_for_policy, [entities_for_policy])
216
- end
217
- ```
207
+ policy_groups: [
208
+ { group_name: "test-group", group_id: "ABCDEFG" },
209
+ ],
210
+ policy_users: [],
211
+ policy_roles: [],
212
+ }
213
+ end
214
+
215
+ before do
216
+ client.stub_responses(:list_policies, policies: policies)
217
+ client.stub_responses(:list_entities_for_policy, [entities_for_policy])
218
+ end
219
+ ```
218
220
 
219
221
  ## Install on local
220
222
 
@@ -245,7 +247,10 @@ Done installing documentation for practice_terraforming after 0 seconds
245
247
  practice_terraforming
246
248
  Commands:
247
249
  practice_terraforming help [COMMAND] # Describe available commands or one specific command
250
+ practice_terraforming iampa # Iam Policy Attachment
248
251
  practice_terraforming iamr # Iam Role
252
+ practice_terraforming iamrpa # Iam Role Policy Attachment
253
+ practice_terraforming iamupa # Iam User Policy Attachment
249
254
  practice_terraforming s3 # S3
250
255
 
251
256
  Options:
@@ -257,3 +262,11 @@ Options:
257
262
  [--assume=ASSUME] # Role ARN to assume
258
263
  [--use-bundled-cert], [--no-use-bundled-cert] # Use the bundled CA certificate from AWS SDK
259
264
  ```
265
+
266
+ ## Table for aws-sdk and terraforming
267
+
268
+ |terraforming resource|aws-sdk|
269
+ |---|---|
270
+ |IAMRolePolicyAttachment|`list_roles` and `list_attached_role_policies` for all extracted roles |
271
+ |IAMGroupPolicyAttachment|`list_users` and `list_attached_user_policies` for all extracted users|
272
+ |IAMGroupPolicyAttachment|`list_groups` and `list_attached_group_policies` for all extracted groups|
@@ -33,6 +33,11 @@ module PracticeTerraforming
33
33
  execute(PracticeTerraforming::Resource::IamRolePolicyAttachment, options)
34
34
  end
35
35
 
36
+ desc "iamupa", "Iam User Policy Attachment"
37
+ def iamupa
38
+ execute(PracticeTerraforming::Resource::IAMUserPolicyAttachment, options)
39
+ end
40
+
36
41
  private
37
42
 
38
43
  def configure_aws(options)
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PracticeTerraforming
4
+ module Resource
5
+ class IAMUserPolicyAttachment
6
+ include PracticeTerraforming::Util
7
+
8
+ # TODO: Select appropriate Client class from here:
9
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
10
+ def self.tf(client: Aws::IAM::Client.new)
11
+ self.new(client).tf
12
+ end
13
+
14
+ # TODO: Select appropriate Client class from here:
15
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
16
+ def self.tfstate(client: Aws::IAM::Client.new)
17
+ self.new(client).tfstate
18
+ end
19
+
20
+ def initialize(client)
21
+ @client = client
22
+ end
23
+
24
+ def tf
25
+ apply_template(@client, "tf/iam_user_policy_attachment")
26
+ end
27
+
28
+ def tfstate
29
+ iam_user_policy_attachments.inject({}) do |resources, user_policy_attachment|
30
+ attributes = {
31
+ "id" => user_policy_attachment[:name],
32
+ "policy_arn" => user_policy_attachment[:policy_arn],
33
+ "user" => user_policy_attachment[:user]
34
+ }
35
+ resources["aws_iam_user_policy_attachment.#{module_name_of(user_policy_attachment)}"] = {
36
+ "type" => "aws_iam_user_policy_attachment",
37
+ "primary" => {
38
+ "id" => user_policy_attachment[:name],
39
+ "attributes" => attributes
40
+ }
41
+ }
42
+
43
+ resources
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def attachment_name_from(user, policy)
50
+ "#{user.user_name}-#{policy.policy_name}-attachment"
51
+ end
52
+
53
+ def iam_users
54
+ @client.list_users.map(&:users).flatten
55
+ end
56
+
57
+ def policies_attached_to(user)
58
+ @client.list_attached_user_policies(user_name: user.user_name).attached_policies
59
+ end
60
+
61
+ def iam_user_policy_attachments
62
+ iam_users.map do |user|
63
+ policies_attached_to(user).map do |policy|
64
+ {
65
+ user: user.user_name,
66
+ policy_arn: policy.policy_arn,
67
+ name: attachment_name_from(user, policy)
68
+ }
69
+ end
70
+ end.flatten
71
+ end
72
+
73
+ def module_name_of(user_policy_attachment)
74
+ normalize_module_name(user_policy_attachment[:name])
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ <% iam_user_policy_attachments.each do |user_policy_attachment| -%>
2
+ resource "aws_iam_user_policy_attachment" "<%= module_name_of(user_policy_attachment) %>" {
3
+ policy_arn = "<%= user_policy_attachment[:policy_arn] %>"
4
+ user = "<%= user_policy_attachment[:user] %>"
5
+ }
6
+
7
+ <% end -%>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PracticeTerraforming
4
- VERSION = '0.1.3'
4
+ VERSION = '0.1.4'
5
5
  end
@@ -12,5 +12,6 @@ require 'practice_terraforming/version'
12
12
  require "practice_terraforming/cli"
13
13
  require "practice_terraforming/resource/iam_role"
14
14
  require "practice_terraforming/resource/iam_role_policy_attachment"
15
+ require "practice_terraforming/resource/iam_user_policy_attachment"
15
16
  require "practice_terraforming/resource/iam_policy_attachment"
16
17
  require "practice_terraforming/resource/s3"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: practice_terraforming
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - masatonaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-10 00:00:00.000000000 Z
11
+ date: 2019-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-iam
@@ -161,10 +161,12 @@ files:
161
161
  - lib/practice_terraforming/resource/iam_policy_attachment.rb
162
162
  - lib/practice_terraforming/resource/iam_role.rb
163
163
  - lib/practice_terraforming/resource/iam_role_policy_attachment.rb
164
+ - lib/practice_terraforming/resource/iam_user_policy_attachment.rb
164
165
  - lib/practice_terraforming/resource/s3.rb
165
166
  - lib/practice_terraforming/template/tf/iam_policy_attachment.erb
166
167
  - lib/practice_terraforming/template/tf/iam_role.erb
167
168
  - lib/practice_terraforming/template/tf/iam_role_policy_attachment.erb
169
+ - lib/practice_terraforming/template/tf/iam_user_policy_attachment.erb
168
170
  - lib/practice_terraforming/template/tf/s3.erb
169
171
  - lib/practice_terraforming/util.rb
170
172
  - lib/practice_terraforming/version.rb