mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 22:17:14 +00:00
added a e2e test that uses the staged client; made necessary changes to gcp auth plugin to pass the gke tests
This commit is contained in:
parent
adb75e1fd1
commit
51c0271e0a
@ -25,6 +25,7 @@ import (
|
|||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"golang.org/x/oauth2/google"
|
"golang.org/x/oauth2/google"
|
||||||
|
|
||||||
|
clientreporestclient "k8s.io/client-go/1.4/rest"
|
||||||
"k8s.io/kubernetes/pkg/client/restclient"
|
"k8s.io/kubernetes/pkg/client/restclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -32,6 +33,9 @@ func init() {
|
|||||||
if err := restclient.RegisterAuthProviderPlugin("gcp", newGCPAuthProvider); err != nil {
|
if err := restclient.RegisterAuthProviderPlugin("gcp", newGCPAuthProvider); err != nil {
|
||||||
glog.Fatalf("Failed to register gcp auth plugin: %v", err)
|
glog.Fatalf("Failed to register gcp auth plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
if err := clientreporestclient.RegisterAuthProviderPlugin("gcp", newGCPAuthProviderForClientRepo); err != nil {
|
||||||
|
glog.Fatalf("Failed to register gcp auth plugin: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type gcpAuthProvider struct {
|
type gcpAuthProvider struct {
|
||||||
@ -47,6 +51,15 @@ func newGCPAuthProvider(_ string, gcpConfig map[string]string, persister restcli
|
|||||||
return &gcpAuthProvider{ts, persister}, nil
|
return &gcpAuthProvider{ts, persister}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newGCPAuthProviderForClientRepo is the same as newGCPAuthProvider, but is programmed against client-go's interface
|
||||||
|
func newGCPAuthProviderForClientRepo(_ string, gcpConfig map[string]string, persister clientreporestclient.AuthProviderConfigPersister) (clientreporestclient.AuthProvider, error) {
|
||||||
|
ts, err := newCachedTokenSource(gcpConfig["access-token"], gcpConfig["expiry"], persister)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &gcpAuthProvider{ts, persister}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (g *gcpAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper {
|
func (g *gcpAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper {
|
||||||
return &oauth2.Transport{
|
return &oauth2.Transport{
|
||||||
Source: g.tokenSource,
|
Source: g.tokenSource,
|
||||||
|
@ -32,7 +32,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
|
gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
|
||||||
"k8s.io/kubernetes/pkg/util"
|
"k8s.io/kubernetes/pkg/util/logs"
|
||||||
"k8s.io/kubernetes/pkg/util/runtime"
|
"k8s.io/kubernetes/pkg/util/runtime"
|
||||||
commontest "k8s.io/kubernetes/test/e2e/common"
|
commontest "k8s.io/kubernetes/test/e2e/common"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
@ -215,8 +215,8 @@ var _ = ginkgo.SynchronizedAfterSuite(func() {
|
|||||||
// This function is called on each Ginkgo node in parallel mode.
|
// This function is called on each Ginkgo node in parallel mode.
|
||||||
func RunE2ETests(t *testing.T) {
|
func RunE2ETests(t *testing.T) {
|
||||||
runtime.ReallyCrash = true
|
runtime.ReallyCrash = true
|
||||||
util.InitLogs()
|
logs.InitLogs()
|
||||||
defer util.FlushLogs()
|
defer logs.FlushLogs()
|
||||||
|
|
||||||
gomega.RegisterFailHandler(ginkgo.Fail)
|
gomega.RegisterFailHandler(ginkgo.Fail)
|
||||||
// Disable skipped tests unless they are explicitly requested.
|
// Disable skipped tests unless they are explicitly requested.
|
||||||
|
@ -18,6 +18,7 @@ package framework
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -25,6 +26,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
release_1_4 "k8s.io/client-go/1.4/kubernetes"
|
||||||
|
"k8s.io/client-go/1.4/pkg/util/sets"
|
||||||
|
clientreporestclient "k8s.io/client-go/1.4/rest"
|
||||||
"k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset"
|
"k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset"
|
||||||
unversionedfederation "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned"
|
unversionedfederation "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned"
|
||||||
"k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
|
"k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
|
||||||
@ -33,6 +37,7 @@ import (
|
|||||||
apierrs "k8s.io/kubernetes/pkg/api/errors"
|
apierrs "k8s.io/kubernetes/pkg/api/errors"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3"
|
||||||
|
"k8s.io/kubernetes/pkg/client/restclient"
|
||||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
@ -57,6 +62,7 @@ type Framework struct {
|
|||||||
Client *client.Client
|
Client *client.Client
|
||||||
Clientset_1_2 *release_1_2.Clientset
|
Clientset_1_2 *release_1_2.Clientset
|
||||||
Clientset_1_3 *release_1_3.Clientset
|
Clientset_1_3 *release_1_3.Clientset
|
||||||
|
StagingClient *release_1_4.Clientset
|
||||||
|
|
||||||
// TODO(mml): Remove this. We should generally use the versioned clientset.
|
// TODO(mml): Remove this. We should generally use the versioned clientset.
|
||||||
FederationClientset *federation_internalclientset.Clientset
|
FederationClientset *federation_internalclientset.Clientset
|
||||||
@ -131,6 +137,38 @@ func NewFramework(baseName string, options FrameworkOptions, client *client.Clie
|
|||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getClientRepoConfig copies k8s.io/kubernetes/pkg/client/restclient.Config to
|
||||||
|
// a k8s.io/client-go/pkg/client/restclient.Config. It's not a deep copy. Two
|
||||||
|
// configs may share some common struct.
|
||||||
|
func getClientRepoConfig(src *restclient.Config) (dst *clientreporestclient.Config) {
|
||||||
|
skippedFields := sets.NewString("Transport", "WrapTransport", "RateLimiter", "AuthConfigPersister")
|
||||||
|
dst = &clientreporestclient.Config{}
|
||||||
|
dst.Transport = src.Transport
|
||||||
|
dst.WrapTransport = src.WrapTransport
|
||||||
|
dst.RateLimiter = src.RateLimiter
|
||||||
|
dst.AuthConfigPersister = src.AuthConfigPersister
|
||||||
|
sv := reflect.ValueOf(src).Elem()
|
||||||
|
dv := reflect.ValueOf(dst).Elem()
|
||||||
|
for i := 0; i < sv.NumField(); i++ {
|
||||||
|
if skippedFields.Has(sv.Type().Field(i).Name) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
sf := sv.Field(i).Interface()
|
||||||
|
data, err := json.Marshal(sf)
|
||||||
|
if err != nil {
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
}
|
||||||
|
if !dv.Field(i).CanAddr() {
|
||||||
|
Failf("unaddressable field: %v", dv.Type().Field(i).Name)
|
||||||
|
} else {
|
||||||
|
if err := json.Unmarshal(data, dv.Field(i).Addr().Interface()); err != nil {
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
// BeforeEach gets a client and makes a namespace.
|
// BeforeEach gets a client and makes a namespace.
|
||||||
func (f *Framework) BeforeEach() {
|
func (f *Framework) BeforeEach() {
|
||||||
// The fact that we need this feels like a bug in ginkgo.
|
// The fact that we need this feels like a bug in ginkgo.
|
||||||
@ -149,9 +187,11 @@ func (f *Framework) BeforeEach() {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
f.Client = c
|
f.Client = c
|
||||||
f.Clientset_1_2, err = release_1_2.NewForConfig(config)
|
f.Clientset_1_2, err = release_1_2.NewForConfig(config)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
f.Clientset_1_3, err = release_1_3.NewForConfig(config)
|
f.Clientset_1_3, err = release_1_3.NewForConfig(config)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
clientRepoConfig := getClientRepoConfig(config)
|
||||||
|
f.StagingClient, err = release_1_4.NewForConfig(clientRepoConfig)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
}
|
}
|
||||||
|
|
||||||
if f.federated {
|
if f.federated {
|
||||||
|
@ -20,12 +20,15 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
clientapi "k8s.io/client-go/1.4/pkg/api"
|
||||||
|
clientv1 "k8s.io/client-go/1.4/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util/intstr"
|
"k8s.io/kubernetes/pkg/util/intstr"
|
||||||
"k8s.io/kubernetes/pkg/util/uuid"
|
"k8s.io/kubernetes/pkg/util/uuid"
|
||||||
|
"k8s.io/kubernetes/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/pkg/watch"
|
"k8s.io/kubernetes/pkg/watch"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
|
|
||||||
@ -33,6 +36,27 @@ import (
|
|||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func stagingClientPod(name, value string) clientv1.Pod {
|
||||||
|
return clientv1.Pod{
|
||||||
|
ObjectMeta: clientv1.ObjectMeta{
|
||||||
|
Name: name,
|
||||||
|
Labels: map[string]string{
|
||||||
|
"name": "foo",
|
||||||
|
"time": value,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: clientv1.PodSpec{
|
||||||
|
Containers: []clientv1.Container{
|
||||||
|
{
|
||||||
|
Name: "nginx",
|
||||||
|
Image: "gcr.io/google_containers/nginx-slim:0.7",
|
||||||
|
Ports: []clientv1.ContainerPort{{ContainerPort: 80}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testingPod(name, value string) v1.Pod {
|
func testingPod(name, value string) v1.Pod {
|
||||||
return v1.Pod{
|
return v1.Pod{
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
@ -242,3 +266,45 @@ var _ = framework.KubeDescribe("Generated release_1_3 clientset", func() {
|
|||||||
Expect(len(pods.Items)).To(Equal(0))
|
Expect(len(pods.Items)).To(Equal(0))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
var _ = framework.KubeDescribe("Staging client repo client", func() {
|
||||||
|
f := framework.NewDefaultFramework("clientset")
|
||||||
|
It("should create pods, delete pods, watch pods", func() {
|
||||||
|
podClient := f.StagingClient.Core().Pods(f.Namespace.Name)
|
||||||
|
By("constructing the pod")
|
||||||
|
name := "pod" + string(uuid.NewUUID())
|
||||||
|
value := strconv.Itoa(time.Now().Nanosecond())
|
||||||
|
podCopy := stagingClientPod(name, value)
|
||||||
|
pod := &podCopy
|
||||||
|
By("verifying no pod exists before the test")
|
||||||
|
pods, err := podClient.List(clientapi.ListOptions{})
|
||||||
|
if err != nil {
|
||||||
|
framework.Failf("Failed to query for pods: %v", err)
|
||||||
|
}
|
||||||
|
Expect(len(pods.Items)).To(Equal(0))
|
||||||
|
By("creating the pod")
|
||||||
|
pod, err = podClient.Create(pod)
|
||||||
|
if err != nil {
|
||||||
|
framework.Failf("Failed to create pod: %v", err)
|
||||||
|
}
|
||||||
|
// We call defer here in case there is a problem with
|
||||||
|
// the test so we can ensure that we clean up after
|
||||||
|
// ourselves
|
||||||
|
defer podClient.Delete(pod.Name, clientapi.NewDeleteOptions(0))
|
||||||
|
|
||||||
|
By("verifying the pod is in kubernetes")
|
||||||
|
timeout := 1 * time.Minute
|
||||||
|
if err := wait.PollImmediate(time.Second, timeout, func() (bool, error) {
|
||||||
|
pods, err = podClient.List(clientapi.ListOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if len(pods.Items) == 1 {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}); err != nil {
|
||||||
|
framework.Failf("Err : %s\n. Failed to wait for 1 pod to be created", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user