blob: c86efa4ad6a50c9a8f3344a469354700995ed7f0 [file] [log] [blame]
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package gke_test
import (
"context"
"strings"
"testing"
"cloud.google.com/go/compute/metadata"
"golang.org/x/build/kubernetes"
"golang.org/x/build/kubernetes/gke"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
compute "google.golang.org/api/compute/v1"
container "google.golang.org/api/container/v1"
)
// Tests NewClient and also Dialer.
func TestNewClient(t *testing.T) {
if !metadata.OnGCE() {
t.Skip("not on GCE; skipping")
}
ctx := context.Background()
ts, err := google.DefaultTokenSource(ctx, compute.CloudPlatformScope)
if err != nil {
t.Fatal(err)
}
httpClient := oauth2.NewClient(ctx, ts)
containerService, err := container.New(httpClient)
if err != nil {
t.Fatal(err)
}
proj, err := metadata.ProjectID()
if err != nil {
t.Fatal(err)
}
clusters, err := containerService.Projects.Zones.Clusters.List(proj, "-").Context(ctx).Do()
if err != nil {
t.Fatal(err)
}
if len(clusters.Clusters) == 0 {
t.Skip("no GKE clusters")
}
var candidates int
for _, cl := range clusters.Clusters {
kc, err := gke.NewClient(ctx, cl.Name, gke.OptZone(cl.Zone))
if err != nil {
t.Fatal(err)
}
defer kc.Close()
pods, err := kc.GetPods(ctx)
if err != nil {
t.Fatal(err)
}
for _, pod := range pods {
if pod.Status.Phase != "Running" {
continue
}
for _, container := range pod.Spec.Containers {
name := container.Name
for _, port := range container.Ports {
if strings.ToLower(string(port.Protocol)) == "udp" || port.ContainerPort == 0 {
continue
}
candidates++
d := kubernetes.NewDialer(kc)
c, err := d.Dial(ctx, name, port.ContainerPort)
if err != nil {
t.Logf("Dial %q/%q/%d: %v", cl.Name, name, port.ContainerPort, err)
continue
}
c.Close()
t.Logf("Dialed %q/%q/%d.", cl.Name, name, port.ContainerPort)
return
}
}
}
}
if candidates == 0 {
t.Skip("no pods to dial")
}
t.Errorf("dial failures")
}