partition.go raw

   1  package awsrulesfn
   2  
   3  import "regexp"
   4  
   5  // Partition provides the metadata describing an AWS partition.
   6  type Partition struct {
   7  	ID            string                     `json:"id"`
   8  	Regions       map[string]RegionOverrides `json:"regions"`
   9  	RegionRegex   string                     `json:"regionRegex"`
  10  	DefaultConfig PartitionConfig            `json:"outputs"`
  11  }
  12  
  13  // PartitionConfig provides the endpoint metadata for an AWS region or partition.
  14  type PartitionConfig struct {
  15  	Name                 string `json:"name"`
  16  	DnsSuffix            string `json:"dnsSuffix"`
  17  	DualStackDnsSuffix   string `json:"dualStackDnsSuffix"`
  18  	SupportsFIPS         bool   `json:"supportsFIPS"`
  19  	SupportsDualStack    bool   `json:"supportsDualStack"`
  20  	ImplicitGlobalRegion string `json:"implicitGlobalRegion"`
  21  }
  22  
  23  type RegionOverrides struct {
  24  	Name               *string `json:"name"`
  25  	DnsSuffix          *string `json:"dnsSuffix"`
  26  	DualStackDnsSuffix *string `json:"dualStackDnsSuffix"`
  27  	SupportsFIPS       *bool   `json:"supportsFIPS"`
  28  	SupportsDualStack  *bool   `json:"supportsDualStack"`
  29  }
  30  
  31  const defaultPartition = "aws"
  32  
  33  func getPartition(partitions []Partition, region string) *PartitionConfig {
  34  	for _, partition := range partitions {
  35  		if v, ok := partition.Regions[region]; ok {
  36  			p := mergeOverrides(partition.DefaultConfig, v)
  37  			return &p
  38  		}
  39  	}
  40  
  41  	for _, partition := range partitions {
  42  		regionRegex := regexp.MustCompile(partition.RegionRegex)
  43  		if regionRegex.MatchString(region) {
  44  			v := partition.DefaultConfig
  45  			return &v
  46  		}
  47  	}
  48  
  49  	for _, partition := range partitions {
  50  		if partition.ID == defaultPartition {
  51  			v := partition.DefaultConfig
  52  			return &v
  53  		}
  54  	}
  55  
  56  	return nil
  57  }
  58  
  59  func mergeOverrides(into PartitionConfig, from RegionOverrides) PartitionConfig {
  60  	if from.Name != nil {
  61  		into.Name = *from.Name
  62  	}
  63  	if from.DnsSuffix != nil {
  64  		into.DnsSuffix = *from.DnsSuffix
  65  	}
  66  	if from.DualStackDnsSuffix != nil {
  67  		into.DualStackDnsSuffix = *from.DualStackDnsSuffix
  68  	}
  69  	if from.SupportsFIPS != nil {
  70  		into.SupportsFIPS = *from.SupportsFIPS
  71  	}
  72  	if from.SupportsDualStack != nil {
  73  		into.SupportsDualStack = *from.SupportsDualStack
  74  	}
  75  	return into
  76  }
  77