...

Source file src/k8s.io/kubectl/pkg/cmd/testing/util.go

Documentation: k8s.io/kubectl/pkg/cmd/testing

     1  /*
     2  Copyright 2018 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package testing
    18  
    19  import (
    20  	"bytes"
    21  	"encoding/json"
    22  	"io"
    23  	"net/http"
    24  	"os"
    25  	"testing"
    26  
    27  	"github.com/stretchr/testify/require"
    28  	corev1 "k8s.io/api/core/v1"
    29  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    30  	runtime "k8s.io/apimachinery/pkg/runtime"
    31  	restclient "k8s.io/client-go/rest"
    32  	cmdutil "k8s.io/kubectl/pkg/cmd/util"
    33  	"k8s.io/kubectl/pkg/scheme"
    34  )
    35  
    36  var (
    37  	grace              = int64(30)
    38  	enableServiceLinks = corev1.DefaultEnableServiceLinks
    39  )
    40  
    41  func DefaultHeader() http.Header {
    42  	header := http.Header{}
    43  	header.Set("Content-Type", runtime.ContentTypeJSON)
    44  	return header
    45  }
    46  
    47  func DefaultClientConfig() *restclient.Config {
    48  	return &restclient.Config{
    49  		APIPath: "/api",
    50  		ContentConfig: restclient.ContentConfig{
    51  			NegotiatedSerializer: scheme.Codecs,
    52  			ContentType:          runtime.ContentTypeJSON,
    53  			GroupVersion:         &corev1.SchemeGroupVersion,
    54  		},
    55  	}
    56  }
    57  
    58  func ObjBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser {
    59  	return io.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj))))
    60  }
    61  
    62  func BytesBody(bodyBytes []byte) io.ReadCloser {
    63  	return io.NopCloser(bytes.NewReader(bodyBytes))
    64  }
    65  
    66  func StringBody(body string) io.ReadCloser {
    67  	return io.NopCloser(bytes.NewReader([]byte(body)))
    68  }
    69  
    70  func TestData() (*corev1.PodList, *corev1.ServiceList, *corev1.ReplicationControllerList) {
    71  	pods := &corev1.PodList{
    72  		ListMeta: metav1.ListMeta{
    73  			ResourceVersion: "15",
    74  		},
    75  		Items: []corev1.Pod{
    76  			{
    77  				ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"},
    78  				Spec: corev1.PodSpec{
    79  					RestartPolicy:                 corev1.RestartPolicyAlways,
    80  					DNSPolicy:                     corev1.DNSClusterFirst,
    81  					TerminationGracePeriodSeconds: &grace,
    82  					SecurityContext:               &corev1.PodSecurityContext{},
    83  					EnableServiceLinks:            &enableServiceLinks,
    84  				},
    85  			},
    86  			{
    87  				ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "11"},
    88  				Spec: corev1.PodSpec{
    89  					RestartPolicy:                 corev1.RestartPolicyAlways,
    90  					DNSPolicy:                     corev1.DNSClusterFirst,
    91  					TerminationGracePeriodSeconds: &grace,
    92  					SecurityContext:               &corev1.PodSecurityContext{},
    93  					EnableServiceLinks:            &enableServiceLinks,
    94  				},
    95  			},
    96  		},
    97  	}
    98  	svc := &corev1.ServiceList{
    99  		ListMeta: metav1.ListMeta{
   100  			ResourceVersion: "16",
   101  		},
   102  		Items: []corev1.Service{
   103  			{
   104  				ObjectMeta: metav1.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"},
   105  				Spec: corev1.ServiceSpec{
   106  					SessionAffinity: "None",
   107  					Type:            corev1.ServiceTypeClusterIP,
   108  				},
   109  			},
   110  		},
   111  	}
   112  
   113  	one := int32(1)
   114  	rc := &corev1.ReplicationControllerList{
   115  		ListMeta: metav1.ListMeta{
   116  			ResourceVersion: "17",
   117  		},
   118  		Items: []corev1.ReplicationController{
   119  			{
   120  				ObjectMeta: metav1.ObjectMeta{Name: "rc1", Namespace: "test", ResourceVersion: "18"},
   121  				Spec: corev1.ReplicationControllerSpec{
   122  					Replicas: &one,
   123  				},
   124  			},
   125  		},
   126  	}
   127  	return pods, svc, rc
   128  }
   129  
   130  // EmptyTestData returns no pod, service, or replication controller
   131  func EmptyTestData() (*corev1.PodList, *corev1.ServiceList, *corev1.ReplicationControllerList) {
   132  	pods := &corev1.PodList{
   133  		ListMeta: metav1.ListMeta{
   134  			ResourceVersion: "15",
   135  		},
   136  		Items: []corev1.Pod{},
   137  	}
   138  	svc := &corev1.ServiceList{
   139  		ListMeta: metav1.ListMeta{
   140  			ResourceVersion: "16",
   141  		},
   142  		Items: []corev1.Service{},
   143  	}
   144  
   145  	rc := &corev1.ReplicationControllerList{
   146  		ListMeta: metav1.ListMeta{
   147  			ResourceVersion: "17",
   148  		},
   149  		Items: []corev1.ReplicationController{},
   150  	}
   151  	return pods, svc, rc
   152  }
   153  
   154  func SubresourceTestData() *corev1.Pod {
   155  	return &corev1.Pod{
   156  		ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"},
   157  		Spec: corev1.PodSpec{
   158  			RestartPolicy:                 corev1.RestartPolicyAlways,
   159  			DNSPolicy:                     corev1.DNSClusterFirst,
   160  			TerminationGracePeriodSeconds: &grace,
   161  			SecurityContext:               &corev1.PodSecurityContext{},
   162  			EnableServiceLinks:            &enableServiceLinks,
   163  		},
   164  		Status: corev1.PodStatus{
   165  			Phase: corev1.PodPending,
   166  		},
   167  	}
   168  }
   169  
   170  func GenResponseWithJsonEncodedBody(bodyStruct interface{}) (*http.Response, error) {
   171  	jsonBytes, err := json.Marshal(bodyStruct)
   172  	if err != nil {
   173  		return nil, err
   174  	}
   175  	return &http.Response{StatusCode: http.StatusOK, Header: DefaultHeader(), Body: BytesBody(jsonBytes)}, nil
   176  }
   177  
   178  func InitTestErrorHandler(t *testing.T) {
   179  	cmdutil.BehaviorOnFatal(func(str string, code int) {
   180  		t.Errorf("Error running command (exit code %d): %s", code, str)
   181  	})
   182  }
   183  
   184  // WithAlphaEnvs calls func f with the given env-var-based feature gates enabled,
   185  // and then restores the original values of those variables.
   186  func WithAlphaEnvs(features []cmdutil.FeatureGate, t *testing.T, f func(*testing.T)) {
   187  	for _, feature := range features {
   188  		key := string(feature)
   189  		if key != "" {
   190  			oldValue := os.Getenv(key)
   191  			err := os.Setenv(key, "true")
   192  			require.NoError(t, err, "unexpected error setting alpha env")
   193  			defer os.Setenv(key, oldValue)
   194  		}
   195  	}
   196  	f(t)
   197  }
   198  
   199  // WithAlphaEnvs calls func f with the given env-var-based feature gates disabled,
   200  // and then restores the original values of those variables.
   201  func WithAlphaEnvsDisabled(features []cmdutil.FeatureGate, t *testing.T, f func(*testing.T)) {
   202  	for _, feature := range features {
   203  		key := string(feature)
   204  		if key != "" {
   205  			oldValue := os.Getenv(key)
   206  			err := os.Setenv(key, "false")
   207  			require.NoError(t, err, "unexpected error setting alpha env")
   208  			defer os.Setenv(key, oldValue)
   209  		}
   210  	}
   211  	f(t)
   212  }
   213  

View as plain text