2019-09-04 23:46:00 +00:00
|
|
|
// 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"
|
|
|
|
//RegionAPTokyo1 region for tokyo
|
|
|
|
RegionAPTokyo1 Region = "ap-tokyo-1"
|
|
|
|
//RegionAPSeoul1 region for seoul
|
|
|
|
RegionAPSeoul1 Region = "ap-seoul-1"
|
|
|
|
//RegionAPMumbai1 region for mumbai
|
|
|
|
RegionAPMumbai1 Region = "ap-mumbai-1"
|
|
|
|
//RegionEUZurich1 region for Zurich
|
|
|
|
RegionEUZurich1 Region = "eu-zurich-1"
|
2020-01-11 01:39:52 +00:00
|
|
|
//RegionSASaopaulo1 region for Sao Paulo
|
|
|
|
RegionSASaopaulo1 Region = "sa-saopaulo-1"
|
|
|
|
//RegionAPSydney1 region for Sydney
|
|
|
|
RegionAPSydney1 Region = "ap-sydney-1"
|
2019-09-04 23:46:00 +00:00
|
|
|
//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{
|
2020-01-11 01:39:52 +00:00
|
|
|
RegionPHX: "oc1",
|
|
|
|
RegionIAD: "oc1",
|
|
|
|
RegionFRA: "oc1",
|
|
|
|
RegionLHR: "oc1",
|
|
|
|
RegionCAToronto1: "oc1",
|
|
|
|
RegionAPTokyo1: "oc1",
|
|
|
|
RegionAPSeoul1: "oc1",
|
|
|
|
RegionAPSydney1: "oc1",
|
|
|
|
RegionAPMumbai1: "oc1",
|
|
|
|
RegionEUZurich1: "oc1",
|
|
|
|
RegionSASaopaulo1: "oc1",
|
2019-09-04 23:46:00 +00:00
|
|
|
|
|
|
|
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
|
2020-01-11 01:39:52 +00:00
|
|
|
case "yyz", "ca-toronto-1":
|
2019-09-04 23:46:00 +00:00
|
|
|
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
|
2020-01-11 01:39:52 +00:00
|
|
|
case "nrt", "ap-tokyo-1":
|
2019-09-04 23:46:00 +00:00
|
|
|
r = RegionAPTokyo1
|
2020-01-11 01:39:52 +00:00
|
|
|
case "icn", "ap-seoul-1":
|
2019-09-04 23:46:00 +00:00
|
|
|
r = RegionAPSeoul1
|
2020-01-11 01:39:52 +00:00
|
|
|
case "bom", "ap-mumbai-1":
|
2019-09-04 23:46:00 +00:00
|
|
|
r = RegionAPMumbai1
|
2020-01-11 01:39:52 +00:00
|
|
|
case "zrh", "eu-zurich-1":
|
2019-09-04 23:46:00 +00:00
|
|
|
r = RegionEUZurich1
|
2020-01-11 01:39:52 +00:00
|
|
|
case "gru", "sa-saopaulo-1":
|
|
|
|
r = RegionSASaopaulo1
|
|
|
|
case "syd", "ap-sydney-1":
|
|
|
|
r = RegionAPSydney1
|
2019-09-04 23:46:00 +00:00
|
|
|
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
|
|
|
|
}
|