class Aws::Partitions::EndpointProvider

@api private

def build_is_global_fn(sts_regional_endpoints='regional')

and returns true if the service is global
returns a callable that takes a region
def build_is_global_fn(sts_regional_endpoints='regional')
  lambda do |service, region, endpoints, service_cfg|
    # Check for sts legacy behavior
    sts_legacy = service == 'sts' &&
      sts_regional_endpoints == 'legacy' &&
      STS_LEGACY_REGIONS.include?(region)
    is_global = !endpoints.key?(region) &&
      service_cfg['isRegionalized'] == false
    sts_legacy || is_global
  end
end

def configured_variants?(variants)

def configured_variants?(variants)
  variants.values.any?
end

def credential_scope(region, service, is_global_fn)

def credential_scope(region, service, is_global_fn)
  partition = get_partition(region)
  service_cfg = partition.fetch('services', {})
                         .fetch(service, {})
  endpoints = service_cfg.fetch('endpoints', {})
  # Check for global endpoint.
  if is_global_fn.call(service, region, endpoints, service_cfg)
    region = service_cfg.fetch('partitionEndpoint', region)
  end
  default_credential_scope = service_cfg
                               .fetch('defaults', {})
                               .fetch('credentialScope', {})
  endpoints
    .fetch(region, {})
    .fetch('credentialScope', default_credential_scope)
end

def default_partition

def default_partition
  @rules['partitions'].find { |p| p['partition'] == 'aws' } ||
    @rules['partitions'].first
end

def default_provider

def default_provider
  @default_provider ||= EndpointProvider.new(Partitions.defaults)
end

def dns_suffix_for(region, service, variants)

Other tags:
    Api: - private Use the static class methods instead.

Options Hash: (**variants)
  • :fips (Boolean) -- When true, resolve a FIPS endpoint.
  • :dualstack (Boolean) -- When true, resolve a dualstack

Parameters:
  • variants (Hash) -- Endpoint variants such as 'fips' or 'dualstack'
  • service (String) -- Used only if dualstack is true. Used to find a
  • region (String) -- The region used to fetch the partition.
def dns_suffix_for(region, service, variants)
  if configured_variants?(variants)
    resolve_variant(region, service, variants)['dnsSuffix']
  else
    get_partition(region)['dnsSuffix']
  end
end

def dns_suffix_for(region, service = nil, variants = {})

def dns_suffix_for(region, service = nil, variants = {})
  default_provider.dns_suffix_for(region, service, variants)
end

def endpoint_for(region, service, is_global_fn, variants)

def endpoint_for(region, service, is_global_fn, variants)
  if configured_variants?(variants)
    endpoint_with_variants_for(region, service, variants)
  else
    endpoint_no_variants_for(region, service, is_global_fn)
  end
end

def endpoint_no_variants_for(region, service, is_global_fn)

def endpoint_no_variants_for(region, service, is_global_fn)
  partition = get_partition(region)
  service_cfg = partition.fetch('services', {}).fetch(service, {})
  # Find the default endpoint
  default_endpoint = service_cfg
             .fetch('defaults', {})
             .fetch('hostname', partition['defaults']['hostname'])
  endpoints = service_cfg.fetch('endpoints', {})
  # Check for global endpoint.
  if is_global_fn.call(service, region, endpoints, service_cfg)
    region = service_cfg.fetch('partitionEndpoint', region)
  end
  # Check for service/region level endpoint.
  region_cfg = endpoints
             .fetch(region, {})
  endpoint = region_cfg
             .fetch('hostname', default_endpoint)
  warn_deprecation(service, region) if region_cfg['deprecated']
  # Replace placeholders from the endpoints
  endpoint.sub('{region}', region)
          .sub('{service}', service)
          .sub('{dnsSuffix}', partition['dnsSuffix'])
end

def endpoint_with_variants_for(region, service, variants)

def endpoint_with_variants_for(region, service, variants)
  variant = resolve_variant(region, service, variants)
  validate_variant!(variants, variant)
  variant['hostname'].sub('{region}', region)
                     .sub('{service}', service)
                     .sub('{dnsSuffix}', variant['dnsSuffix'])
end

def fetch_variant(cfg, tags)

def fetch_variant(cfg, tags)
  variants = cfg.fetch('variants', [])
  variants.find { |v| tags == Set.new(v['tags']) } || {}
end

def get_partition(region_or_partition)

def get_partition(region_or_partition)
  partition_containing_region(region_or_partition) ||
    partition_matching_region(region_or_partition) ||
    partition_matching_name(region_or_partition) ||
    default_partition
end

def initialize(rules)

Other tags:
    Api: - private
def initialize(rules)
  @rules = rules
end

def partition_containing_region(region)

def partition_containing_region(region)
  @rules['partitions'].find do |p|
    p['regions'].key?(region)
  end
end

def partition_matching_name(partition_name)

def partition_matching_name(partition_name)
  @rules['partitions'].find { |p| p['partition'] == partition_name }
end

def partition_matching_region(region)

def partition_matching_region(region)
  @rules['partitions'].find do |p|
    p['regionRegex'] && region.match(p['regionRegex']) ||
      p['services'].values.find do |svc|
        svc['endpoints'].key?(region) if svc.key?('endpoints')
      end
  end
end

def resolve(region, service, sts_regional_endpoints, variants)

Other tags:
    Api: - private Use the static class methods instead.

Options Hash: (**variants)
  • :fips (Boolean) -- When true, resolve a FIPS endpoint.
  • :dualstack (Boolean) -- When true, resolve a dualstack

Parameters:
  • variants (Hash) -- Endpoint variants such as 'fips' or 'dualstack'
  • sts_regional_endpoints (String) -- [STS only] Whether to use
  • service (String) -- The endpoint prefix for the service, e.g.
  • region (String) -- The region for the client.
def resolve(region, service, sts_regional_endpoints, variants)
  'https://' + endpoint_for(region, service, build_is_global_fn(sts_regional_endpoints), variants)
end

def resolve(region, service, sts_endpoint = 'regional', variants = {})

def resolve(region, service, sts_endpoint = 'regional', variants = {})
  default_provider.resolve(region, service, sts_endpoint, variants)
end

def resolve_variant(region, service, config_variants)

def resolve_variant(region, service, config_variants)
  tags = Set.new(config_variants.select { |_k,v| v == true }.map { |k,_v| k.to_s })
  is_global_fn = build_is_global_fn # ignore legacy STS config for variants
  partition_cfg = get_partition(region)
  service_cfg = partition_cfg.fetch('services', {})
                             .fetch(service, {})
  endpoints_cfg = service_cfg.fetch('endpoints', {})
  if is_global_fn.call(service, region, endpoints_cfg, service_cfg)
    region = service_cfg.fetch('partitionEndpoint', region)
  end
  region_cfg = endpoints_cfg.fetch(region, {})
  warn_deprecation(service, region) if region_cfg['deprecated']
  partition_defaults = fetch_variant(partition_cfg.fetch('defaults', {}), tags)
  service_defaults = fetch_variant(service_cfg.fetch('defaults', {}), tags)
  endpoint_cfg = fetch_variant(region_cfg, tags)
  # merge upwards, preferring values from endpoint > service > partition
  partition_defaults.merge(service_defaults.merge(endpoint_cfg))
end

def signing_region(region, service, sts_regional_endpoints)

Other tags:
    Api: - private Use the static class methods instead.
def signing_region(region, service, sts_regional_endpoints)
  credential_scope(region, service, build_is_global_fn(sts_regional_endpoints))
    .fetch('region', region)
end

def signing_region(region, service, sts_regional_endpoints = 'regional')

def signing_region(region, service, sts_regional_endpoints = 'regional')
  default_provider.signing_region(region, service, sts_regional_endpoints)
end

def signing_service(region, service)

Other tags:
    Api: - private Use the static class methods instead.
def signing_service(region, service)
  # don't default to the service name
  # signers should prefer the api metadata's signingName
  # if no service is set in the credentialScope
  credential_scope(region, service, build_is_global_fn('regional'))
    .fetch('service', nil)
end

def signing_service(region, service)

def signing_service(region, service)
  default_provider.signing_service(region, service)
end

def validate_variant!(config_variants, resolved_variant)

def validate_variant!(config_variants, resolved_variant)
  unless resolved_variant['hostname'] && resolved_variant['dnsSuffix']
    enabled_variants = config_variants.select { |_k, v| v}.map { |k, _v| k.to_s }.join(', ')
      raise ArgumentError,
          "#{enabled_variants} not supported for this region and partition."
  end
end

def warn_deprecation(service, region)

def warn_deprecation(service, region)
  warn("The endpoint for service: #{service}, region: #{region}"\
       ' is deprecated.')
end