mirror of https://github.com/kubernetes/kops.git
289 lines
5.6 KiB
Go
289 lines
5.6 KiB
Go
/*
|
|
Copyright 2021 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package zones
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"strings"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
|
"github.com/aws/aws-sdk-go/service/ec2"
|
|
"k8s.io/kops/pkg/apis/kops"
|
|
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
|
)
|
|
|
|
// These lists allow us to infer from certain well-known zones to a cloud
|
|
// Note it is safe to "overmap" zones that don't exist: we'll check later if the zones actually exist
|
|
|
|
var gceZones = []string{
|
|
"asia-east1-a",
|
|
"asia-east1-b",
|
|
"asia-east1-c",
|
|
"asia-east1-d",
|
|
|
|
"asia-east2-a",
|
|
"asia-east2-b",
|
|
"asia-east2-c",
|
|
|
|
"asia-northeast1-a",
|
|
"asia-northeast1-b",
|
|
"asia-northeast1-c",
|
|
"asia-northeast1-d",
|
|
|
|
"asia-northeast2-a",
|
|
"asia-northeast2-b",
|
|
"asia-northeast2-c",
|
|
|
|
"asia-northeast3-a",
|
|
"asia-northeast3-b",
|
|
"asia-northeast3-c",
|
|
|
|
"asia-south1-a",
|
|
"asia-south1-b",
|
|
"asia-south1-c",
|
|
|
|
"asia-southeast1-a",
|
|
"asia-southeast1-b",
|
|
|
|
"asia-southeast2-a",
|
|
"asia-southeast2-b",
|
|
"asia-southeast2-c",
|
|
|
|
"australia-southeast1-a",
|
|
"australia-southeast1-b",
|
|
"australia-southeast1-c",
|
|
|
|
"europe-north1-a",
|
|
"europe-north1-b",
|
|
"europe-north1-c",
|
|
|
|
"europe-west1-a",
|
|
"europe-west1-b",
|
|
"europe-west1-c",
|
|
"europe-west1-d",
|
|
"europe-west1-e",
|
|
|
|
"europe-west2-a",
|
|
"europe-west2-b",
|
|
"europe-west2-c",
|
|
|
|
"europe-west3-a",
|
|
"europe-west3-b",
|
|
"europe-west3-c",
|
|
|
|
"europe-west4-a",
|
|
"europe-west4-b",
|
|
"europe-west4-c",
|
|
|
|
"europe-west6-a",
|
|
"europe-west6-b",
|
|
"europe-west6-c",
|
|
|
|
"us-central1-a",
|
|
"us-central1-b",
|
|
"us-central1-c",
|
|
"us-central1-d",
|
|
"us-central1-e",
|
|
"us-central1-f",
|
|
"us-central1-g",
|
|
"us-central1-h",
|
|
|
|
"us-east1-a",
|
|
"us-east1-b",
|
|
"us-east1-c",
|
|
"us-east1-d",
|
|
|
|
"us-east4-a",
|
|
"us-east4-b",
|
|
"us-east4-c",
|
|
|
|
"us-west1-a",
|
|
"us-west1-b",
|
|
"us-west1-c",
|
|
"us-west1-d",
|
|
|
|
"us-west2-a",
|
|
"us-west2-b",
|
|
"us-west2-c",
|
|
|
|
"us-west3-a",
|
|
"us-west3-b",
|
|
"us-west3-c",
|
|
|
|
"us-west4-a",
|
|
"us-west4-b",
|
|
"us-west4-c",
|
|
|
|
"northamerica-northeast1-a",
|
|
"northamerica-northeast1-b",
|
|
"northamerica-northeast1-c",
|
|
|
|
"southamerica-east1-a",
|
|
"southamerica-east1-b",
|
|
"southamerica-east1-c",
|
|
}
|
|
|
|
var doZones = []string{
|
|
"nyc1",
|
|
"nyc3",
|
|
|
|
"sfo3",
|
|
|
|
"ams3",
|
|
|
|
"tor1",
|
|
|
|
"sgp1",
|
|
|
|
"lon1",
|
|
|
|
"fra1",
|
|
|
|
"blr1",
|
|
}
|
|
|
|
var hetznerZones = []string{
|
|
// eu-central
|
|
"fsn1",
|
|
"nbg1",
|
|
"hel1",
|
|
// us-east
|
|
"ash",
|
|
}
|
|
|
|
var azureZones = []string{
|
|
"asia",
|
|
"asiapacific",
|
|
"australia",
|
|
"australiacentral",
|
|
"australiacentral2",
|
|
"australiaeast",
|
|
"australiasoutheast",
|
|
"brazil",
|
|
"brazilsouth",
|
|
"brazilsoutheast",
|
|
"canada",
|
|
"canadacentral",
|
|
"canadaeast",
|
|
"centralindia",
|
|
"centralus",
|
|
"centraluseuap",
|
|
"centralusstage",
|
|
"eastasia",
|
|
"eastasiastage",
|
|
"eastus",
|
|
"eastus2",
|
|
"eastus2euap",
|
|
"eastus2stage",
|
|
"eastusstage",
|
|
"europe",
|
|
"francecentral",
|
|
"francesouth",
|
|
"germanynorth",
|
|
"germanywestcentral",
|
|
"global",
|
|
"india",
|
|
"japan",
|
|
"japaneast",
|
|
"japanwest",
|
|
"koreacentral",
|
|
"koreasouth",
|
|
"northcentralus",
|
|
"northcentralusstage",
|
|
"northeurope",
|
|
"norwayeast",
|
|
"norwaywest",
|
|
"southafricanorth",
|
|
"southafricawest",
|
|
"southcentralus",
|
|
"southcentralusstage",
|
|
"southeastasia",
|
|
"southeastasiastage",
|
|
"southindia",
|
|
"switzerlandnorth",
|
|
"switzerlandwest",
|
|
"uaecentral",
|
|
"uaenorth",
|
|
"uk",
|
|
"uksouth",
|
|
"ukwest",
|
|
"unitedstates",
|
|
"westcentralus",
|
|
"westeurope",
|
|
"westindia",
|
|
"westus",
|
|
"westus2",
|
|
"westus2stage",
|
|
"westusstage",
|
|
}
|
|
|
|
func WellKnownZonesForCloud(matchCloud kops.CloudProviderID, prefix string) []string {
|
|
var found []string
|
|
switch matchCloud {
|
|
case kops.CloudProviderAWS:
|
|
prefix = strings.ToLower(prefix)
|
|
for _, partition := range endpoints.DefaultResolver().(endpoints.EnumPartitions).Partitions() {
|
|
for _, region := range partition.Regions() {
|
|
regionName := strings.ToLower(region.ID())
|
|
if prefix == regionName || strings.HasPrefix(prefix, regionName+"-") {
|
|
// If the prefix is a region name or a Local Zone or a Wavelength Zone,
|
|
// return all its matching zones as the completion options.
|
|
awsCloud, err := awsup.NewAWSCloud(regionName, map[string]string{})
|
|
if err != nil {
|
|
continue
|
|
}
|
|
var zones *ec2.DescribeAvailabilityZonesOutput
|
|
zones, err = awsCloud.EC2().DescribeAvailabilityZones(&ec2.DescribeAvailabilityZonesInput{
|
|
AllAvailabilityZones: aws.Bool(true),
|
|
})
|
|
if err != nil {
|
|
continue
|
|
}
|
|
for _, zone := range zones.AvailabilityZones {
|
|
found = append(found, *zone.ZoneName)
|
|
}
|
|
} else if strings.HasPrefix(regionName, prefix) {
|
|
// Return the region name as the completion option. After the user completes
|
|
// that much, the code will then look up the specific zone options.
|
|
found = append(found, regionName)
|
|
} else {
|
|
// If the zone name is in the form of single-letter zones
|
|
// belonging to a region, that's good enough.
|
|
if len(prefix) == len(regionName)+1 && strings.HasPrefix(prefix, regionName) {
|
|
found = append(found, prefix)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case kops.CloudProviderAzure:
|
|
found = azureZones
|
|
case kops.CloudProviderDO:
|
|
found = doZones
|
|
case kops.CloudProviderGCE:
|
|
found = gceZones
|
|
case kops.CloudProviderHetzner:
|
|
found = hetznerZones
|
|
default:
|
|
return nil
|
|
}
|
|
|
|
sort.Strings(found)
|
|
return found
|
|
}
|