...

Source file src/k8s.io/kubernetes/pkg/kubelet/container/ref_test.go

Documentation: k8s.io/kubernetes/pkg/kubelet/container

     1  /*
     2  Copyright 2015 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 container
    18  
    19  import (
    20  	"testing"
    21  
    22  	v1 "k8s.io/api/core/v1"
    23  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    24  	_ "k8s.io/kubernetes/pkg/apis/core/install"
    25  )
    26  
    27  func TestFieldPath(t *testing.T) {
    28  	pod := &v1.Pod{Spec: v1.PodSpec{Containers: []v1.Container{
    29  		{Name: "foo"},
    30  		{Name: "bar"},
    31  		{Name: ""},
    32  		{Name: "baz"},
    33  	}}}
    34  	table := map[string]struct {
    35  		pod       *v1.Pod
    36  		container *v1.Container
    37  		path      string
    38  		success   bool
    39  	}{
    40  		"basic":            {pod, &v1.Container{Name: "foo"}, "spec.containers{foo}", true},
    41  		"basic2":           {pod, &v1.Container{Name: "baz"}, "spec.containers{baz}", true},
    42  		"emptyName":        {pod, &v1.Container{Name: ""}, "spec.containers[2]", true},
    43  		"basicSamePointer": {pod, &pod.Spec.Containers[0], "spec.containers{foo}", true},
    44  		"missing":          {pod, &v1.Container{Name: "qux"}, "", false},
    45  	}
    46  
    47  	for name, item := range table {
    48  		res, err := fieldPath(item.pod, item.container)
    49  		if !item.success {
    50  			if err == nil {
    51  				t.Errorf("%v: unexpected non-error", name)
    52  			}
    53  			continue
    54  		}
    55  		if err != nil {
    56  			t.Errorf("%v: unexpected error: %v", name, err)
    57  			continue
    58  		}
    59  		if e, a := item.path, res; e != a {
    60  			t.Errorf("%v: wanted %v, got %v", name, e, a)
    61  		}
    62  	}
    63  }
    64  
    65  func TestGenerateContainerRef(t *testing.T) {
    66  	var (
    67  		okPod = v1.Pod{
    68  			TypeMeta: metav1.TypeMeta{
    69  				Kind:       "Pod",
    70  				APIVersion: "v1",
    71  			},
    72  			ObjectMeta: metav1.ObjectMeta{
    73  				Name:            "ok",
    74  				Namespace:       "test-ns",
    75  				UID:             "bar",
    76  				ResourceVersion: "42",
    77  			},
    78  			Spec: v1.PodSpec{
    79  				Containers: []v1.Container{
    80  					{
    81  						Name: "by-name",
    82  					},
    83  					{},
    84  				},
    85  			},
    86  		}
    87  	)
    88  
    89  	cases := []struct {
    90  		name      string
    91  		pod       *v1.Pod
    92  		container *v1.Container
    93  		expected  *v1.ObjectReference
    94  		success   bool
    95  	}{
    96  		{
    97  			name: "by-name",
    98  			pod:  &okPod,
    99  			container: &v1.Container{
   100  				Name: "by-name",
   101  			},
   102  			expected: &v1.ObjectReference{
   103  				Kind:            "Pod",
   104  				APIVersion:      "v1",
   105  				Name:            "ok",
   106  				Namespace:       "test-ns",
   107  				UID:             "bar",
   108  				ResourceVersion: "42",
   109  				FieldPath:       ".spec.containers{by-name}",
   110  			},
   111  			success: true,
   112  		},
   113  		{
   114  			name:      "no-name",
   115  			pod:       &okPod,
   116  			container: &v1.Container{},
   117  			expected: &v1.ObjectReference{
   118  				Kind:            "Pod",
   119  				APIVersion:      "v1",
   120  				Name:            "ok",
   121  				Namespace:       "test-ns",
   122  				UID:             "bar",
   123  				ResourceVersion: "42",
   124  				FieldPath:       ".spec.containers[1]",
   125  			},
   126  			success: true,
   127  		},
   128  		{
   129  			name: "implicitly-required",
   130  			pod:  &okPod,
   131  			container: &v1.Container{
   132  				Name: "net",
   133  			},
   134  			expected: &v1.ObjectReference{
   135  				Kind:            "Pod",
   136  				APIVersion:      "v1",
   137  				Name:            "ok",
   138  				Namespace:       "test-ns",
   139  				UID:             "bar",
   140  				ResourceVersion: "42",
   141  				FieldPath:       "implicitly required container net",
   142  			},
   143  			success: true,
   144  		},
   145  	}
   146  
   147  	for _, tc := range cases {
   148  		actual, err := GenerateContainerRef(tc.pod, tc.container)
   149  		if err != nil {
   150  			if tc.success {
   151  				t.Errorf("%v: unexpected error: %v", tc.name, err)
   152  			}
   153  
   154  			continue
   155  		}
   156  
   157  		if !tc.success {
   158  			t.Errorf("%v: unexpected success", tc.name)
   159  			continue
   160  		}
   161  
   162  		if e, a := tc.expected.Kind, actual.Kind; e != a {
   163  			t.Errorf("%v: kind: expected %v, got %v", tc.name, e, a)
   164  		}
   165  		if e, a := tc.expected.APIVersion, actual.APIVersion; e != a {
   166  			t.Errorf("%v: apiVersion: expected %v, got %v", tc.name, e, a)
   167  		}
   168  		if e, a := tc.expected.Name, actual.Name; e != a {
   169  			t.Errorf("%v: name: expected %v, got %v", tc.name, e, a)
   170  		}
   171  		if e, a := tc.expected.Namespace, actual.Namespace; e != a {
   172  			t.Errorf("%v: namespace: expected %v, got %v", tc.name, e, a)
   173  		}
   174  		if e, a := tc.expected.UID, actual.UID; e != a {
   175  			t.Errorf("%v: uid: expected %v, got %v", tc.name, e, a)
   176  		}
   177  		if e, a := tc.expected.ResourceVersion, actual.ResourceVersion; e != a {
   178  			t.Errorf("%v: kind: expected %v, got %v", tc.name, e, a)
   179  		}
   180  	}
   181  }
   182  

View as plain text