138 lines
3.6 KiB
Go
138 lines
3.6 KiB
Go
|
// Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
||
|
|
||
|
package common
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
//Region type for regions
|
||
|
type Region string
|
||
|
|
||
|
const (
|
||
|
//RegionSEA region SEA
|
||
|
RegionSEA Region = "sea"
|
||
|
//RegionCAToronto1 region for toronto
|
||
|
RegionCAToronto1 Region = "ca-toronto-1"
|
||
|
//RegionPHX region PHX
|
||
|
RegionPHX Region = "us-phoenix-1"
|
||
|
//RegionIAD region IAD
|
||
|
RegionIAD Region = "us-ashburn-1"
|
||
|
//RegionFRA region FRA
|
||
|
RegionFRA Region = "eu-frankfurt-1"
|
||
|
//RegionLHR region LHR
|
||
|
RegionLHR Region = "uk-london-1"
|
||
|
|
||
|
//RegionUSLangley1 region for langley
|
||
|
RegionUSLangley1 Region = "us-langley-1"
|
||
|
//RegionUSLuke1 region for luke
|
||
|
RegionUSLuke1 Region = "us-luke-1"
|
||
|
|
||
|
//RegionUSGovAshburn1 region for langley
|
||
|
RegionUSGovAshburn1 Region = "us-gov-ashburn-1"
|
||
|
//RegionUSGovChicago1 region for luke
|
||
|
RegionUSGovChicago1 Region = "us-gov-chicago-1"
|
||
|
//RegionUSGovPhoenix1 region for luke
|
||
|
RegionUSGovPhoenix1 Region = "us-gov-phoenix-1"
|
||
|
)
|
||
|
|
||
|
var realm = map[string]string{
|
||
|
"oc1": "oraclecloud.com",
|
||
|
"oc2": "oraclegovcloud.com",
|
||
|
"oc3": "oraclegovcloud.com",
|
||
|
}
|
||
|
|
||
|
var regionRealm = map[Region]string{
|
||
|
RegionPHX: "oc1",
|
||
|
RegionIAD: "oc1",
|
||
|
RegionFRA: "oc1",
|
||
|
RegionLHR: "oc1",
|
||
|
RegionCAToronto1: "oc1",
|
||
|
|
||
|
RegionUSLangley1: "oc2",
|
||
|
RegionUSLuke1: "oc2",
|
||
|
|
||
|
RegionUSGovAshburn1: "oc3",
|
||
|
RegionUSGovChicago1: "oc3",
|
||
|
RegionUSGovPhoenix1: "oc3",
|
||
|
}
|
||
|
|
||
|
// Endpoint returns a endpoint for a service
|
||
|
func (region Region) Endpoint(service string) string {
|
||
|
return fmt.Sprintf("%s.%s.%s", service, region, region.secondLevelDomain())
|
||
|
}
|
||
|
|
||
|
// EndpointForTemplate returns a endpoint for a service based on template
|
||
|
func (region Region) EndpointForTemplate(service string, serviceEndpointTemplate string) string {
|
||
|
if serviceEndpointTemplate == "" {
|
||
|
return region.Endpoint(service)
|
||
|
}
|
||
|
|
||
|
// replace service prefix
|
||
|
endpoint := strings.Replace(serviceEndpointTemplate, "{serviceEndpointPrefix}", service, 1)
|
||
|
|
||
|
// replace region
|
||
|
endpoint = strings.Replace(endpoint, "{region}", string(region), 1)
|
||
|
|
||
|
// replace second level domain
|
||
|
endpoint = strings.Replace(endpoint, "{secondLevelDomain}", region.secondLevelDomain(), 1)
|
||
|
|
||
|
return endpoint
|
||
|
}
|
||
|
|
||
|
func (region Region) secondLevelDomain() string {
|
||
|
if realmID, ok := regionRealm[region]; ok {
|
||
|
if secondLevelDomain, ok := realm[realmID]; ok {
|
||
|
return secondLevelDomain
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Debugf("cannot find realm for region : %s, return default realm value.", region)
|
||
|
return realm["oc1"]
|
||
|
}
|
||
|
|
||
|
//StringToRegion convert a string to Region type
|
||
|
func StringToRegion(stringRegion string) (r Region) {
|
||
|
switch strings.ToLower(stringRegion) {
|
||
|
case "sea":
|
||
|
r = RegionSEA
|
||
|
case "ca-toronto-1":
|
||
|
r = RegionCAToronto1
|
||
|
case "phx", "us-phoenix-1":
|
||
|
r = RegionPHX
|
||
|
case "iad", "us-ashburn-1":
|
||
|
r = RegionIAD
|
||
|
case "fra", "eu-frankfurt-1":
|
||
|
r = RegionFRA
|
||
|
case "lhr", "uk-london-1":
|
||
|
r = RegionLHR
|
||
|
case "us-langley-1":
|
||
|
r = RegionUSLangley1
|
||
|
case "us-luke-1":
|
||
|
r = RegionUSLuke1
|
||
|
case "us-gov-ashburn-1":
|
||
|
r = RegionUSGovAshburn1
|
||
|
case "us-gov-chicago-1":
|
||
|
r = RegionUSGovChicago1
|
||
|
case "us-gov-phoenix-1":
|
||
|
r = RegionUSGovPhoenix1
|
||
|
default:
|
||
|
r = Region(stringRegion)
|
||
|
Debugf("region named: %s, is not recognized", stringRegion)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// canStringBeRegion test if the string can be a region, if it can, returns the string as is, otherwise it
|
||
|
// returns an error
|
||
|
var blankRegex = regexp.MustCompile("\\s")
|
||
|
|
||
|
func canStringBeRegion(stringRegion string) (region string, err error) {
|
||
|
if blankRegex.MatchString(stringRegion) || stringRegion == "" {
|
||
|
return "", fmt.Errorf("region can not be empty or have spaces")
|
||
|
}
|
||
|
return stringRegion, nil
|
||
|
}
|