def create_load_balancer(availability_zones, lb_name, listeners = [], options = {})
response = Excon::Response.new
response.status = 200
raise Fog::AWS::ELB::IdentifierTaken if self.data[:load_balancers].key? lb_name
certificate_ids = Fog::AWS::IAM::Mock.data[@aws_access_key_id][:server_certificates].map {|n, c| c['Arn'] }
listeners = [*listeners].map do |listener|
if listener['SSLCertificateId'] and !certificate_ids.include? listener['SSLCertificateId']
raise Fog::AWS::IAM::NotFound.new('CertificateNotFound')
end
{'Listener' => listener, 'PolicyNames' => []}
end
dns_name = Fog::AWS::ELB::Mock.dns_name(lb_name, @region)
availability_zones = [*availability_zones].compact
subnet_ids = options[:subnet_ids] || []
region = if availability_zones.any?
availability_zones.first.gsub(/[a-z]$/, '')
elsif subnet_ids.any?
Hash[
Fog::Compute::AWS::Mock.data.select do |_, region_data|
region_data[@aws_access_key_id][:subnets].any? do |region_subnets|
subnet_ids.include? region_subnets['subnetId']
end
end
].keys[0]
else
'us-east-1'
end
supported_platforms = Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:account_attributes].find { |h| h["attributeName"] == "supported-platforms" }["values"]
subnets = Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:subnets].select {|e| subnet_ids.include?(e["subnetId"]) }
elb_location = if supported_platforms.include?("EC2")
if subnet_ids.empty?
'EC2-Classic'
else
'EC2-VPC'
end
else
if subnet_ids.empty?
'EC2-VPC-Default'
else
'VPC'
end
end
security_group = case elb_location
when 'EC2-Classic'
Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:security_groups]['amazon-elb-sg']
when 'EC2-VPC-Default'
compute = Fog::Compute::AWS::new(:aws_access_key_id => @aws_access_key_id, :aws_secret_access_key => @aws_secret_access_key)
unless vpc = compute.vpcs.all.first
vpc = compute.vpcs.create('cidr_block' => '10.0.0.0/24')
end
default_sg = Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:security_groups].values.find { |sg|
sg['groupName'] =~ /^default_elb/ &&
sg["vpcId"] == vpc.id
}
unless default_sg
default_sg = {
'groupDescription' => 'default_elb security group',
'groupName' => "default_elb_#{Fog::Mock.random_hex(6)}",
'groupId' => Fog::AWS::Mock.security_group_id,
'ipPermissionsEgress' => [],
'ipPermissions' => [],
'ownerId' => self.data[:owner_id],
'vpcId' => vpc.id
}
Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:security_groups]['default'] = default_sg
end
default_sg
when 'EC2-VPC'
vpc_id = subnets.first["vpcId"]
default_sg = Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:security_groups].values.find { |sg|
sg['groupName'] == 'default' &&
sg["vpcId"] == vpc_id
}
unless default_sg
default_sg = {
'groupDescription' => 'default elb security group',
'groupName' => 'default',
'groupId' => Fog::AWS::Mock.security_group_id,
'ipPermissionsEgress' => [],
'ipPermissions' => [],
'ownerId' => self.data[:owner_id],
'vpcId' => vpc_id
}
Fog::Compute::AWS::Mock.data[region][@aws_access_key_id][:security_groups]['default'] = default_sg
end
default_sg
end
self.data[:tags] ||= {}
self.data[:tags][lb_name] = {}
self.data[:load_balancers][lb_name] = {
'AvailabilityZones' => availability_zones,
'BackendServerDescriptions' => [],
'BackendServerDescriptionsRemote' => [],
'Subnets' => options[:subnet_ids] || [],
'Scheme' => options[:scheme].nil? ? 'internet-facing' : options[:scheme],
'SecurityGroups' => options[:security_groups].nil? ? [] : options[:security_groups],
'CanonicalHostedZoneName' => '',
'CanonicalHostedZoneNameID' => '',
'CreatedTime' => Time.now,
'DNSName' => dns_name,
'HealthCheck' => {
'HealthyThreshold' => 10,
'Timeout' => 5,
'UnhealthyThreshold' => 2,
'Interval' => 30,
'Target' => 'TCP:80'
},
'Instances' => [],
'ListenerDescriptions' => listeners,
'LoadBalancerAttributes' => {
'ConnectionDraining' => {'Enabled' => false, 'Timeout' => 300},
'CrossZoneLoadBalancing' => {'Enabled' => false},
'ConnectionSettings' => {'IdleTimeout' => 60}
},
'LoadBalancerName' => lb_name,
'Policies' => {
'AppCookieStickinessPolicies' => [],
'LBCookieStickinessPolicies' => [],
'OtherPolicies' => [],
'Proper' => []
},
'SourceSecurityGroup' => {
'GroupName' => security_group['groupName'],
'OwnerAlias' => ''
}
}
response.body = {
'ResponseMetadata' => {
'RequestId' => Fog::AWS::Mock.request_id
},
'CreateLoadBalancerResult' => {
'DNSName' => dns_name
}
}
response
end