Merge pull request #67736 from cheftako/GetClusters

Automatic merge from submit-queue (batch tested with PRs 67736, 68123, 68138). If you want to cherry-pick this change to another branch, please follow the instructions here: https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md.

Added support to get clusters in gce cloud provider.

**What this PR does / why we need it**:
Implemented the call to get all cluster objects in a zone for a project.
Also added code to allow the container api to be set in the gce.conf
file.

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #

**Special notes for your reviewer**:

**Release note**:
```release-note
NONE
```
pull/8/head
Kubernetes Submit Queue 2018-09-04 12:51:32 -07:00 committed by GitHub
commit 4b4e1bec69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 22 deletions

View File

@ -570,6 +570,12 @@ EOF
cat <<EOF >>/etc/gce.conf cat <<EOF >>/etc/gce.conf
token-url = ${TOKEN_URL} token-url = ${TOKEN_URL}
token-body = ${TOKEN_BODY} token-body = ${TOKEN_BODY}
EOF
fi
if [[ -n "${CONTAINER_API_ENDPOINT:-}" ]]; then
use_cloud_config="true"
cat <<EOF >>/etc/gce.conf
container-api-endpoint = ${CONTAINER_API_ENDPOINT}
EOF EOF
fi fi
if [[ -n "${PROJECT_ID:-}" ]]; then if [[ -n "${PROJECT_ID:-}" ]]; then

View File

@ -178,6 +178,9 @@ type ConfigGlobal struct {
// ApiEndpoint is the GCE compute API endpoint to use. If this is blank, // ApiEndpoint is the GCE compute API endpoint to use. If this is blank,
// then the default endpoint is used. // then the default endpoint is used.
ApiEndpoint string `gcfg:"api-endpoint"` ApiEndpoint string `gcfg:"api-endpoint"`
// ContainerApiEndpoint is the GCE container API endpoint to use. If this is blank,
// then the default endpoint is used.
ContainerApiEndpoint string `gcfg:"container-api-endpoint"`
// LocalZone specifies the GCE zone that gce cloud client instance is // LocalZone specifies the GCE zone that gce cloud client instance is
// located in (i.e. where the controller will be running). If this is // located in (i.e. where the controller will be running). If this is
// blank, then the local zone will be discovered via the metadata server. // blank, then the local zone will be discovered via the metadata server.
@ -194,22 +197,23 @@ type ConfigFile struct {
// CloudConfig includes all the necessary configuration for creating GCECloud // CloudConfig includes all the necessary configuration for creating GCECloud
type CloudConfig struct { type CloudConfig struct {
ApiEndpoint string ApiEndpoint string
ProjectID string ContainerApiEndpoint string
NetworkProjectID string ProjectID string
Region string NetworkProjectID string
Zone string Region string
ManagedZones []string Zone string
NetworkName string ManagedZones []string
NetworkURL string NetworkName string
SubnetworkName string NetworkURL string
SubnetworkURL string SubnetworkName string
SecondaryRangeName string SubnetworkURL string
NodeTags []string SecondaryRangeName string
NodeInstancePrefix string NodeTags []string
TokenSource oauth2.TokenSource NodeInstancePrefix string
UseMetadataServer bool TokenSource oauth2.TokenSource
AlphaFeatureGate *AlphaFeatureGate UseMetadataServer bool
AlphaFeatureGate *AlphaFeatureGate
} }
func init() { func init() {
@ -238,6 +242,11 @@ func (g *GCECloud) Compute() cloud.Cloud {
return g.c return g.c
} }
// ContainerService returns the container service.
func (g *GCECloud) ContainerService() *container.Service {
return g.containerService
}
// newGCECloud creates a new instance of GCECloud. // newGCECloud creates a new instance of GCECloud.
func newGCECloud(config io.Reader) (gceCloud *GCECloud, err error) { func newGCECloud(config io.Reader) (gceCloud *GCECloud, err error) {
var cloudConfig *CloudConfig var cloudConfig *CloudConfig
@ -278,6 +287,10 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err
cloudConfig.ApiEndpoint = configFile.Global.ApiEndpoint cloudConfig.ApiEndpoint = configFile.Global.ApiEndpoint
} }
if configFile.Global.ContainerApiEndpoint != "" {
cloudConfig.ContainerApiEndpoint = configFile.Global.ContainerApiEndpoint
}
if configFile.Global.TokenURL != "" { if configFile.Global.TokenURL != "" {
// if tokenURL is nil, set tokenSource to nil. This will force the OAuth client to fall // if tokenURL is nil, set tokenSource to nil. This will force the OAuth client to fall
// back to use DefaultTokenSource. This allows running gceCloud remotely. // back to use DefaultTokenSource. This allows running gceCloud remotely.
@ -419,6 +432,9 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) {
return nil, err return nil, err
} }
containerService.UserAgent = userAgent containerService.UserAgent = userAgent
if config.ContainerApiEndpoint != "" {
containerService.BasePath = config.ContainerApiEndpoint
}
tpuService, err := newTPUService(client) tpuService, err := newTPUService(client)
if err != nil { if err != nil {

View File

@ -16,7 +16,10 @@ limitations under the License.
package gce package gce
import "context" import (
"context"
container "google.golang.org/api/container/v1"
)
func newClustersMetricContext(request, zone string) *metricContext { func newClustersMetricContext(request, zone string) *metricContext {
return newGenericMetricContext("clusters", request, unusedMetricLabel, zone, computeV1Version) return newGenericMetricContext("clusters", request, unusedMetricLabel, zone, computeV1Version)
@ -37,11 +40,37 @@ func (gce *GCECloud) ListClusters(ctx context.Context) ([]string, error) {
return allClusters, nil return allClusters, nil
} }
func (gce *GCECloud) GetManagedClusters(ctx context.Context) ([]*container.Cluster, error) {
managedClusters := []*container.Cluster{}
for _, zone := range gce.managedZones {
clusters, err := gce.getClustersInZone(zone)
if err != nil {
return nil, err
}
managedClusters = append(managedClusters, clusters...)
}
return managedClusters, nil
}
func (gce *GCECloud) Master(ctx context.Context, clusterName string) (string, error) { func (gce *GCECloud) Master(ctx context.Context, clusterName string) (string, error) {
return "k8s-" + clusterName + "-master.internal", nil return "k8s-" + clusterName + "-master.internal", nil
} }
func (gce *GCECloud) listClustersInZone(zone string) ([]string, error) { func (gce *GCECloud) listClustersInZone(zone string) ([]string, error) {
clusters, err := gce.getClustersInZone(zone)
if err != nil {
return nil, err
}
result := []string{}
for _, cluster := range clusters {
result = append(result, cluster.Name)
}
return result, nil
}
func (gce *GCECloud) getClustersInZone(zone string) ([]*container.Cluster, error) {
mc := newClustersMetricContext("list_zone", zone) mc := newClustersMetricContext("list_zone", zone)
// TODO: use PageToken to list all not just the first 500 // TODO: use PageToken to list all not just the first 500
list, err := gce.containerService.Projects.Zones.Clusters.List(gce.projectID, zone).Do() list, err := gce.containerService.Projects.Zones.Clusters.List(gce.projectID, zone).Do()
@ -49,9 +78,5 @@ func (gce *GCECloud) listClustersInZone(zone string) ([]string, error) {
return nil, mc.Observe(err) return nil, mc.Observe(err)
} }
result := []string{} return list.Clusters, mc.Observe(nil)
for _, cluster := range list.Clusters {
result = append(result, cluster.Name)
}
return result, mc.Observe(nil)
} }