123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- /*
- Copyright 2015 The Kubernetes Authors.
- 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 helper
- import (
- "reflect"
- "testing"
- "k8s.io/apimachinery/pkg/api/resource"
- "k8s.io/apimachinery/pkg/labels"
- "k8s.io/kubernetes/pkg/apis/core"
- )
- func TestSemantic(t *testing.T) {
- table := []struct {
- a, b interface{}
- shouldEqual bool
- }{
- {resource.MustParse("0"), resource.Quantity{}, true},
- {resource.Quantity{}, resource.MustParse("0"), true},
- {resource.Quantity{}, resource.MustParse("1m"), false},
- {
- resource.NewQuantity(5, resource.BinarySI),
- resource.NewQuantity(5, resource.DecimalSI),
- true,
- },
- {resource.MustParse("2m"), resource.MustParse("1m"), false},
- }
- for index, item := range table {
- if e, a := item.shouldEqual, Semantic.DeepEqual(item.a, item.b); e != a {
- t.Errorf("case[%d], expected %v, got %v.", index, e, a)
- }
- }
- }
- func TestIsStandardResource(t *testing.T) {
- testCases := []struct {
- input string
- output bool
- }{
- {"cpu", true},
- {"memory", true},
- {"disk", false},
- {"blah", false},
- {"x.y.z", false},
- {"hugepages-2Mi", true},
- {"requests.hugepages-2Mi", true},
- }
- for i, tc := range testCases {
- if IsStandardResourceName(tc.input) != tc.output {
- t.Errorf("case[%d], input: %s, expected: %t, got: %t", i, tc.input, tc.output, !tc.output)
- }
- }
- }
- func TestIsStandardContainerResource(t *testing.T) {
- testCases := []struct {
- input string
- output bool
- }{
- {"cpu", true},
- {"memory", true},
- {"disk", false},
- {"hugepages-2Mi", true},
- }
- for i, tc := range testCases {
- if IsStandardContainerResourceName(tc.input) != tc.output {
- t.Errorf("case[%d], input: %s, expected: %t, got: %t", i, tc.input, tc.output, !tc.output)
- }
- }
- }
- func TestGetAccessModesFromString(t *testing.T) {
- modes := GetAccessModesFromString("ROX")
- if !containsAccessMode(modes, core.ReadOnlyMany) {
- t.Errorf("Expected mode %s, but got %+v", core.ReadOnlyMany, modes)
- }
- modes = GetAccessModesFromString("ROX,RWX")
- if !containsAccessMode(modes, core.ReadOnlyMany) {
- t.Errorf("Expected mode %s, but got %+v", core.ReadOnlyMany, modes)
- }
- if !containsAccessMode(modes, core.ReadWriteMany) {
- t.Errorf("Expected mode %s, but got %+v", core.ReadWriteMany, modes)
- }
- modes = GetAccessModesFromString("RWO,ROX,RWX")
- if !containsAccessMode(modes, core.ReadOnlyMany) {
- t.Errorf("Expected mode %s, but got %+v", core.ReadOnlyMany, modes)
- }
- if !containsAccessMode(modes, core.ReadWriteMany) {
- t.Errorf("Expected mode %s, but got %+v", core.ReadWriteMany, modes)
- }
- }
- func TestRemoveDuplicateAccessModes(t *testing.T) {
- modes := []core.PersistentVolumeAccessMode{
- core.ReadWriteOnce, core.ReadOnlyMany, core.ReadOnlyMany, core.ReadOnlyMany,
- }
- modes = removeDuplicateAccessModes(modes)
- if len(modes) != 2 {
- t.Errorf("Expected 2 distinct modes in set but found %v", len(modes))
- }
- }
- func TestNodeSelectorRequirementsAsSelector(t *testing.T) {
- matchExpressions := []core.NodeSelectorRequirement{{
- Key: "foo",
- Operator: core.NodeSelectorOpIn,
- Values: []string{"bar", "baz"},
- }}
- mustParse := func(s string) labels.Selector {
- out, e := labels.Parse(s)
- if e != nil {
- panic(e)
- }
- return out
- }
- tc := []struct {
- in []core.NodeSelectorRequirement
- out labels.Selector
- expectErr bool
- }{
- {in: nil, out: labels.Nothing()},
- {in: []core.NodeSelectorRequirement{}, out: labels.Nothing()},
- {
- in: matchExpressions,
- out: mustParse("foo in (baz,bar)"),
- },
- {
- in: []core.NodeSelectorRequirement{{
- Key: "foo",
- Operator: core.NodeSelectorOpExists,
- Values: []string{"bar", "baz"},
- }},
- expectErr: true,
- },
- {
- in: []core.NodeSelectorRequirement{{
- Key: "foo",
- Operator: core.NodeSelectorOpGt,
- Values: []string{"1"},
- }},
- out: mustParse("foo>1"),
- },
- {
- in: []core.NodeSelectorRequirement{{
- Key: "bar",
- Operator: core.NodeSelectorOpLt,
- Values: []string{"7"},
- }},
- out: mustParse("bar<7"),
- },
- }
- for i, tc := range tc {
- out, err := NodeSelectorRequirementsAsSelector(tc.in)
- if err == nil && tc.expectErr {
- t.Errorf("[%v]expected error but got none.", i)
- }
- if err != nil && !tc.expectErr {
- t.Errorf("[%v]did not expect error but got: %v", i, err)
- }
- if !reflect.DeepEqual(out, tc.out) {
- t.Errorf("[%v]expected:\n\t%+v\nbut got:\n\t%+v", i, tc.out, out)
- }
- }
- }
- func TestIsHugePageResourceName(t *testing.T) {
- testCases := []struct {
- name core.ResourceName
- result bool
- }{
- {
- name: core.ResourceName("hugepages-2Mi"),
- result: true,
- },
- {
- name: core.ResourceName("hugepages-1Gi"),
- result: true,
- },
- {
- name: core.ResourceName("cpu"),
- result: false,
- },
- {
- name: core.ResourceName("memory"),
- result: false,
- },
- }
- for _, testCase := range testCases {
- if testCase.result != IsHugePageResourceName(testCase.name) {
- t.Errorf("resource: %v expected result: %v", testCase.name, testCase.result)
- }
- }
- }
- func TestHugePageResourceName(t *testing.T) {
- testCases := []struct {
- pageSize resource.Quantity
- name core.ResourceName
- }{
- {
- pageSize: resource.MustParse("2Mi"),
- name: core.ResourceName("hugepages-2Mi"),
- },
- {
- pageSize: resource.MustParse("1Gi"),
- name: core.ResourceName("hugepages-1Gi"),
- },
- {
- // verify we do not regress our canonical representation
- pageSize: *resource.NewQuantity(int64(2097152), resource.BinarySI),
- name: core.ResourceName("hugepages-2Mi"),
- },
- }
- for _, testCase := range testCases {
- if result := HugePageResourceName(testCase.pageSize); result != testCase.name {
- t.Errorf("pageSize: %v, expected: %v, but got: %v", testCase.pageSize.String(), testCase.name, result.String())
- }
- }
- }
- func TestHugePageSizeFromResourceName(t *testing.T) {
- testCases := []struct {
- name core.ResourceName
- expectErr bool
- pageSize resource.Quantity
- }{
- {
- name: core.ResourceName("hugepages-2Mi"),
- pageSize: resource.MustParse("2Mi"),
- expectErr: false,
- },
- {
- name: core.ResourceName("hugepages-1Gi"),
- pageSize: resource.MustParse("1Gi"),
- expectErr: false,
- },
- {
- name: core.ResourceName("hugepages-bad"),
- expectErr: true,
- },
- }
- for _, testCase := range testCases {
- value, err := HugePageSizeFromResourceName(testCase.name)
- if testCase.expectErr && err == nil {
- t.Errorf("Expected an error for %v", testCase.name)
- } else if !testCase.expectErr && err != nil {
- t.Errorf("Unexpected error for %v, got %v", testCase.name, err)
- } else if testCase.pageSize.Value() != value.Value() {
- t.Errorf("Unexpected pageSize for resource %v got %v", testCase.name, value.String())
- }
- }
- }
- func TestIsOvercommitAllowed(t *testing.T) {
- testCases := []struct {
- name core.ResourceName
- allowed bool
- }{
- {
- name: core.ResourceCPU,
- allowed: true,
- },
- {
- name: core.ResourceMemory,
- allowed: true,
- },
- {
- name: HugePageResourceName(resource.MustParse("2Mi")),
- allowed: false,
- },
- }
- for _, testCase := range testCases {
- if testCase.allowed != IsOvercommitAllowed(testCase.name) {
- t.Errorf("Unexpected result for %v", testCase.name)
- }
- }
- }
|