fog-aws 3.5.2 → 3.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +82 -7
  4. data/LICENSE.md +1 -1
  5. data/README.md +39 -6
  6. data/bin/console +14 -0
  7. data/bin/setup +8 -0
  8. data/fog-aws.gemspec +3 -3
  9. data/lib/fog/aws.rb +6 -1
  10. data/lib/fog/aws/credential_fetcher.rb +27 -4
  11. data/lib/fog/aws/elasticache.rb +4 -2
  12. data/lib/fog/aws/elb.rb +1 -1
  13. data/lib/fog/aws/elbv2.rb +72 -0
  14. data/lib/fog/aws/kinesis.rb +23 -15
  15. data/lib/fog/aws/models/compute/flavors.rb +1556 -134
  16. data/lib/fog/aws/models/compute/server.rb +4 -2
  17. data/lib/fog/aws/models/compute/servers.rb +2 -0
  18. data/lib/fog/aws/models/compute/snapshot.rb +7 -6
  19. data/lib/fog/aws/models/compute/vpc.rb +8 -2
  20. data/lib/fog/aws/models/storage/directory.rb +0 -1
  21. data/lib/fog/aws/models/storage/file.rb +3 -0
  22. data/lib/fog/aws/parsers/compute/create_snapshot.rb +1 -1
  23. data/lib/fog/aws/parsers/compute/create_subnet.rb +33 -6
  24. data/lib/fog/aws/parsers/compute/describe_subnets.rb +33 -6
  25. data/lib/fog/aws/parsers/dns/create_hosted_zone.rb +1 -1
  26. data/lib/fog/aws/parsers/dns/get_hosted_zone.rb +3 -3
  27. data/lib/fog/aws/parsers/dns/list_hosted_zones.rb +3 -1
  28. data/lib/fog/aws/parsers/elbv2/create_load_balancer.rb +88 -0
  29. data/lib/fog/aws/parsers/elbv2/describe_listeners.rb +110 -0
  30. data/lib/fog/aws/parsers/elbv2/describe_load_balancers.rb +88 -0
  31. data/lib/fog/aws/parsers/elbv2/describe_tags.rb +53 -0
  32. data/lib/fog/aws/parsers/elbv2/empty.rb +10 -0
  33. data/lib/fog/aws/parsers/storage/get_object_tagging.rb +33 -0
  34. data/lib/fog/aws/parsers/sts/assume_role_with_web_identity.rb +1 -1
  35. data/lib/fog/aws/requests/compute/create_vpc.rb +2 -2
  36. data/lib/fog/aws/requests/compute/run_instances.rb +20 -0
  37. data/lib/fog/aws/requests/compute/stop_instances.rb +11 -3
  38. data/lib/fog/aws/requests/elbv2/add_tags.rb +45 -0
  39. data/lib/fog/aws/requests/elbv2/create_load_balancer.rb +160 -0
  40. data/lib/fog/aws/requests/elbv2/describe_listeners.rb +38 -0
  41. data/lib/fog/aws/requests/elbv2/describe_load_balancers.rb +100 -0
  42. data/lib/fog/aws/requests/elbv2/describe_tags.rb +50 -0
  43. data/lib/fog/aws/requests/elbv2/remove_tags.rb +45 -0
  44. data/lib/fog/aws/requests/storage/get_object_tagging.rb +41 -0
  45. data/lib/fog/aws/requests/storage/put_object_tagging.rb +42 -0
  46. data/lib/fog/aws/requests/sts/assume_role_with_web_identity.rb +7 -6
  47. data/lib/fog/aws/storage.rb +2 -0
  48. data/lib/fog/aws/version.rb +1 -1
  49. data/tests/credentials_tests.rb +20 -0
  50. data/tests/parsers/elbv2/create_load_balancer_tests.rb +48 -0
  51. data/tests/parsers/elbv2/describe_listeners_tests.rb +76 -0
  52. data/tests/parsers/elbv2/describe_load_balancers_tests.rb +54 -0
  53. data/tests/parsers/elbv2/describe_tags_tests.rb +35 -0
  54. data/tests/requests/compute/vpc_tests.rb +6 -0
  55. data/tests/requests/elbv2/helper.rb +66 -0
  56. data/tests/requests/elbv2/load_balancer_tests.rb +50 -0
  57. metadata +32 -9
@@ -0,0 +1,38 @@
1
+ module Fog
2
+ module AWS
3
+ class ELBV2
4
+ class Real
5
+ require 'fog/aws/parsers/elbv2/describe_listeners'
6
+
7
+ # Describe all or specified load balancers
8
+ #
9
+ # ==== Parameters
10
+ # * 'LoadBalancerArn'<~String> - The Amazon Resource Name (ARN) of the load balancer
11
+ # * options<~Hash>
12
+ # * 'Marker'<String> - Indicates where to begin in your list of load balancers
13
+ #
14
+ # ==== Returns
15
+ # * response<~Excon::Response>:
16
+ # * body<~Hash>:
17
+ # * 'ResponseMetadata'<~Hash>:
18
+ # * 'RequestId'<~String> - Id of request
19
+ # * 'DescribeListenersResult'<~Hash>:
20
+ # * 'Listeners'<~Array>
21
+ # * 'LoadBalancerArn'<~String> - The Amazon Resource Name (ARN) of the load balancer
22
+ # * 'Protocol'<~String> - The protocol for connections from clients to the load balancer
23
+ # * 'Port'<~String> - The port on which the load balancer is listening
24
+ # * 'DefaultActions'<~Array> - The default actions for the listener
25
+ # * 'Type'<~String> - The type of action
26
+ # * 'TargetGroupArn'<~String> - The Amazon Resource Name (ARN) of the target group. Specify only when Type is forward
27
+ # * 'NextMarker'<~String> - Marker to specify for next page
28
+ def describe_listeners(load_balancer_arn, options = {})
29
+ request({
30
+ 'Action' => 'DescribeListeners',
31
+ 'LoadBalancerArn' => load_balancer_arn,
32
+ :parser => Fog::Parsers::AWS::ELBV2::DescribeListeners.new
33
+ }.merge!(options))
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,100 @@
1
+ module Fog
2
+ module AWS
3
+ class ELBV2
4
+ class Real
5
+ require 'fog/aws/parsers/elbv2/describe_load_balancers'
6
+
7
+ # Describe all or specified load balancers
8
+ #
9
+ # ==== Parameters
10
+ # * options<~Hash>
11
+ # * 'LoadBalancerNames'<~Array> - List of load balancer names to describe, defaults to all
12
+ # * 'Marker'<String> - Indicates where to begin in your list of load balancers
13
+ #
14
+ # ==== Returns
15
+ # * response<~Excon::Response>:
16
+ # * body<~Hash>:
17
+ # * 'ResponseMetadata'<~Hash>:
18
+ # * 'RequestId'<~String> - Id of request
19
+ # * 'DescribeLoadBalancersResult'<~Hash>:
20
+ # * 'LoadBalancers'<~Array>
21
+ # * 'AvailabilityZones'<~Array>:
22
+ # * 'SubnetId'<~String> - ID of the subnet
23
+ # * 'ZoneName'<~String> - Name of the Availability Zone
24
+ # * 'LoadBalancerAddresses'<~Array>:
25
+ # * 'IpAddress'<~String> - IP address
26
+ # * 'AllocationId'<~String> - ID of the AWS allocation
27
+ # * 'CanonicalHostedZoneName'<~String> - name of the Route 53 hosted zone associated with the load balancer
28
+ # * 'CanonicalHostedZoneNameID'<~String> - ID of the Route 53 hosted zone associated with the load balancer
29
+ # * 'CreatedTime'<~Time> - time load balancer was created
30
+ # * 'DNSName'<~String> - external DNS name of load balancer
31
+ # * 'LoadBalancerName'<~String> - name of load balancer
32
+ # * 'SecurityGroups'<~Array> - array of security group id
33
+ # * 'NextMarker'<~String> - Marker to specify for next page
34
+ def describe_load_balancers(options = {})
35
+ unless options.is_a?(Hash)
36
+ Fog::Logger.deprecation("describe_load_balancers with #{options.class} is deprecated, use all('LoadBalancerNames' => []) instead [light_black](#{caller.first})[/]")
37
+ options = { 'LoadBalancerNames' => [options].flatten }
38
+ end
39
+
40
+ if names = options.delete('LoadBalancerNames')
41
+ options.update(Fog::AWS.indexed_param('LoadBalancerNames.member', [*names]))
42
+ end
43
+
44
+ request({
45
+ 'Action' => 'DescribeLoadBalancers',
46
+ :parser => Fog::Parsers::AWS::ELBV2::DescribeLoadBalancers.new
47
+ }.merge!(options))
48
+ end
49
+ end
50
+
51
+ class Mock
52
+ def describe_load_balancers(options = {})
53
+ unless options.is_a?(Hash)
54
+ Fog::Logger.deprecation("describe_load_balancers with #{options.class} is deprecated, use all('LoadBalancerNames' => []) instead [light_black](#{caller.first})[/]")
55
+ options = { 'LoadBalancerNames' => [options].flatten }
56
+ end
57
+
58
+ lb_names = options['LoadBalancerNames'] || []
59
+
60
+ lb_names = [*lb_names]
61
+ load_balancers = if lb_names.any?
62
+ lb_names.map do |lb_name|
63
+ lb = self.data[:load_balancers_v2].find { |name, data| name == lb_name }
64
+ raise Fog::AWS::ELBV2::NotFound unless lb
65
+ lb[1].dup
66
+ end.compact
67
+ else
68
+ self.data[:load_balancers_v2].map { |lb, values| values.dup }
69
+ end
70
+
71
+ marker = options.fetch('Marker', 0).to_i
72
+ if load_balancers.count - marker > 400
73
+ next_marker = marker + 400
74
+ load_balancers = load_balancers[marker...next_marker]
75
+ else
76
+ next_marker = nil
77
+ end
78
+
79
+ response = Excon::Response.new
80
+ response.status = 200
81
+
82
+ response.body = {
83
+ 'ResponseMetadata' => {
84
+ 'RequestId' => Fog::AWS::Mock.request_id
85
+ },
86
+ 'DescribeLoadBalancersResult' => {
87
+ 'LoadBalancers' => load_balancers
88
+ }
89
+ }
90
+
91
+ if next_marker
92
+ response.body['DescribeLoadBalancersResult']['NextMarker'] = next_marker.to_s
93
+ end
94
+
95
+ response
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,50 @@
1
+ module Fog
2
+ module AWS
3
+ class ELBV2
4
+ class Real
5
+ require 'fog/aws/parsers/elbv2/describe_tags'
6
+
7
+ # returns a Hash of tags for a load balancer
8
+ # http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_DescribeTags.html
9
+ # ==== Parameters
10
+ # * resource_arns <~Array> - ARN(s) of the ELB instance whose tags are to be retrieved
11
+ # ==== Returns
12
+ # * response<~Excon::Response>:
13
+ # * body<~Hash>:
14
+ def describe_tags(resource_arns)
15
+ request({
16
+ 'Action' => 'DescribeTags',
17
+ :parser => Fog::Parsers::AWS::ELBV2::DescribeTags.new
18
+ }.merge!(Fog::AWS.indexed_param('ResourceArns.member.%d', [*resource_arns]))
19
+ )
20
+ end
21
+ end
22
+
23
+ class Mock
24
+ def describe_tags(resource_arns)
25
+ response = Excon::Response.new
26
+ resource_arns = [*resource_arns]
27
+
28
+ tag_describtions = resource_arns.map do |resource_arn|
29
+ if self.data[:load_balancers_v2][resource_arn]
30
+ {
31
+ "Tags"=>self.data[:tags][resource_arn],
32
+ "ResourceArn"=>resource_arn
33
+ }
34
+ else
35
+ raise Fog::AWS::ELBV2::NotFound.new("Elastic load balancer #{resource_arns} not found")
36
+ end
37
+ end
38
+
39
+ response.status = 200
40
+ response.body = {
41
+ "ResponseMetadata"=>{"RequestId"=> Fog::AWS::Mock.request_id },
42
+ "DescribeTagsResult"=>{"TagDescriptions"=> tag_describtions}
43
+ }
44
+
45
+ response
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,45 @@
1
+ module Fog
2
+ module AWS
3
+ class ELBV2
4
+ class Real
5
+ require 'fog/aws/parsers/elbv2/empty'
6
+
7
+ # removes tags from an elastic load balancer instance
8
+ # http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_RemoveTags.html
9
+ # ==== Parameters
10
+ # * resource_arn <~String> - ARN of the ELB instance whose tags are to be retrieved
11
+ # * keys <~Array> A list of String keys for the tags to remove
12
+ # ==== Returns
13
+ # * response<~Excon::Response>:
14
+ # * body<~Hash>:
15
+ def remove_tags(resource_arn, keys)
16
+ request(
17
+ { 'Action' => 'RemoveTags',
18
+ 'ResourceArns.member.1' => resource_arn,
19
+ :parser => Fog::Parsers::AWS::ELBV2::Empty.new,
20
+ }.merge(Fog::AWS.indexed_param('TagKeys.member.%d', keys))
21
+ )
22
+ end
23
+
24
+ end
25
+
26
+ class Mock
27
+
28
+ def remove_tags(resource_arn, keys)
29
+ response = Excon::Response.new
30
+ if self.data[:load_balancers_v2][resource_arn]
31
+ keys.each {|key| self.data[:tags][resource_arn].delete key}
32
+ response.status = 200
33
+ response.body = {
34
+ "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id }
35
+ }
36
+ response
37
+ else
38
+ raise Fog::AWS::ELBV2::NotFound.new("Elastic load balancer #{resource_arn} not found")
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,41 @@
1
+ module Fog
2
+ module AWS
3
+ class Storage
4
+ class Real
5
+ require 'fog/aws/parsers/storage/get_object_tagging'
6
+
7
+ # Get tags for an S3 object
8
+ #
9
+ # @param bucket_name [String] Name of bucket to read from
10
+ # @param object_name [String] Name of object to get tags for
11
+ #
12
+ # @return [Excon::Response] response:
13
+ # * body [Hash]:
14
+ # * ObjectTagging [Hash]:
15
+ # * Key [String] - tag key
16
+ # * Value [String] - tag value
17
+ # @see https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html
18
+
19
+ def get_object_tagging(bucket_name, object_name)
20
+ unless bucket_name
21
+ raise ArgumentError.new('bucket_name is required')
22
+ end
23
+ unless object_name
24
+ raise ArgumentError.new('object_name is required')
25
+ end
26
+
27
+ request({
28
+ :expects => 200,
29
+ :headers => {},
30
+ :bucket_name => bucket_name,
31
+ :object_name => object_name,
32
+ :idempotent => true,
33
+ :method => 'GET',
34
+ :parser => Fog::Parsers::AWS::Storage::GetObjectTagging.new,
35
+ :query => {'tagging' => nil}
36
+ })
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ module Fog
2
+ module AWS
3
+ class Storage
4
+ class Real
5
+ # Change tag set for an S3 object
6
+ #
7
+ # @param bucket_name [String] Name of bucket to modify object in
8
+ # @param object_name [String] Name of object to modify
9
+ #
10
+ # @param tags [Hash]:
11
+ # * Key [String]: tag key
12
+ # * Value [String]: tag value
13
+ #
14
+ # @see https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html
15
+
16
+ def put_object_tagging(bucket_name, object_name, tags)
17
+ tagging = tags.map do |k,v|
18
+ "<Tag><Key>#{k}</Key><Value>#{v}</Value></Tag>"
19
+ end.join("\n")
20
+ data =
21
+ <<-DATA
22
+ <Tagging xmlns="http://doc.s3.amazonaws.com/2006-03-01" >
23
+ <TagSet>
24
+ #{tagging}
25
+ </TagSet>
26
+ </Tagging>
27
+ DATA
28
+
29
+ request({
30
+ :body => data,
31
+ :expects => 200,
32
+ :headers => {'Content-MD5' => Base64.encode64(OpenSSL::Digest::MD5.digest(data)).chomp!, 'Content-Type' => 'application/xml'},
33
+ :bucket_name => bucket_name,
34
+ :object_name => object_name,
35
+ :method => 'PUT',
36
+ :query => {'tagging' => nil}
37
+ })
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -6,12 +6,13 @@ module Fog
6
6
 
7
7
  def assume_role_with_web_identity(role_arn, web_identity_token, role_session_name, options={})
8
8
  request_unsigned(
9
- 'Action' => 'AssumeRoleWithWebIdentity',
10
- 'RoleArn' => role_arn,
11
- 'RoleSessionName' => role_session_name,
12
- 'DurationSeconds' => options[:duration] || 3600,
13
- :idempotent => true,
14
- :parser => Fog::Parsers::AWS::STS::AssumeRoleWithWebIdentity.new
9
+ 'Action' => 'AssumeRoleWithWebIdentity',
10
+ 'RoleArn' => role_arn,
11
+ 'RoleSessionName' => role_session_name,
12
+ 'WebIdentityToken' => web_identity_token,
13
+ 'DurationSeconds' => options[:duration] || 3600,
14
+ :idempotent => true,
15
+ :parser => Fog::Parsers::AWS::STS::AssumeRoleWithWebIdentity.new
15
16
  )
16
17
  end
17
18
  end
@@ -84,6 +84,7 @@ module Fog
84
84
  request :get_object_http_url
85
85
  request :get_object_https_url
86
86
  request :get_object_url
87
+ request :get_object_tagging
87
88
  request :get_request_payment
88
89
  request :get_service
89
90
  request :head_bucket
@@ -107,6 +108,7 @@ module Fog
107
108
  request :put_object
108
109
  request :put_object_acl
109
110
  request :put_object_url
111
+ request :put_object_tagging
110
112
  request :put_request_payment
111
113
  request :sync_clock
112
114
  request :upload_part
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AWS
3
- VERSION = "3.5.2"
3
+ VERSION = "3.6.6"
4
4
  end
5
5
  end
@@ -7,6 +7,8 @@ Shindo.tests('AWS | credentials', ['aws']) do
7
7
  Fog.unmock!
8
8
  begin
9
9
  Excon.defaults[:mock] = true
10
+ Excon.stub({ method: :put, path: '/latest/api/token' }, { status: 200, body: 'token1234' })
11
+
10
12
  Excon.stub({ method: :get, path: '/latest/meta-data/iam/security-credentials/' }, { status: 200, body: 'arole' })
11
13
  Excon.stub({ method: :get, path: '/latest/meta-data/placement/availability-zone/' }, { status: 200, body: 'us-west-1a' })
12
14
 
@@ -28,6 +30,23 @@ Shindo.tests('AWS | credentials', ['aws']) do
28
30
  aws_credentials_expire_at: expires_at) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
29
31
  end
30
32
 
33
+ tests('#fetch_credentials when the v2 token 404s') do
34
+ Excon.stub({ method: :put, path: '/latest/api/token' }, { status: 404, body: 'not found' })
35
+ returns(aws_access_key_id: 'dummykey',
36
+ aws_secret_access_key: 'dummysecret',
37
+ aws_session_token: 'dummytoken',
38
+ region: 'us-west-1',
39
+ aws_credentials_expire_at: expires_at) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
40
+ end
41
+
42
+ tests('#fetch_credentials when the v2 disabled') do
43
+ returns(aws_access_key_id: 'dummykey',
44
+ aws_secret_access_key: 'dummysecret',
45
+ aws_session_token: 'dummytoken',
46
+ region: 'us-west-1',
47
+ aws_credentials_expire_at: expires_at) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true, disable_imds_v2: true) }
48
+ end
49
+
31
50
  ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = '/v1/credentials?id=task_id'
32
51
  Excon.stub({ method: :get, path: '/v1/credentials?id=task_id' }, { status: 200, body: Fog::JSON.encode(credentials) })
33
52
 
@@ -62,6 +81,7 @@ Shindo.tests('AWS | credentials', ['aws']) do
62
81
 
63
82
  default_credentials = Fog::AWS::Compute.fetch_credentials({})
64
83
  tests('#fetch_credentials when the url 404s') do
84
+ Excon.stub({ method: :put, path: '/latest/api/token' }, { status: 404, body: 'not found' })
65
85
  Excon.stub({ method: :get, path: '/latest/meta-data/iam/security-credentials/' }, { status: 404, body: 'not bound' })
66
86
  Excon.stub({ method: :get, path: '/latest/meta-data/placement/availability-zone/' }, { status: 400, body: 'not found' })
67
87
  returns(default_credentials) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
@@ -0,0 +1,48 @@
1
+ require 'fog/xml'
2
+ require 'fog/aws/parsers/elbv2/create_load_balancer'
3
+
4
+ CREATE_LOAD_BALANCER_RESULT = <<-EOF
5
+ <CreateLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2015-12-01/">
6
+ <CreateLoadBalancerResult>
7
+ <LoadBalancers>
8
+ <member>
9
+ <LoadBalancerArn>arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-internal-load-balancer/50dc6c495c0c9188</LoadBalancerArn>
10
+ <Scheme>internet-facing</Scheme>
11
+ <LoadBalancerName>my-load-balancer</LoadBalancerName>
12
+ <VpcId>vpc-3ac0fb5f</VpcId>
13
+ <CanonicalHostedZoneId>Z2P70J7EXAMPLE</CanonicalHostedZoneId>
14
+ <CreatedTime>2016-03-25T21:29:48.850Z</CreatedTime>
15
+ <AvailabilityZones>
16
+ <member>
17
+ <SubnetId>subnet-8360a9e7</SubnetId>
18
+ <ZoneName>us-west-2a</ZoneName>
19
+ </member>
20
+ <member>
21
+ <SubnetId>subnet-b7d581c0</SubnetId>
22
+ <ZoneName>us-west-2b</ZoneName>
23
+ </member>
24
+ </AvailabilityZones>
25
+ <SecurityGroups>
26
+ <member>sg-5943793c</member>
27
+ </SecurityGroups>
28
+ <DNSName>my-load-balancer-424835706.us-west-2.elb.amazonaws.com</DNSName>
29
+ <State>
30
+ <Code>provisioning</Code>
31
+ </State>
32
+ <Type>application</Type>
33
+ </member>
34
+ </LoadBalancers>
35
+ </CreateLoadBalancerResult>
36
+ <ResponseMetadata>
37
+ <RequestId>32d531b2-f2d0-11e5-9192-3fff33344cfa</RequestId>
38
+ </ResponseMetadata>
39
+ </CreateLoadBalancerResponse>
40
+ EOF
41
+
42
+ Shindo.tests('AWS::ELBV2 | parsers | create_load_balancer', %w[aws elb parser]) do
43
+ tests('parses the xml').formats(AWS::ELBV2::Formats::CREATE_LOAD_BALANCER) do
44
+ parser = Nokogiri::XML::SAX::Parser.new(Fog::Parsers::AWS::ELBV2::CreateLoadBalancer.new)
45
+ parser.parse(CREATE_LOAD_BALANCER_RESULT)
46
+ parser.document.response
47
+ end
48
+ end