@@ -4,10 +4,14 @@ import (
44 "context"
55 "testing"
66
7+ "github.com/stretchr/testify/assert"
78 v1 "k8s.io/api/core/v1"
89 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+ "k8s.io/utils/pointer"
911 "sigs.k8s.io/yaml"
1012
13+ "github.com/gocrane/api/ensurance/v1alpha1"
14+
1115 "github.com/gocrane/crane/pkg/ensurance/config"
1216)
1317
@@ -20,23 +24,102 @@ func TestDefaultingPodQOSInitializer(t *testing.T) {
2024 t .Errorf ("unmarshal config failed:%v" , err )
2125 }
2226 m := MutatingAdmission {
23- Config : config ,
27+ Config : config ,
28+ listPodQOS : MockListPodQOSFunc ,
29+ }
30+
31+ type Case struct {
32+ Pod * v1.Pod
33+ Inject bool
34+ }
35+
36+ for _ , tc := range []Case {
37+ {Pod : MockPod ("offline" , "offline" , "enable" , "app" , "nginx" ), Inject : true },
38+ {Pod : MockPod ("offline-not-interested" , "offline" , "enable" ), Inject : false },
39+ {Pod : MockPod ("online" , "offline" , "disable" , "app" , "nginx" ), Inject : false },
40+ {Pod : MockPod ("online-not-interested" , "offline" , "disable" ), Inject : false },
41+ {Pod : MockPod ("default" ), Inject : false },
42+ } {
43+ assert .NoError (t , m .Default (context .Background (), tc .Pod ))
44+ t .Log (tc .Pod .Name )
45+ assert .Equal (t , len (tc .Pod .Spec .InitContainers ) == 1 , tc .Inject )
46+ assert .Equal (t , len (tc .Pod .Spec .Volumes ) == 1 , tc .Inject )
47+ }
48+ }
49+
50+ func TestPrecheck (t * testing.T ) {
51+ configYaml := "apiVersion: ensurance.crane.io/v1alpha1\n kind: QOSConfig\n qosInitializer:\n enable: true\n selector: \n matchLabels:\n app: nginx\n "
52+
53+ config := & config.QOSConfig {}
54+ err := yaml .Unmarshal ([]byte (configYaml ), config )
55+ if err != nil {
56+ t .Errorf ("unmarshal config failed:%v" , err )
57+ }
58+ m := MutatingAdmission {
59+ Config : config ,
60+ listPodQOS : MockListPodQOSFunc ,
2461 }
62+ assert .False (t , m .available ())
63+ }
2564
65+ func MockListPodQOSFunc () ([]* v1alpha1.PodQOS , error ) {
66+ return []* v1alpha1.PodQOS {
67+ {
68+ TypeMeta : metav1.TypeMeta {},
69+ ObjectMeta : metav1.ObjectMeta {},
70+ Spec : v1alpha1.PodQOSSpec {
71+ LabelSelector : metav1.LabelSelector {
72+ MatchLabels : map [string ]string {"offline" : "enable" },
73+ },
74+ ResourceQOS : v1alpha1.ResourceQOS {
75+ CPUQOS : & v1alpha1.CPUQOS {
76+ CPUPriority : pointer .Int32 (7 ),
77+ },
78+ },
79+ },
80+ }, {
81+ TypeMeta : metav1.TypeMeta {},
82+ ObjectMeta : metav1.ObjectMeta {},
83+ Spec : v1alpha1.PodQOSSpec {
84+ LabelSelector : metav1.LabelSelector {
85+ MatchLabels : map [string ]string {"offline" : "disable" },
86+ },
87+ ResourceQOS : v1alpha1.ResourceQOS {
88+ CPUQOS : & v1alpha1.CPUQOS {
89+ CPUPriority : pointer .Int32 (0 ),
90+ },
91+ },
92+ },
93+ }, {
94+ TypeMeta : metav1.TypeMeta {},
95+ ObjectMeta : metav1.ObjectMeta {},
96+ Spec : v1alpha1.PodQOSSpec {
97+ ResourceQOS : v1alpha1.ResourceQOS {
98+ CPUQOS : & v1alpha1.CPUQOS {
99+ CPUPriority : pointer .Int32 (7 ),
100+ },
101+ },
102+ },
103+ },
104+ }, nil
105+ }
106+
107+ func MockPod (name string , labels ... string ) * v1.Pod {
26108 pod := & v1.Pod {
27109 ObjectMeta : metav1.ObjectMeta {
28- Name : "pod1" ,
29- Labels : map [string ]string {
30- "app" : "nginx" ,
31- "type" : "offline" ,
32- },
110+ Name : name ,
111+ Labels : nil ,
33112 },
34113 }
35- err = m . Default ( context . TODO (), pod )
36- if err != nil {
37- t . Fatalf ( "inject pod failed: %v" , err )
114+
115+ if len ( labels ) < 2 {
116+ return pod
38117 }
39- if len (pod .Spec .InitContainers ) == 0 {
40- t .Fatalf ("should inject containers" )
118+
119+ labelmap := map [string ]string {}
120+ for i := 0 ; i < len (labels )- 1 ; i += 2 {
121+ labelmap [labels [i ]] = labels [i + 1 ]
41122 }
123+ pod .Labels = labelmap
124+ return pod
42125}
0 commit comments