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,88 @@
1
+ module Fog
2
+ module Parsers
3
+ module AWS
4
+ module ELBV2
5
+ class DescribeLoadBalancers < Fog::Parsers::Base
6
+ def reset
7
+ reset_load_balancer
8
+ reset_availability_zone
9
+ @load_balancer_addresses = {}
10
+ @state = {}
11
+ @results = { 'LoadBalancers' => [] }
12
+ @response = { 'DescribeLoadBalancersResult' => {}, 'ResponseMetadata' => {} }
13
+ end
14
+
15
+ def reset_load_balancer
16
+ @load_balancer = { 'SecurityGroups' => [], 'AvailabilityZones' => [] }
17
+ end
18
+
19
+ def reset_availability_zone
20
+ @availability_zone = { 'LoadBalancerAddresses' => [] }
21
+ end
22
+
23
+ def start_element(name, attrs = [])
24
+ super
25
+ case name
26
+ when 'AvailabilityZones'
27
+ @in_availability_zones = true
28
+ when 'LoadBalancerAddresses'
29
+ @in_load_balancer_addresses = true
30
+ when 'SecurityGroups'
31
+ @in_security_groups = true
32
+ when 'State'
33
+ @in_state = true
34
+ end
35
+ end
36
+
37
+ def end_element(name)
38
+ case name
39
+ when 'member'
40
+ if @in_availability_zones && @in_load_balancer_addresses
41
+ @availability_zone['LoadBalancerAddresses'] << @load_balancer_addresses
42
+ elsif @in_availability_zones
43
+ @load_balancer['AvailabilityZones'] << @availability_zone
44
+ reset_availability_zone
45
+ elsif @in_security_groups
46
+ @load_balancer['SecurityGroups'] << value
47
+ else
48
+ @results['LoadBalancers'] << @load_balancer
49
+ reset_load_balancer
50
+ end
51
+ when 'SubnetId', 'ZoneName'
52
+ @availability_zone[name] = value
53
+ when 'IpAddress', 'AllocationId'
54
+ @load_balancer_addresses[name] = value
55
+
56
+ when 'CanonicalHostedZoneName', 'CanonicalHostedZoneNameID', 'LoadBalancerName', 'DNSName', 'Scheme', 'Type',
57
+ 'LoadBalancerArn', 'IpAddressType', 'CanonicalHostedZoneId', 'VpcId'
58
+ @load_balancer[name] = value
59
+ when 'CreatedTime'
60
+ @load_balancer[name] = Time.parse(value)
61
+
62
+ when 'LoadBalancerAddresses'
63
+ @in_load_balancer_addresses = false
64
+ when 'AvailabilityZones'
65
+ @in_availability_zones = false
66
+ when 'SecurityGroups'
67
+ @in_security_groups = false
68
+ when 'State'
69
+ @in_state = false
70
+ @load_balancer[name] = @state
71
+ @state = {}
72
+ when 'Code'
73
+ @state[name] = value
74
+
75
+ when 'RequestId'
76
+ @response['ResponseMetadata'][name] = value
77
+
78
+ when 'NextMarker'
79
+ @results['NextMarker'] = value
80
+ when 'DescribeLoadBalancersResponse'
81
+ @response['DescribeLoadBalancersResult'] = @results
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,53 @@
1
+ module Fog
2
+ module Parsers
3
+ module AWS
4
+ module ELBV2
5
+ class DescribeTags < Fog::Parsers::Base
6
+ def reset
7
+ @this_key = nil
8
+ @this_value = nil
9
+ @tags = Hash.new
10
+ @response = { 'DescribeTagsResult' => { 'TagDescriptions' => [] }, 'ResponseMetadata' => {} }
11
+ @in_tags = false
12
+ end
13
+
14
+ def start_element(name, attrs = [])
15
+ super
16
+ case name
17
+ when 'member'
18
+ unless @in_tags
19
+ @resource_arn = nil
20
+ @tags = {}
21
+ end
22
+ when 'Tags'
23
+ @in_tags = true
24
+ end
25
+ end
26
+
27
+ def end_element(name)
28
+ super
29
+ case name
30
+ when 'member'
31
+ if @in_tags
32
+ @tags[@this_key] = @this_value
33
+ @this_key, @this_value = nil, nil
34
+ else
35
+ @response['DescribeTagsResult']['TagDescriptions'] << { 'Tags' => @tags, 'ResourceArn' => @resource_arn }
36
+ end
37
+ when 'Key'
38
+ @this_key = value
39
+ when 'Value'
40
+ @this_value = value
41
+ when 'ResourceArn'
42
+ @resource_arn = value
43
+ when 'RequestId'
44
+ @response['ResponseMetadata'][name] = value
45
+ when 'Tags'
46
+ @in_tags = false
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,10 @@
1
+ module Fog
2
+ module Parsers
3
+ module AWS
4
+ module ELBV2
5
+ class Empty < ELB::Empty
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ module Fog
2
+ module Parsers
3
+ module AWS
4
+ module Storage
5
+ class GetObjectTagging < Fog::Parsers::Base
6
+ def reset
7
+ @in_tag = {}
8
+ @response = {'ObjectTagging' => {}}
9
+ end
10
+
11
+ def start_element(name, *args)
12
+ super
13
+ if name == 'Tag'
14
+ @in_tag = {}
15
+ end
16
+ end
17
+
18
+ def end_element(name)
19
+ case name
20
+ when 'Tag'
21
+ @response['ObjectTagging'].merge!(@in_tag)
22
+ @in_tag = {}
23
+ when 'Key'
24
+ @in_tag[value] = nil
25
+ when 'Value'
26
+ @in_tag = {@in_tag.keys.first => value}
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -2,7 +2,7 @@ module Fog
2
2
  module Parsers
3
3
  module AWS
4
4
  module STS
5
- class AssumeRoleWithWithWebIdentity < Fog::Parsers::Base
5
+ class AssumeRoleWithWebIdentity < Fog::Parsers::Base
6
6
  def reset
7
7
  @response = {}
8
8
  end
@@ -11,7 +11,6 @@ module Fog
11
11
  # * options<~Hash>:
12
12
  # * InstanceTenancy<~String> - The allowed tenancy of instances launched into the VPC. A value of default
13
13
  # means instances can be launched with any tenancy; a value of dedicated means instances must be launched with tenancy as dedicated.
14
- # please not that the documentation is incorrect instanceTenancy will not work while InstanceTenancy will
15
14
  #
16
15
  # === Returns
17
16
  # * response<~Excon::Response>:
@@ -54,7 +53,8 @@ module Fog
54
53
  'classicLinkEnabled' => false,
55
54
  'classicLinkDnsSupport' => false,
56
55
  'cidrBlockAssociationSet' => [{ 'cidrBlock' => cidrBlock, 'state' => 'associated', 'associationId' => "vpc-cidr-assoc-#{vpc_id}" }],
57
- 'ipv6CidrBlockAssociationSet' => []
56
+ 'ipv6CidrBlockAssociationSet' => [],
57
+ 'instanceTenancy' => options['InstanceTenancy'] || 'default'
58
58
  }
59
59
  self.data[:vpcs].push(vpc)
60
60
 
@@ -30,6 +30,8 @@ module Fog
30
30
  # * 'Ebs.Encrypted'<~Boolean> - specifies whether or not the volume is to be encrypted unless snapshot is specified
31
31
  # * 'Ebs.VolumeType'<~String> - Type of EBS volue. Valid options in ['standard', 'io1'] default is 'standard'.
32
32
  # * 'Ebs.Iops'<~String> - The number of I/O operations per second (IOPS) that the volume supports. Required when VolumeType is 'io1'
33
+ # * 'HibernationOptions'<~Array>: array of hashes
34
+ # * 'Configured'<~Boolean> - specifies whether or not the instance is configued for hibernation. This parameter is valid only if the instance meets the hibernation prerequisites.
33
35
  # * 'NetworkInterfaces'<~Array>: array of hashes
34
36
  # * 'NetworkInterfaceId'<~String> - An existing interface to attach to a single instance
35
37
  # * 'DeviceIndex'<~String> - The device index. Applies both to attaching an existing network interface and creating a network interface
@@ -75,6 +77,8 @@ module Fog
75
77
  # * 'deviceName'<~String> - specifies how volume is exposed to instance
76
78
  # * 'status'<~String> - status of attached volume
77
79
  # * 'volumeId'<~String> - Id of attached volume
80
+ # * 'hibernationOptions'<~Array>
81
+ # * 'configured'<~Boolean> - whether or not the instance is enabled for hibernation
78
82
  # * 'dnsName'<~String> - public dns name, blank until instance is running
79
83
  # * 'imageId'<~String> - image id of ami used to launch instance
80
84
  # * 'instanceId'<~String> - id of the instance
@@ -111,6 +115,13 @@ module Fog
111
115
  end
112
116
  end
113
117
  end
118
+ if hibernation_options = options.delete('HibernationOptions')
119
+ hibernation_options.each_with_index do |mapping, index|
120
+ for key, value in mapping
121
+ options.merge!({ format("HibernationOptions.%d.#{key}", index) => value })
122
+ end
123
+ end
124
+ end
114
125
  if security_groups = options.delete('SecurityGroup')
115
126
  options.merge!(Fog::AWS.indexed_param('SecurityGroup', [*security_groups]))
116
127
  end
@@ -182,6 +193,14 @@ module Fog
182
193
  }
183
194
  end
184
195
 
196
+ hibernation_options = (options['HibernationOptions'] || []).reduce([]) do |mapping, device|
197
+ configure = device.fetch("Configure", true)
198
+
199
+ mapping << {
200
+ "Configure" => configure,
201
+ }
202
+ end
203
+
185
204
  if options['SubnetId']
186
205
  if options['PrivateIpAddress']
187
206
  ni_options = {'PrivateIpAddress' => options['PrivateIpAddress']}
@@ -221,6 +240,7 @@ module Fog
221
240
  'associatePublicIP' => options['associatePublicIP'] || false,
222
241
  'architecture' => 'i386',
223
242
  'blockDeviceMapping' => block_device_mapping,
243
+ 'hibernationOptions' => hibernation_options,
224
244
  'networkInterfaces' => network_interfaces,
225
245
  'clientToken' => options['clientToken'],
226
246
  'dnsName' => nil,
@@ -16,9 +16,17 @@ module Fog
16
16
  # * TODO: fill in the blanks
17
17
  #
18
18
  # {Amazon API Reference}[http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-StopInstances.html]
19
- def stop_instances(instance_id, force = false)
19
+ def stop_instances(instance_id, options = {})
20
20
  params = Fog::AWS.indexed_param('InstanceId', instance_id)
21
- params.merge!('Force' => 'true') if force
21
+ unless options.is_a?(Hash)
22
+ Fog::Logger.warning("stop_instances with #{options.class} param is deprecated, use stop_instances('force' => boolean) instead [light_black](#{caller.first})[/]")
23
+ options = {'force' => options}
24
+ end
25
+ params.merge!('Force' => 'true') if options['force']
26
+ if options['hibernate']
27
+ params.merge!('Hibernate' => 'true')
28
+ params.merge!('Force' => 'false')
29
+ end
22
30
  request({
23
31
  'Action' => 'StopInstances',
24
32
  :idempotent => true,
@@ -28,7 +36,7 @@ module Fog
28
36
  end
29
37
 
30
38
  class Mock
31
- def stop_instances(instance_id, force = false)
39
+ def stop_instances(instance_id, options = {})
32
40
  instance_ids = Array(instance_id)
33
41
 
34
42
  instance_set = self.data[:instances].values
@@ -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
+ # adds tags to a load balancer instance
8
+ # http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_AddTags.html
9
+ # ==== Parameters
10
+ # * resource_arn <~String> - The Amazon Resource Name (ARN) of the resource
11
+ # * tags <~Hash> A Hash of (String) key-value pairs
12
+ # ==== Returns
13
+ # * response<~Excon::Response>:
14
+ # * body<~Hash>:
15
+ def add_tags(resource_arn, tags)
16
+ keys = tags.keys.sort
17
+ values = keys.map {|key| tags[key]}
18
+ request({
19
+ 'Action' => 'AddTags',
20
+ 'ResourceArns.member.1' => resource_arn,
21
+ :parser => Fog::Parsers::AWS::ELBV2::Empty.new,
22
+ }.merge(Fog::AWS.indexed_param('Tags.member.%d.Key', keys))
23
+ .merge(Fog::AWS.indexed_param('Tags.member.%d.Value', values)))
24
+ end
25
+
26
+ end
27
+
28
+ class Mock
29
+ def add_tags(resource_arn, tags)
30
+ response = Excon::Response.new
31
+ if self.data[:load_balancers_v2][resource_arn]
32
+ self.data[:tags][resource_arn].merge! tags
33
+ response.status = 200
34
+ response.body = {
35
+ "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id }
36
+ }
37
+ response
38
+ else
39
+ raise Fog::AWS::ELBV2::NotFound.new("Elastic load balancer #{resource_arn} not found")
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,160 @@
1
+ module Fog
2
+ module AWS
3
+ class ELBV2
4
+ class Real
5
+ require 'fog/aws/parsers/elbv2/create_load_balancer'
6
+
7
+ # Create a new Elastic Load Balancer
8
+ #
9
+ # ==== Parameters
10
+ # * name<~String> - The name of the load balancer.
11
+ # This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens,
12
+ # must not begin or end with a hyphen, and must not begin with "internal-".
13
+ # - Required: Yes
14
+ # * options<~Hash>:
15
+ # * ip_address_type<~String> - [Application Load Balancers] The type of IP addresses used by the subnets for your load balancer.
16
+ # The possible values are ipv4 (for IPv4 addresses) and dualstack (for IPv4 and IPv6 addresses).
17
+ # Internal load balancers must use ipv4.
18
+ # - Required: No
19
+ # * scheme<~String> - The default is an Internet-facing load balancer. Valid Values: internet-facing | internal
20
+ # - Required: No
21
+ # * security_groups<~Array> - The IDs of the security groups for the load balancer.
22
+ # - Required: No
23
+ # * subnet_mappings<~Array> - The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings.
24
+ # - [Application Load Balancers] You must specify subnets from at least two Availability Zones.
25
+ # You cannot specify Elastic IP addresses for your subnets.
26
+ # - [Network Load Balancers] You can specify subnets from one or more Availability Zones.
27
+ # You can specify one Elastic IP address per subnet if you need static IP addresses for your internet-facing load balancer.
28
+ # For internal load balancers, you can specify one private IP address per subnet from the IPv4 range of the subnet.
29
+ # - Required: No
30
+ # * subnets<~Array> - The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings.
31
+ # - [Application Load Balancers] You must specify subnets from at least two Availability Zones.
32
+ # - [Network Load Balancers] You can specify subnets from one or more Availability Zones.
33
+ # - Required: No
34
+ # * tags<~Hash> - One or more tags to assign to the load balancer.
35
+ # - Required: No
36
+ # * type<~String> - The type of load balancer. The default is application. Valid Values: application | network
37
+ # - Required: No
38
+ # ==== Returns
39
+ # * response<~Excon::Response>:
40
+ # * body<~Hash>:
41
+ # * 'ResponseMetadata'<~Hash>:
42
+ # * 'RequestId'<~String> - Id of request
43
+ # * 'CreateLoadBalancerResult'<~Hash>:
44
+ # * 'LoadBalancers'<~Array>
45
+ # * 'AvailabilityZones'<~Array>:
46
+ # * 'SubnetId'<~String> - ID of the subnet
47
+ # * 'ZoneName'<~String> - Name of the Availability Zone
48
+ # * 'LoadBalancerAddresses'<~Array>:
49
+ # * 'IpAddress'<~String> - IP address
50
+ # * 'AllocationId'<~String> - ID of the AWS allocation
51
+ # * 'CanonicalHostedZoneName'<~String> - name of the Route 53 hosted zone associated with the load balancer
52
+ # * 'CanonicalHostedZoneNameID'<~String> - ID of the Route 53 hosted zone associated with the load balancer
53
+ # * 'CreatedTime'<~Time> - time load balancer was created
54
+ # * 'DNSName'<~String> - external DNS name of load balancer
55
+ # * 'LoadBalancerName'<~String> - name of load balancer
56
+ # * 'SecurityGroups'<~Array> - array of security group id
57
+ def create_load_balancer(name, options = {})
58
+ params = {}
59
+ params.merge!(Fog::AWS.indexed_param('Subnets.member.%d', options[:subnets]))
60
+ params.merge!(Fog::AWS.indexed_param('SecurityGroups.member.%d', options[:security_groups]))
61
+ params.merge!(Fog::AWS.serialize_keys('Scheme', options[:scheme]))
62
+ params.merge!(Fog::AWS.serialize_keys('Type', options[:type]))
63
+ params.merge!(Fog::AWS.serialize_keys('IpAddressType', options[:ip_address_type]))
64
+
65
+
66
+ unless options[:tags].nil?
67
+ tag_keys = options[:tags].keys.sort
68
+ tag_values = tag_keys.map { |key| options[:tags][key] }
69
+ params.merge!(Fog::AWS.indexed_param('Tags.member.%d.Key', tag_keys))
70
+ params.merge!(Fog::AWS.indexed_param('Tags.member.%d.Value', tag_values))
71
+ end
72
+
73
+ unless options[:subnet_mappings].nil?
74
+ subnet_ids = []
75
+ allocation_ids = []
76
+ private_ipv4_address = []
77
+ options[:subnet_mappings].each do |subnet_mapping|
78
+ subnet_ids.push(subnet_mapping[:subnet_id])
79
+ allocation_ids.push(subnet_mapping[:allocation_id])
80
+ private_ipv4_address.push(subnet_mapping[:private_ipv4_address])
81
+ end
82
+ params.merge!(Fog::AWS.indexed_param('SubnetMappings.member.%d.SubnetId', subnet_ids))
83
+ params.merge!(Fog::AWS.indexed_param('SubnetMappings.member.%d.AllocationId', allocation_ids))
84
+ params.merge!(Fog::AWS.indexed_param('SubnetMappings.member.%d.PrivateIPv4Address', private_ipv4_address))
85
+ end
86
+
87
+
88
+ request({
89
+ 'Action' => 'CreateLoadBalancer',
90
+ 'Name' => name,
91
+ :parser => Fog::Parsers::AWS::ELBV2::CreateLoadBalancer.new
92
+ }.merge!(params))
93
+ end
94
+ end
95
+
96
+ class Mock
97
+ def create_load_balancer(name, options = {})
98
+ response = Excon::Response.new
99
+ response.status = 200
100
+
101
+ raise Fog::AWS::ELBV2::IdentifierTaken if self.data[:load_balancers_v2].key? name
102
+
103
+ dns_name = Fog::AWS::ELBV2::Mock.dns_name(name, @region)
104
+ type = options[:type] || 'application'
105
+ load_balancer_arn = Fog::AWS::Mock.arn('elasticloadbalancing', self.data[:owner_id], "loadbalancer/#{type[0..2]}/#{name}/#{Fog::AWS::Mock.key_id}")
106
+
107
+ subnet_ids = options[:subnets] || []
108
+ region = if subnet_ids.any?
109
+ # using Hash here for Rubt 1.8.7 support.
110
+ Hash[
111
+ Fog::AWS::Compute::Mock.data.select do |_, region_data|
112
+ unless region_data[@aws_access_key_id].nil?
113
+ region_data[@aws_access_key_id][:subnets].any? do |region_subnets|
114
+ subnet_ids.include? region_subnets['subnetId']
115
+ end
116
+ end
117
+ end
118
+ ].keys[0]
119
+ else
120
+ 'us-east-1'
121
+ end
122
+
123
+ subnets = Fog::AWS::Compute::Mock.data[region][@aws_access_key_id][:subnets].select {|e| subnet_ids.include?(e["subnetId"]) }
124
+ availability_zones = subnets.map do |subnet|
125
+ { "LoadBalancerAddresses"=>[], "SubnetId"=>subnet["subnetId"], "ZoneName"=>subnet["availabilityZone"]}
126
+ end
127
+ vpc_id = subnets.first['vpcId']
128
+
129
+ self.data[:tags] ||= {}
130
+ self.data[:tags][load_balancer_arn] = options[:tags] || {}
131
+
132
+ load_balancer = {
133
+ 'AvailabilityZones' => availability_zones || [],
134
+ 'Scheme' => options[:scheme] || 'internet-facing',
135
+ 'SecurityGroups' => options[:security_groups] || [],
136
+ 'CanonicalHostedZoneId' => '',
137
+ 'CreatedTime' => Time.now,
138
+ 'DNSName' => dns_name,
139
+ 'VpcId' => vpc_id,
140
+ 'Type' => type,
141
+ 'State' => {'Code' => 'provisioning'},
142
+ 'LoadBalancerArn' => load_balancer_arn,
143
+ 'LoadBalancerName' => name
144
+ }
145
+ self.data[:load_balancers_v2][load_balancer_arn] = load_balancer
146
+ response.body = {
147
+ 'ResponseMetadata' => {
148
+ 'RequestId' => Fog::AWS::Mock.request_id
149
+ },
150
+ 'CreateLoadBalancerResult' => {
151
+ 'LoadBalancers' => [load_balancer]
152
+ }
153
+ }
154
+
155
+ response
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end