mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 12:18:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			268 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
Copyright 2014 Google Inc. All rights reserved.
 | 
						|
 | 
						|
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 client
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"net/url"
 | 
						|
	"path"
 | 
						|
	"reflect"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi"
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
 | 
						|
	"github.com/GoogleCloudPlatform/kubernetes/pkg/version"
 | 
						|
)
 | 
						|
 | 
						|
const nameRequiredError = "resource name may not be empty"
 | 
						|
 | 
						|
type testRequest struct {
 | 
						|
	Method  string
 | 
						|
	Path    string
 | 
						|
	Header  string
 | 
						|
	Query   url.Values
 | 
						|
	Body    runtime.Object
 | 
						|
	RawBody *string
 | 
						|
}
 | 
						|
 | 
						|
type Response struct {
 | 
						|
	StatusCode int
 | 
						|
	Body       runtime.Object
 | 
						|
	RawBody    *string
 | 
						|
}
 | 
						|
 | 
						|
type testClient struct {
 | 
						|
	*Client
 | 
						|
	Request  testRequest
 | 
						|
	Response Response
 | 
						|
	Error    bool
 | 
						|
	Created  bool
 | 
						|
	Version  string
 | 
						|
	server   *httptest.Server
 | 
						|
	handler  *util.FakeHandler
 | 
						|
	// For query args, an optional function to validate the contents
 | 
						|
	// useful when the contents can change but still be correct.
 | 
						|
	// Maps from query arg key to validator.
 | 
						|
	// If no validator is present, string equality is used.
 | 
						|
	QueryValidator map[string]func(string, string) bool
 | 
						|
}
 | 
						|
 | 
						|
func (c *testClient) Setup() *testClient {
 | 
						|
	c.handler = &util.FakeHandler{
 | 
						|
		StatusCode: c.Response.StatusCode,
 | 
						|
	}
 | 
						|
	if responseBody := body(c.Response.Body, c.Response.RawBody); responseBody != nil {
 | 
						|
		c.handler.ResponseBody = *responseBody
 | 
						|
	}
 | 
						|
	c.server = httptest.NewServer(c.handler)
 | 
						|
	if c.Client == nil {
 | 
						|
		version := c.Version
 | 
						|
		if len(version) == 0 {
 | 
						|
			version = testapi.Version()
 | 
						|
		}
 | 
						|
		c.Client = NewOrDie(&Config{
 | 
						|
			Host:    c.server.URL,
 | 
						|
			Version: version,
 | 
						|
		})
 | 
						|
	}
 | 
						|
	c.QueryValidator = map[string]func(string, string) bool{}
 | 
						|
	return c
 | 
						|
}
 | 
						|
 | 
						|
func (c *testClient) Validate(t *testing.T, received runtime.Object, err error) {
 | 
						|
	c.ValidateCommon(t, err)
 | 
						|
 | 
						|
	if c.Response.Body != nil && !api.Semantic.DeepDerivative(c.Response.Body, received) {
 | 
						|
		t.Errorf("bad response for request %#v: expected %#v, got %#v", c.Request, c.Response.Body, received)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (c *testClient) ValidateRaw(t *testing.T, received []byte, err error) {
 | 
						|
	c.ValidateCommon(t, err)
 | 
						|
 | 
						|
	if c.Response.Body != nil && !reflect.DeepEqual(c.Response.Body, received) {
 | 
						|
		t.Errorf("bad response for request %#v: expected %#v, got %#v", c.Request, c.Response.Body, received)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (c *testClient) ValidateCommon(t *testing.T, err error) {
 | 
						|
	defer c.server.Close()
 | 
						|
 | 
						|
	if c.Error {
 | 
						|
		if err == nil {
 | 
						|
			t.Errorf("error expected for %#v, got none", c.Request)
 | 
						|
		}
 | 
						|
		return
 | 
						|
	}
 | 
						|
	if err != nil {
 | 
						|
		t.Errorf("no error expected for %#v, got: %v", c.Request, err)
 | 
						|
	}
 | 
						|
 | 
						|
	if c.handler.RequestReceived == nil {
 | 
						|
		t.Errorf("handler had an empty request, %#v", c)
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	requestBody := body(c.Request.Body, c.Request.RawBody)
 | 
						|
	actualQuery := c.handler.RequestReceived.URL.Query()
 | 
						|
	t.Logf("got query: %v", actualQuery)
 | 
						|
	t.Logf("path: %v", c.Request.Path)
 | 
						|
	// We check the query manually, so blank it out so that FakeHandler.ValidateRequest
 | 
						|
	// won't check it.
 | 
						|
	c.handler.RequestReceived.URL.RawQuery = ""
 | 
						|
	c.handler.ValidateRequest(t, path.Join(c.Request.Path), c.Request.Method, requestBody)
 | 
						|
	for key, values := range c.Request.Query {
 | 
						|
		validator, ok := c.QueryValidator[key]
 | 
						|
		if !ok {
 | 
						|
			switch key {
 | 
						|
			case api.LabelSelectorQueryParam(testapi.Version()):
 | 
						|
				validator = validateLabels
 | 
						|
			case api.FieldSelectorQueryParam(testapi.Version()):
 | 
						|
				validator = validateFields
 | 
						|
			default:
 | 
						|
				validator = func(a, b string) bool { return a == b }
 | 
						|
			}
 | 
						|
		}
 | 
						|
		observed := actualQuery.Get(key)
 | 
						|
		wanted := strings.Join(values, "")
 | 
						|
		if !validator(wanted, observed) {
 | 
						|
			t.Errorf("Unexpected query arg for key: %s.  Expected %s, Received %s", key, wanted, observed)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if c.Request.Header != "" {
 | 
						|
		if c.handler.RequestReceived.Header.Get(c.Request.Header) == "" {
 | 
						|
			t.Errorf("header %q not found in request %#v", c.Request.Header, c.handler.RequestReceived)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if expected, received := requestBody, c.handler.RequestBody; expected != nil && *expected != received {
 | 
						|
		t.Errorf("bad body for request %#v: expected %s, got %s", c.Request, *expected, received)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// buildResourcePath is a convenience function for knowing if a namespace should be in a path param or not
 | 
						|
func buildResourcePath(namespace, resource string) string {
 | 
						|
	if len(namespace) > 0 {
 | 
						|
		if !(testapi.Version() == "v1beta1" || testapi.Version() == "v1beta2") {
 | 
						|
			return path.Join("namespaces", namespace, resource)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return resource
 | 
						|
}
 | 
						|
 | 
						|
// buildQueryValues is a convenience function for knowing if a namespace should be in a query param or not
 | 
						|
func buildQueryValues(namespace string, query url.Values) url.Values {
 | 
						|
	v := url.Values{}
 | 
						|
	if query != nil {
 | 
						|
		for key, values := range query {
 | 
						|
			for _, value := range values {
 | 
						|
				v.Add(key, value)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if len(namespace) > 0 {
 | 
						|
		if api.PreV1Beta3(testapi.Version()) {
 | 
						|
			v.Set("namespace", namespace)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return v
 | 
						|
}
 | 
						|
 | 
						|
func validateLabels(a, b string) bool {
 | 
						|
	sA, eA := labels.Parse(a)
 | 
						|
	if eA != nil {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	sB, eB := labels.Parse(b)
 | 
						|
	if eB != nil {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	return sA.String() == sB.String()
 | 
						|
}
 | 
						|
 | 
						|
func validateFields(a, b string) bool {
 | 
						|
	sA, _ := fields.ParseSelector(a)
 | 
						|
	sB, _ := fields.ParseSelector(b)
 | 
						|
	return sA.String() == sB.String()
 | 
						|
}
 | 
						|
 | 
						|
func body(obj runtime.Object, raw *string) *string {
 | 
						|
	if obj != nil {
 | 
						|
		bs, _ := testapi.Codec().Encode(obj)
 | 
						|
		body := string(bs)
 | 
						|
		return &body
 | 
						|
	}
 | 
						|
	return raw
 | 
						|
}
 | 
						|
 | 
						|
func TestGetServerVersion(t *testing.T) {
 | 
						|
	expect := version.Info{
 | 
						|
		Major:     "foo",
 | 
						|
		Minor:     "bar",
 | 
						|
		GitCommit: "baz",
 | 
						|
	}
 | 
						|
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 | 
						|
		output, err := json.Marshal(expect)
 | 
						|
		if err != nil {
 | 
						|
			t.Errorf("unexpected encoding error: %v", err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		w.Header().Set("Content-Type", "application/json")
 | 
						|
		w.WriteHeader(http.StatusOK)
 | 
						|
		w.Write(output)
 | 
						|
	}))
 | 
						|
	client := NewOrDie(&Config{Host: server.URL})
 | 
						|
 | 
						|
	got, err := client.ServerVersion()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("unexpected encoding error: %v", err)
 | 
						|
	}
 | 
						|
	if e, a := expect, *got; !reflect.DeepEqual(e, a) {
 | 
						|
		t.Errorf("expected %v, got %v", e, a)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestGetServerAPIVersions(t *testing.T) {
 | 
						|
	versions := []string{"v1", "v2", "v3"}
 | 
						|
	expect := api.APIVersions{Versions: versions}
 | 
						|
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 | 
						|
		output, err := json.Marshal(expect)
 | 
						|
		if err != nil {
 | 
						|
			t.Errorf("unexpected encoding error: %v", err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		w.Header().Set("Content-Type", "application/json")
 | 
						|
		w.WriteHeader(http.StatusOK)
 | 
						|
		w.Write(output)
 | 
						|
	}))
 | 
						|
	client := NewOrDie(&Config{Host: server.URL})
 | 
						|
	got, err := client.ServerAPIVersions()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("unexpected encoding error: %v", err)
 | 
						|
	}
 | 
						|
	if e, a := expect, *got; !reflect.DeepEqual(e, a) {
 | 
						|
		t.Errorf("expected %v, got %v", e, a)
 | 
						|
	}
 | 
						|
}
 |