fog-aws 0.4.0 → 0.4.1

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -1
  3. data/lib/fog/aws/dns.rb +1 -1
  4. data/lib/fog/aws/iam.rb +57 -20
  5. data/lib/fog/aws/iam/default_policies.json +1574 -0
  6. data/lib/fog/aws/iam/default_policies.rb +15 -0
  7. data/lib/fog/aws/iam/default_policy_versions.json +3372 -0
  8. data/lib/fog/aws/iam/paged_collection.rb +54 -0
  9. data/lib/fog/aws/models/compute/flavors.rb +95 -35
  10. data/lib/fog/aws/models/elb/load_balancer.rb +9 -10
  11. data/lib/fog/aws/models/elb/policies.rb +24 -9
  12. data/lib/fog/aws/models/elb/policy.rb +9 -10
  13. data/lib/fog/aws/models/iam/group.rb +33 -2
  14. data/lib/fog/aws/models/iam/groups.rb +2 -22
  15. data/lib/fog/aws/models/iam/managed_policies.rb +63 -0
  16. data/lib/fog/aws/models/iam/managed_policy.rb +38 -0
  17. data/lib/fog/aws/models/iam/policies.rb +19 -15
  18. data/lib/fog/aws/models/iam/user.rb +34 -2
  19. data/lib/fog/aws/parsers/iam/list_managed_policies.rb +25 -0
  20. data/lib/fog/aws/parsers/iam/policy_version.rb +33 -0
  21. data/lib/fog/aws/region_methods.rb +1 -1
  22. data/lib/fog/aws/requests/compute/allocate_address.rb +21 -19
  23. data/lib/fog/aws/requests/iam/attach_group_policy.rb +26 -0
  24. data/lib/fog/aws/requests/iam/attach_user_policy.rb +30 -4
  25. data/lib/fog/aws/requests/iam/create_access_key.rb +6 -5
  26. data/lib/fog/aws/requests/iam/detach_group_policy.rb +26 -0
  27. data/lib/fog/aws/requests/iam/detach_user_policy.rb +26 -0
  28. data/lib/fog/aws/requests/iam/get_policy.rb +57 -0
  29. data/lib/fog/aws/requests/iam/get_policy_version.rb +59 -0
  30. data/lib/fog/aws/requests/iam/get_user.rb +7 -0
  31. data/lib/fog/aws/requests/iam/list_attached_group_policies.rb +89 -0
  32. data/lib/fog/aws/requests/iam/list_attached_user_policies.rb +89 -0
  33. data/lib/fog/aws/requests/iam/list_policies.rb +47 -2
  34. data/lib/fog/aws/signaturev4.rb +14 -12
  35. data/lib/fog/aws/version.rb +1 -1
  36. data/tests/models/iam/managed_policies_tests.rb +67 -0
  37. data/tests/models/iam/users_tests.rb +20 -0
  38. data/tests/requests/compute/address_tests.rb +33 -20
  39. data/tests/signaturev4_tests.rb +7 -0
  40. metadata +14 -2
@@ -17,7 +17,7 @@ module Fog
17
17
  # * response<~Excon::Response>:
18
18
  # * body<~Hash>:
19
19
  # * 'RequestId'<~String> - Id of the request
20
- # * 'IsTruncated'<~Boolean>
20
+ # * 'IsTruncated'<~Boolean>
21
21
  # * 'Marker'<~String>
22
22
  # * 'Policies'<~Array>:
23
23
  # * Arn
@@ -41,7 +41,52 @@ module Fog
41
41
  end
42
42
  end
43
43
 
44
-
44
+ class Mock
45
+ def list_policies(options={})
46
+ limit = options['MaxItems']
47
+ marker = options['Marker']
48
+
49
+ if limit
50
+ if limit > 1_000
51
+ raise Fog::AWS::IAM::Error.new(
52
+ "ValidationError => 1 validation error detected: Value '#{limit}' at 'limit' failed to satisfy constraint: Member must have value less than or equal to 1000"
53
+ )
54
+ elsif limit < 1
55
+ raise Fog::AWS::IAM::Error.new(
56
+ "ValidationError => 1 validation error detected: Value '#{limit}' at 'limit' failed to satisfy constraint: Member must have value greater than or equal to 1"
57
+ )
58
+ end
59
+ end
60
+
61
+ data_set = if marker
62
+ self.data[:markers][marker] || []
63
+ else
64
+ self.data[:managed_policies].values
65
+ end
66
+
67
+ data = data_set.slice!(0, limit || 100)
68
+ truncated = data_set.size > 0
69
+ marker = truncated && Base64.encode64("metadata/l/#{account_id}/#{UUID.uuid}")
70
+
71
+ response = Excon::Response.new
72
+
73
+ body = {
74
+ 'Policies' => data,
75
+ 'IsTruncated' => truncated,
76
+ 'RequestId' => Fog::AWS::Mock.request_id
77
+ }
78
+
79
+ if marker
80
+ self.data[:markers][marker] = data_set
81
+ body.merge!('Marker' => marker)
82
+ end
83
+
84
+ response.body = body
85
+ response.status = 200
86
+
87
+ response
88
+ end
89
+ end
45
90
  end
46
91
  end
47
92
  end
@@ -79,18 +79,20 @@ DATA
79
79
  protected
80
80
 
81
81
  def canonical_path(path)
82
- #leading and trailing repeated slashes are collapsed, but not ones that appear elsewhere
83
- path = path.gsub(%r{\A/+},'/').gsub(%r{/+\z},'/')
84
- components = path.split('/',-1)
85
- path = components.inject([]) do |acc, component|
86
- case component
87
- when '.' #canonicalize by removing .
88
- when '..' then acc.pop#canonicalize by reducing ..
89
- else
90
- acc << component
91
- end
92
- acc
93
- end.join('/')
82
+ unless @service == 's3' #S3 implements signature v4 different - paths are not canonialized
83
+ #leading and trailing repeated slashes are collapsed, but not ones that appear elsewhere
84
+ path = path.gsub(%r{\A/+},'/').gsub(%r{/+\z},'/')
85
+ components = path.split('/',-1)
86
+ path = components.inject([]) do |acc, component|
87
+ case component
88
+ when '.' #canonicalize by removing .
89
+ when '..' then acc.pop#canonicalize by reducing ..
90
+ else
91
+ acc << component
92
+ end
93
+ acc
94
+ end.join('/')
95
+ end
94
96
  path.empty? ? '/' : path
95
97
  end
96
98
 
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AWS
3
- VERSION = "0.4.0"
3
+ VERSION = "0.4.1"
4
4
  end
5
5
  end
@@ -0,0 +1,67 @@
1
+ Shindo.tests("Fog::Compute[:iam] | managed_policies", ['aws','iam']) do
2
+
3
+ iam = Fog::AWS[:iam]
4
+
5
+ tests('#all').succeeds do
6
+ iam.managed_policies.size == 100
7
+ end
8
+
9
+ tests('#each').succeeds do
10
+ policies = []
11
+
12
+ iam.managed_policies.each { |policy| policies << policy }
13
+
14
+ policies.size > 100
15
+ end
16
+
17
+ policy = iam.managed_policies.get("arn:aws:iam::aws:policy/IAMReadOnlyAccess")
18
+
19
+ tests("#document").succeeds do
20
+ policy.document == {
21
+ "Version" => "2012-10-17",
22
+ "Statement" => [
23
+ {
24
+ "Effect" => "Allow",
25
+ "Action" => [ "iam:GenerateCredentialReport", "iam:Get*", "iam:List*" ],
26
+ "Resource" => "*"
27
+ }
28
+ ]
29
+ }
30
+ end
31
+
32
+ tests("users") do
33
+ user = iam.users.create(:id => uniq_id("fog-test-user"))
34
+
35
+ tests("#attach").succeeds do
36
+ user.attach(policy)
37
+
38
+ user.attached_policies.map(&:identity) == [policy.identity]
39
+ end
40
+
41
+ tests("#detach").succeeds do
42
+ user.detach(policy)
43
+
44
+ user.attached_policies.map(&:identity) == []
45
+ end
46
+
47
+ user.destroy
48
+ end
49
+
50
+ tests("groups") do
51
+ group = iam.groups.create(:name => uniq_id("fog-test-group"))
52
+
53
+ tests("#attach").succeeds do
54
+ group.attach(policy)
55
+
56
+ group.attached_policies.map(&:identity) == [policy.identity]
57
+ end
58
+
59
+ tests("#detach").succeeds do
60
+ group.detach(policy)
61
+
62
+ group.attached_policies.map(&:identity) == []
63
+ end
64
+
65
+ group.destroy
66
+ end
67
+ end
@@ -56,6 +56,26 @@ Shindo.tests("Fog::Compute[:iam] | users", ['aws','iam']) do
56
56
  user.access_keys.empty?
57
57
  end
58
58
 
59
+ # test that users create in mock and be signed in via access key and share data
60
+ if Fog.mocking?
61
+ tests("mocking access key usage") do
62
+ access_key = user.access_keys.create
63
+
64
+ user_client = Fog::AWS::IAM.new(
65
+ :aws_access_key_id => access_key.identity,
66
+ :aws_secret_access_key => access_key.secret_access_key
67
+ )
68
+
69
+ tests("sets correct data").succeeds do
70
+ user_client.users.size > 1
71
+ end
72
+
73
+ tests("set current user name").succeeds do
74
+ user_client.current_user_name == user.identity
75
+ end
76
+ end
77
+ end
78
+
59
79
  tests('#password=nil', 'without a password').succeeds do
60
80
  user.password = nil
61
81
  user.password_created_at.nil?
@@ -1,4 +1,5 @@
1
1
  Shindo.tests('Fog::Compute[:aws] | address requests', ['aws']) do
2
+ compute = Fog::Compute[:aws]
2
3
 
3
4
  @addresses_format = {
4
5
  'addressesSet' => [{
@@ -10,7 +11,7 @@ Shindo.tests('Fog::Compute[:aws] | address requests', ['aws']) do
10
11
  }],
11
12
  'requestId' => String
12
13
  }
13
- @server = Fog::Compute[:aws].servers.create
14
+ @server = compute.servers.create
14
15
  @server.wait_for { ready? }
15
16
  @ip_address = @server.public_ip_address
16
17
 
@@ -21,81 +22,93 @@ Shindo.tests('Fog::Compute[:aws] | address requests', ['aws']) do
21
22
  @vpc_allocation_id = nil
22
23
 
23
24
  tests('#allocate_address').formats({'domain' => String, 'publicIp' => String, 'requestId' => String}) do
24
- data = Fog::Compute[:aws].allocate_address.body
25
+ data = compute.allocate_address.body
25
26
  @public_ip = data['publicIp']
26
27
  data
27
28
  end
28
29
 
29
30
  tests("#allocate_address('vpc')").formats({'domain' => String, 'publicIp' => String, 'allocationId' => String, 'requestId' => String}) do
30
- data = Fog::Compute[:aws].allocate_address('vpc').body
31
+ data = compute.allocate_address('vpc').body
31
32
  @vpc_public_ip = data['publicIp']
32
33
  @vpc_allocation_id = data['allocationId']
33
34
  data
34
35
  end
35
36
 
36
37
  tests('#describe_addresses').formats(@addresses_format) do
37
- Fog::Compute[:aws].describe_addresses.body
38
+ compute.describe_addresses.body
38
39
  end
39
40
 
40
41
  tests("#describe_addresses('public-ip' => #{@public_ip}')").formats(@addresses_format) do
41
- Fog::Compute[:aws].describe_addresses('public-ip' => @public_ip).body
42
+ compute.describe_addresses('public-ip' => @public_ip).body
42
43
  end
43
44
 
44
45
  tests("#associate_addresses('#{@server.identity}', '#{@public_ip}')").formats(AWS::Compute::Formats::BASIC) do
45
- Fog::Compute[:aws].associate_address(@server.identity, @public_ip).body
46
+ compute.associate_address(@server.identity, @public_ip).body
46
47
  end
47
48
 
48
49
  tests("#associate_addresses({:instance_id=>'#{@server.identity}', :public_ip=>'#{@public_ip}'})").formats(AWS::Compute::Formats::BASIC) do
49
- Fog::Compute[:aws].associate_address({:instance_id=>@server.identity,:public_ip=> @public_ip}).body
50
+ compute.associate_address({:instance_id=>@server.identity,:public_ip=> @public_ip}).body
50
51
  end
51
52
 
52
53
  tests("#dissassociate_address('#{@public_ip}')").formats(AWS::Compute::Formats::BASIC) do
53
- Fog::Compute[:aws].disassociate_address(@public_ip).body
54
+ compute.disassociate_address(@public_ip).body
54
55
  end
55
56
 
56
57
  tests("#associate_addresses('#{@server.id}', nil, nil, '#{@vpc_allocation_id}')").formats(AWS::Compute::Formats::BASIC) do
57
- Fog::Compute[:aws].associate_address(@server.id, nil, nil, @vpc_allocation_id).body
58
+ compute.associate_address(@server.id, nil, nil, @vpc_allocation_id).body
58
59
  end
59
60
 
60
61
  tests("#associate_addresses({:instance_id=>'#{@server.id}', :allocation_id=>'#{@vpc_allocation_id}'})").formats(AWS::Compute::Formats::BASIC) do
61
- Fog::Compute[:aws].associate_address({:instance_id=>@server.id, :allocation_id=>@vpc_allocation_id}).body
62
+ compute.associate_address({:instance_id=>@server.id, :allocation_id=>@vpc_allocation_id}).body
62
63
  end
63
64
 
64
65
  tests("#release_address('#{@public_ip}')").formats(AWS::Compute::Formats::BASIC) do
65
- Fog::Compute[:aws].release_address(@public_ip).body
66
+ compute.release_address(@public_ip).body
66
67
  end
67
68
 
68
69
  tests("#release_address('#{@vpc_allocation_id}')").formats(AWS::Compute::Formats::BASIC) do
69
- Fog::Compute[:aws].release_address(@vpc_allocation_id).body
70
+ compute.release_address(@vpc_allocation_id).body
70
71
  end
71
72
  end
73
+
72
74
  tests('failure') do
73
75
 
74
- @address = Fog::Compute[:aws].addresses.create
75
- @vpc_address = Fog::Compute[:aws].addresses.create(:domain => 'vpc')
76
+ @address = compute.addresses.create
77
+ @vpc_address = compute.addresses.create(:domain => 'vpc')
76
78
 
77
79
  tests("#associate_addresses({:instance_id =>'i-00000000', :public_ip => '#{@address.identity}')}").raises(Fog::Compute::AWS::NotFound) do
78
- Fog::Compute[:aws].associate_address({:instance_id => 'i-00000000', :public_ip => @address.identity})
80
+ compute.associate_address({:instance_id => 'i-00000000', :public_ip => @address.identity})
79
81
  end
80
82
 
81
83
  tests("#associate_addresses({:instance_id =>'#{@server.identity}', :public_ip => '127.0.0.1'})").raises(Fog::Compute::AWS::Error) do
82
- Fog::Compute[:aws].associate_address({:instance_id => @server.identity, :public_ip => '127.0.0.1'})
84
+ compute.associate_address({:instance_id => @server.identity, :public_ip => '127.0.0.1'})
83
85
  end
84
86
 
85
87
  tests("#associate_addresses({:instance_id =>'i-00000000', :public_ip => '127.0.0.1'})").raises(Fog::Compute::AWS::NotFound) do
86
- Fog::Compute[:aws].associate_address({:instance_id =>'i-00000000', :public_ip =>'127.0.0.1'})
88
+ compute.associate_address({:instance_id =>'i-00000000', :public_ip =>'127.0.0.1'})
87
89
  end
88
90
 
89
91
  tests("#disassociate_addresses('127.0.0.1') raises BadRequest error").raises(Fog::Compute::AWS::Error) do
90
- Fog::Compute[:aws].disassociate_address('127.0.0.1')
92
+ compute.disassociate_address('127.0.0.1')
91
93
  end
92
94
 
93
95
  tests("#release_address('127.0.0.1')").raises(Fog::Compute::AWS::Error) do
94
- Fog::Compute[:aws].release_address('127.0.0.1')
96
+ compute.release_address('127.0.0.1')
95
97
  end
96
98
 
97
99
  tests("#release_address('#{@vpc_address.identity}')").raises(Fog::Compute::AWS::Error) do
98
- Fog::Compute[:aws].release_address(@vpc_address.identity)
100
+ compute.release_address(@vpc_address.identity)
101
+ end
102
+
103
+ if Fog.mocking?
104
+ old_limit = compute.data[:limits][:addresses]
105
+
106
+ tests("#allocate_address", "limit exceeded").raises(Fog::Compute::AWS::Error) do
107
+ compute.data[:limits][:addresses] = 0
108
+ compute.allocate_address
109
+ end
110
+
111
+ compute.data[:limits][:addresses] = old_limit
99
112
  end
100
113
 
101
114
  @address.destroy
@@ -96,5 +96,12 @@ Shindo.tests('AWS | signaturev4', ['aws']) do
96
96
  end
97
97
  end
98
98
 
99
+ tests("s3 signer does not normalize path") do
100
+ signer=Fog::AWS::SignatureV4.new('AKIDEXAMPLE', 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY', 'us-east-1','s3')
101
+ returns(signer.sign({:query => {}, :headers => {'Host' => 'host.foo.com', 'Date' => 'Mon, 09 Sep 2011 23:36:00 GMT'}, :method => :get, :path => '//foo/../bar/./'}, @now)) do
102
+ 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/s3/aws4_request, SignedHeaders=date;host, Signature=72407ad06b8e5750360f42e8aad9f33a0be363bcfeecdcae0aea58c99709fb4a'
103
+ end
104
+ end
105
+
99
106
  Fog::Time.now = ::Time.now
100
107
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-27 00:00:00.000000000 Z
12
+ date: 2015-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -149,6 +149,10 @@ files:
149
149
  - lib/fog/aws/federation.rb
150
150
  - lib/fog/aws/glacier.rb
151
151
  - lib/fog/aws/iam.rb
152
+ - lib/fog/aws/iam/default_policies.json
153
+ - lib/fog/aws/iam/default_policies.rb
154
+ - lib/fog/aws/iam/default_policy_versions.json
155
+ - lib/fog/aws/iam/paged_collection.rb
152
156
  - lib/fog/aws/kms.rb
153
157
  - lib/fog/aws/mock.rb
154
158
  - lib/fog/aws/models/auto_scaling/activities.rb
@@ -255,6 +259,8 @@ files:
255
259
  - lib/fog/aws/models/iam/access_keys.rb
256
260
  - lib/fog/aws/models/iam/group.rb
257
261
  - lib/fog/aws/models/iam/groups.rb
262
+ - lib/fog/aws/models/iam/managed_policies.rb
263
+ - lib/fog/aws/models/iam/managed_policy.rb
258
264
  - lib/fog/aws/models/iam/policies.rb
259
265
  - lib/fog/aws/models/iam/policy.rb
260
266
  - lib/fog/aws/models/iam/role.rb
@@ -510,6 +516,7 @@ files:
510
516
  - lib/fog/aws/parsers/iam/list_users.rb
511
517
  - lib/fog/aws/parsers/iam/login_profile.rb
512
518
  - lib/fog/aws/parsers/iam/policy_parser.rb
519
+ - lib/fog/aws/parsers/iam/policy_version.rb
513
520
  - lib/fog/aws/parsers/iam/role_parser.rb
514
521
  - lib/fog/aws/parsers/iam/single_policy.rb
515
522
  - lib/fog/aws/parsers/iam/single_role.rb
@@ -997,6 +1004,8 @@ files:
997
1004
  - lib/fog/aws/requests/iam/get_group_policy.rb
998
1005
  - lib/fog/aws/requests/iam/get_instance_profile.rb
999
1006
  - lib/fog/aws/requests/iam/get_login_profile.rb
1007
+ - lib/fog/aws/requests/iam/get_policy.rb
1008
+ - lib/fog/aws/requests/iam/get_policy_version.rb
1000
1009
  - lib/fog/aws/requests/iam/get_role.rb
1001
1010
  - lib/fog/aws/requests/iam/get_role_policy.rb
1002
1011
  - lib/fog/aws/requests/iam/get_server_certificate.rb
@@ -1004,6 +1013,8 @@ files:
1004
1013
  - lib/fog/aws/requests/iam/get_user_policy.rb
1005
1014
  - lib/fog/aws/requests/iam/list_access_keys.rb
1006
1015
  - lib/fog/aws/requests/iam/list_account_aliases.rb
1016
+ - lib/fog/aws/requests/iam/list_attached_group_policies.rb
1017
+ - lib/fog/aws/requests/iam/list_attached_user_policies.rb
1007
1018
  - lib/fog/aws/requests/iam/list_group_policies.rb
1008
1019
  - lib/fog/aws/requests/iam/list_groups.rb
1009
1020
  - lib/fog/aws/requests/iam/list_groups_for_user.rb
@@ -1293,6 +1304,7 @@ files:
1293
1304
  - tests/models/glacier/model_tests.rb
1294
1305
  - tests/models/iam/access_keys_tests.rb
1295
1306
  - tests/models/iam/groups_tests.rb
1307
+ - tests/models/iam/managed_policies_tests.rb
1296
1308
  - tests/models/iam/policies_tests.rb
1297
1309
  - tests/models/iam/roles_tests.rb
1298
1310
  - tests/models/iam/users_tests.rb