1
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
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
185
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
200
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