From 3e8b4a27c48aae548234bef0a4e87c54e4a03ef2 Mon Sep 17 00:00:00 2001 From: Minhan Xia Date: Fri, 7 Jul 2017 17:08:44 -0700 Subject: [PATCH] use overrided api endpoint in gce cloud provider --- cluster/gce/config-default.sh | 4 ++- cluster/gce/config-test.sh | 3 ++ pkg/cloudprovider/providers/gce/gce.go | 25 ++++++++++---- pkg/cloudprovider/providers/gce/gce_disks.go | 15 +++++---- .../providers/gce/gce_disks_test.go | 2 +- .../providers/gce/gce_instances.go | 6 ++-- .../gce/gce_loadbalancer_external.go | 9 +++-- .../gce/gce_loadbalancer_internal.go | 2 +- pkg/cloudprovider/providers/gce/gce_zones.go | 3 +- vendor/BUILD | 1 + .../api/compute/v0.alpha/BUILD | 33 +++++++++++++++++++ 11 files changed, 78 insertions(+), 25 deletions(-) create mode 100644 vendor/google.golang.org/api/compute/v0.alpha/BUILD diff --git a/cluster/gce/config-default.sh b/cluster/gce/config-default.sh index 476c505bbb0..d2b6837ce45 100755 --- a/cluster/gce/config-default.sh +++ b/cluster/gce/config-default.sh @@ -19,6 +19,9 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. source "${KUBE_ROOT}/cluster/gce/config-common.sh" +# Specifying KUBE_GCE_API_ENDPOINT will override the default GCE Compute API endpoint (https://www.googleapis.com/compute/v1/). +# This endpoint has to be pointing to v1 api. For example, https://www.googleapis.com/compute/staging_v1/ +GCE_API_ENDPOINT=${KUBE_GCE_API_ENDPOINT:-} GCLOUD=gcloud ZONE=${KUBE_GCE_ZONE:-us-central1-b} REGION=${ZONE%-*} @@ -73,7 +76,6 @@ GCI_VERSION=${KUBE_GCI_VERSION:-cos-stable-59-9460-64-0} MASTER_IMAGE=${KUBE_GCE_MASTER_IMAGE:-} MASTER_IMAGE_PROJECT=${KUBE_GCE_MASTER_PROJECT:-cos-cloud} NODE_IMAGE=${KUBE_GCE_NODE_IMAGE:-${GCI_VERSION}} -GCE_API_ENDPOINT=${KUBE_GCE_API_ENDPOINT:-} NODE_IMAGE_PROJECT=${KUBE_GCE_NODE_PROJECT:-cos-cloud} CONTAINER_RUNTIME=${KUBE_CONTAINER_RUNTIME:-docker} RKT_VERSION=${KUBE_RKT_VERSION:-1.23.0} diff --git a/cluster/gce/config-test.sh b/cluster/gce/config-test.sh index 28ed5bcca96..216d766009e 100755 --- a/cluster/gce/config-test.sh +++ b/cluster/gce/config-test.sh @@ -19,6 +19,9 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. source "${KUBE_ROOT}/cluster/gce/config-common.sh" +# Specifying KUBE_GCE_API_ENDPOINT will override the default GCE Compute API endpoint (https://www.googleapis.com/compute/v1/). +# This endpoint has to be pointing to v1 api. For example, https://www.googleapis.com/compute/staging_v1/ +GCE_API_ENDPOINT=${KUBE_GCE_API_ENDPOINT:-} GCLOUD=gcloud ZONE=${KUBE_GCE_ZONE:-us-central1-b} REGION=${ZONE%-*} diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index fe021568d3c..2a701caba38 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -76,6 +76,8 @@ const ( gceHcHealthyThreshold = int64(1) // Defaults to 5 * 2 = 10 seconds before the LB will steer traffic away gceHcUnhealthyThreshold = int64(5) + + gceComputeAPIEndpoint = "https://www.googleapis.com/compute/v1/" ) // GCECloud is an implementation of Interface, LoadBalancer and Instances for Google Compute Engine. @@ -146,7 +148,8 @@ type Config struct { NodeTags []string `gcfg:"node-tags"` NodeInstancePrefix string `gcfg:"node-instance-prefix"` Multizone bool `gcfg:"multizone"` - ApiEndpoint string `gcfg:"api-endpoint"` + // Specifying ApiEndpoint will override the default GCE compute API endpoint. + ApiEndpoint string `gcfg:"api-endpoint"` } } @@ -269,24 +272,33 @@ func CreateGCECloud(apiEndpoint, projectID, networkProjectID, region, zone strin if err != nil { return nil, err } - service, err := compute.New(client) if err != nil { return nil, err } client, err = newOauthClient(tokenSource) + if err != nil { + return nil, err + } serviceBeta, err := computebeta.New(client) if err != nil { return nil, err } client, err = newOauthClient(tokenSource) + if err != nil { + return nil, err + } serviceAlpha, err := computealpha.New(client) if err != nil { return nil, err } + // Expect override api endpoint to always be v1 api and follows the same pattern as prod. + // Generate alpha and beta api endpoints based on override v1 api endpoint. + // For example, + // staging API endpoint: https://www.googleapis.com/compute/staging_v1/ if apiEndpoint != "" { service.BasePath = fmt.Sprintf("%sprojects/", apiEndpoint) serviceBeta.BasePath = fmt.Sprintf("%sprojects/", strings.Replace(apiEndpoint, "v1", "beta", 0)) @@ -423,16 +435,16 @@ var _ cloudprovider.Interface = (*GCECloud)(nil) func gceNetworkURL(apiEndpoint, project, network string) string { if apiEndpoint == "" { - apiEndpoint = "https://www.googleapis.com/compute/v1/" + apiEndpoint = gceComputeAPIEndpoint } - return fmt.Sprintf("%vprojects/%s/global/networks/%s", apiEndpoint, project, network) + return apiEndpoint + strings.Join([]string{"projects", project, "global", "networks", network}, "/") } func gceSubnetworkURL(apiEndpoint, project, region, subnetwork string) string { if apiEndpoint == "" { - apiEndpoint = "https://www.googleapis.com/compute/v1/" + apiEndpoint = gceComputeAPIEndpoint } - return fmt.Sprintf("%vprojects/%s/regions/%s/subnetworks/%s", apiEndpoint, project, region, subnetwork) + return apiEndpoint + strings.Join([]string{"projects", project, "regions", region, "subnetworks", subnetwork}, "/") } // Project IDs cannot have a digit for the first characeter. If the id contains a digit, @@ -441,7 +453,6 @@ func isProjectNumber(idOrNumber string) bool { if len(idOrNumber) == 0 { return false } - return idOrNumber[0] >= '0' && idOrNumber[0] <= '9' } diff --git a/pkg/cloudprovider/providers/gce/gce_disks.go b/pkg/cloudprovider/providers/gce/gce_disks.go index d91bdec664a..8741fa0a8df 100644 --- a/pkg/cloudprovider/providers/gce/gce_disks.go +++ b/pkg/cloudprovider/providers/gce/gce_disks.go @@ -20,7 +20,6 @@ import ( "encoding/json" "fmt" "net/http" - "path" "strings" "time" @@ -41,7 +40,7 @@ const ( DiskTypeStandard = "pd-standard" diskTypeDefault = DiskTypeStandard - diskTypeUriTemplate = "https://www.googleapis.com/compute/v1/projects/%s/zones/%s/diskTypes/%s" + diskTypeUriTemplate = "%s/zones/%s/diskTypes/%s" ) // Disks is interface for manipulation with GCE PDs. @@ -234,7 +233,12 @@ func (gce *GCECloud) CreateDisk( default: return fmt.Errorf("invalid GCE disk type %q", diskType) } - diskTypeUri := fmt.Sprintf(diskTypeUriTemplate, gce.projectID, zone, diskType) + + apiEndpoint := gceComputeAPIEndpoint + "projects/" + if gce.service != nil { + apiEndpoint = gce.service.BasePath + } + diskTypeUri := apiEndpoint + fmt.Sprintf(diskTypeUriTemplate, gce.projectID, zone, diskType) diskToCreate := &compute.Disk{ Name: name, @@ -424,9 +428,8 @@ func (gce *GCECloud) convertDiskToAttachedDisk(disk *GCEDisk, readWrite string) DeviceName: disk.Name, Kind: disk.Kind, Mode: readWrite, - Source: "https://" + path.Join( - "www.googleapis.com/compute/v1/projects/", - gce.projectID, "zones", disk.Zone, "disks", disk.Name), + Source: gce.service.BasePath + strings.Join([]string{ + gce.projectID, "zones", disk.Zone, "disks", disk.Name}, "/"), Type: "PERSISTENT", } } diff --git a/pkg/cloudprovider/providers/gce/gce_disks_test.go b/pkg/cloudprovider/providers/gce/gce_disks_test.go index 7333776ef7a..5ff88d65c0b 100644 --- a/pkg/cloudprovider/providers/gce/gce_disks_test.go +++ b/pkg/cloudprovider/providers/gce/gce_disks_test.go @@ -43,7 +43,7 @@ func TestCreateDisk_Basic(t *testing.T) { tags := make(map[string]string) tags["test-tag"] = "test-value" - diskTypeUri := fmt.Sprintf(diskTypeUriTemplate, projectId, zone, diskType) + diskTypeUri := gceComputeAPIEndpoint + "projects/" + fmt.Sprintf(diskTypeUriTemplate, projectId, zone, diskType) expectedDescription := "{\"test-tag\":\"test-value\"}" /* Act */ diff --git a/pkg/cloudprovider/providers/gce/gce_instances.go b/pkg/cloudprovider/providers/gce/gce_instances.go index 94262134479..8d997ae9ed4 100644 --- a/pkg/cloudprovider/providers/gce/gce_instances.go +++ b/pkg/cloudprovider/providers/gce/gce_instances.go @@ -25,7 +25,7 @@ import ( "cloud.google.com/go/compute/metadata" "github.com/golang/glog" - computealpha "google.golang.org/api/compute/v0.beta" + computebeta "google.golang.org/api/compute/v0.beta" compute "google.golang.org/api/compute/v1" "k8s.io/api/core/v1" @@ -69,7 +69,7 @@ func getZone(n *v1.Node) string { // ToInstanceReferences returns instance references by links func (gce *GCECloud) ToInstanceReferences(zone string, instanceNames []string) (refs []*compute.InstanceReference) { for _, ins := range instanceNames { - instanceLink := makeHostURL(gce.projectID, zone, ins) + instanceLink := makeHostURL(gce.service.BasePath, gce.projectID, zone, ins) refs = append(refs, &compute.InstanceReference{Instance: instanceLink}) } return refs @@ -303,7 +303,7 @@ func (gce *GCECloud) AliasRanges(nodeName types.NodeName) (cidrs []string, err e return } - var res *computealpha.Instance + var res *computebeta.Instance res, err = gce.serviceBeta.Instances.Get( gce.projectID, instance.Zone, instance.Name).Do() if err != nil { diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go index 6f0acb59373..79ed5827d78 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go @@ -483,7 +483,7 @@ func (gce *GCECloud) createTargetPool(name, serviceName, ipAddress, region, clus var instances []string for _, host := range hosts { - instances = append(instances, makeHostURL(gce.projectID, host.Zone, host.Name)) + instances = append(instances, makeHostURL(gce.service.BasePath, gce.projectID, host.Zone, host.Name)) } glog.Infof("Creating targetpool %v with %d healthchecks", name, len(hcLinks)) pool := &compute.TargetPool{ @@ -542,7 +542,7 @@ func (gce *GCECloud) updateTargetPool(loadBalancerName string, existing sets.Str } func (gce *GCECloud) targetPoolURL(name, region string) string { - return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/targetPools/%s", gce.projectID, region, name) + return gce.service.BasePath + strings.Join([]string{"projects", gce.projectID, "regions", region, "targetPools", name}, "/") } func makeHttpHealthCheck(name, path string, port int32) *compute.HttpHealthCheck { @@ -671,10 +671,9 @@ func nodeNames(nodes []*v1.Node) []string { return ret } -func makeHostURL(projectID, zone, host string) string { +func makeHostURL(apiEndpoint, projectID, zone, host string) string { host = canonicalizeInstanceName(host) - return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/instances/%s", - projectID, zone, host) + return apiEndpoint + strings.Join([]string{"projects", projectID, "zones", zone, "instances", host}, "/") } func hostURLToComparablePath(hostURL string) string { diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go index a663e9a44e7..4eab7a6bcb4 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go @@ -624,7 +624,7 @@ func getPortsAndProtocol(svcPorts []v1.ServicePort) (ports []string, protocol v1 } func (gce *GCECloud) getBackendServiceLink(name string) string { - return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/backendServices/%s", gce.projectID, gce.region, name) + return gce.service.BasePath + strings.Join([]string{"projects", gce.projectID, "regions", gce.region, "backendServices", name}, "/") } func getNameFromLink(link string) string { diff --git a/pkg/cloudprovider/providers/gce/gce_zones.go b/pkg/cloudprovider/providers/gce/gce_zones.go index c8258749a2c..9f261be8fa1 100644 --- a/pkg/cloudprovider/providers/gce/gce_zones.go +++ b/pkg/cloudprovider/providers/gce/gce_zones.go @@ -23,6 +23,7 @@ import ( compute "google.golang.org/api/compute/v1" "k8s.io/kubernetes/pkg/cloudprovider" + "strings" ) func newZonesMetricContext(request, region string) *metricContext { @@ -52,5 +53,5 @@ func (gce *GCECloud) ListZonesInRegion(region string) ([]*compute.Zone, error) { } func (gce *GCECloud) getRegionLink(region string) string { - return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%v/regions/%v", gce.networkProjectID, region) + return gce.service.BasePath + strings.Join([]string{"projects", gce.networkProjectID, "regions", region}, "/") } diff --git a/vendor/BUILD b/vendor/BUILD index adaeeec05b9..cf837e14ce8 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -352,6 +352,7 @@ filegroup( "//vendor/golang.org/x/tools/container/intsets:all-srcs", "//vendor/google.golang.org/api/cloudkms/v1:all-srcs", "//vendor/google.golang.org/api/cloudmonitoring/v2beta2:all-srcs", + "//vendor/google.golang.org/api/compute/v0.alpha:all-srcs", "//vendor/google.golang.org/api/compute/v0.beta:all-srcs", "//vendor/google.golang.org/api/compute/v1:all-srcs", "//vendor/google.golang.org/api/container/v1:all-srcs", diff --git a/vendor/google.golang.org/api/compute/v0.alpha/BUILD b/vendor/google.golang.org/api/compute/v0.alpha/BUILD new file mode 100644 index 00000000000..5c25b75f590 --- /dev/null +++ b/vendor/google.golang.org/api/compute/v0.alpha/BUILD @@ -0,0 +1,33 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["compute-gen.go"], + tags = ["automanaged"], + deps = [ + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", + "//vendor/google.golang.org/api/gensupport:go_default_library", + "//vendor/google.golang.org/api/googleapi:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +)