@@ -3,51 +3,148 @@ package service
33import (
44 "net/http"
55 "testing"
6+ "time"
67
78 "github.com/deepmap/oapi-codegen/pkg/testutil"
89 "github.com/stretchr/testify/assert"
910 appsv1 "k8s.io/api/apps/v1"
1011 corev1 "k8s.io/api/core/v1"
12+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1113 "k8s.io/apimachinery/pkg/runtime"
1214 "k8s.io/apimachinery/pkg/runtime/serializer/json"
15+ "sigs.k8s.io/controller-runtime/pkg/client"
1316
1417 "github.com/projectsyn/lieutenant-api/pkg/api"
1518)
1619
1720func TestInstallSteward (t * testing.T ) {
18- e , _ := setupTest (t )
1921
20- result := testutil .NewRequest ().
21- WithHeader ("X-Forwarded-Proto" , "https" ).
22- Get ("/install/steward.json?token=" + clusterA .Status .BootstrapToken .Token ).
23- Go (t , e )
24- assert .Equal (t , http .StatusOK , result .Code ())
25- manifests := & corev1.List {}
26- err := result .UnmarshalJsonToObject (& manifests )
27- assert .NoError (t , err )
28- assert .Len (t , manifests .Items , 6 )
29- decoder := json .NewSerializer (json .DefaultMetaFactory , scheme , scheme , true )
30- foundSecret := false
31- foundDeployment := false
32- for i , item := range manifests .Items {
33- obj , err := runtime .Decode (decoder , item .Raw )
34- assert .NoError (t , err )
35- if i == 0 {
36- _ , ok := obj .(* corev1.Namespace )
37- assert .True (t , ok , "First object needs to be a namespace" )
38- }
39- if secret , ok := obj .(* corev1.Secret ); ok {
40- foundSecret = true
41- assert .Equal (t , secret .StringData ["token" ], string (clusterASecret .Data ["token" ]))
42- }
43- if deployment , ok := obj .(* appsv1.Deployment ); ok {
44- foundDeployment = true
45- assert .Equal (t , "https://example.com" , deployment .Spec .Template .Spec .Containers [0 ].Env [0 ].Value )
46- assert .Equal (t , clusterA .Name , deployment .Spec .Template .Spec .Containers [0 ].Env [1 ].Value )
47- }
22+ tcs := map [string ]struct {
23+ bootstrapToken string
24+ objs []client.Object
25+ saToken string
26+ clusterName string
27+ }{
28+ "default" : {
29+ bootstrapToken : clusterA .Status .BootstrapToken .Token ,
30+ objs : testObjects ,
31+ saToken : "sometoken" ,
32+ clusterName : clusterA .Name ,
33+ },
34+ "reordered" : {
35+ bootstrapToken : clusterA .Status .BootstrapToken .Token ,
36+ objs : []client.Object {
37+ newClusterASecret ,
38+ clusterA ,
39+ tenantA ,
40+ wrongSecret ,
41+ clusterASA ,
42+ clusterASecret ,
43+ },
44+ saToken : "sometoken" ,
45+ clusterName : clusterA .Name ,
46+ },
47+ "older secret" : {
48+ bootstrapToken : clusterA .Status .BootstrapToken .Token ,
49+ objs : []client.Object {
50+ newClusterASecret ,
51+ tenantA ,
52+ clusterASecret ,
53+ & corev1.Secret {
54+ ObjectMeta : metav1.ObjectMeta {
55+ Name : "old-secret" ,
56+ Namespace : clusterA .Namespace ,
57+ CreationTimestamp : metav1 .NewTime (time .Now ().Add (- 24 * time .Hour )),
58+ Annotations : map [string ]string {
59+ "kubernetes.io/service-account.name" : clusterA .Name ,
60+ },
61+ },
62+ Type : corev1 .SecretTypeServiceAccountToken ,
63+ Data : map [string ][]byte {"token" : []byte ("someoldertoken" )},
64+ },
65+ clusterA ,
66+ wrongSecret ,
67+ clusterASA ,
68+ },
69+ saToken : "someoldertoken" ,
70+ clusterName : clusterA .Name ,
71+ },
72+ "even older secret" : {
73+ bootstrapToken : clusterA .Status .BootstrapToken .Token ,
74+ objs : []client.Object {
75+ tenantA ,
76+ & corev1.Secret {
77+ ObjectMeta : metav1.ObjectMeta {
78+ Name : "old-secret" ,
79+ Namespace : clusterA .Namespace ,
80+ CreationTimestamp : metav1 .NewTime (time .Now ().Add (- 24 * time .Hour )),
81+ Annotations : map [string ]string {
82+ "kubernetes.io/service-account.name" : clusterA .Name ,
83+ },
84+ },
85+ Type : corev1 .SecretTypeServiceAccountToken ,
86+ Data : map [string ][]byte {"token" : []byte ("someoldertoken" )},
87+ },
88+ clusterA ,
89+ wrongSecret ,
90+ clusterASA ,
91+ & corev1.Secret {
92+ ObjectMeta : metav1.ObjectMeta {
93+ Name : "arcane-secret" ,
94+ Namespace : clusterA .Namespace ,
95+ CreationTimestamp : metav1 .NewTime (time .Unix (0 , 0 )),
96+ Annotations : map [string ]string {
97+ "kubernetes.io/service-account.name" : clusterA .Name ,
98+ },
99+ },
100+ Type : corev1 .SecretTypeServiceAccountToken ,
101+ Data : map [string ][]byte {"token" : []byte ("mysterytoken" )},
102+ },
103+ newClusterASecret ,
104+ clusterASecret ,
105+ },
106+ saToken : "mysterytoken" ,
107+ clusterName : clusterA .Name ,
108+ },
109+ }
110+
111+ for n , tc := range tcs {
112+ t .Run (n , func (t * testing.T ) {
113+ e , _ := rawSetupTest (t , tc .objs ... )
114+
115+ result := testutil .NewRequest ().
116+ WithHeader ("X-Forwarded-Proto" , "https" ).
117+ Get ("/install/steward.json?token=" + tc .bootstrapToken ).
118+ Go (t , e )
119+ assert .Equal (t , http .StatusOK , result .Code ())
120+ manifests := & corev1.List {}
121+ err := result .UnmarshalJsonToObject (& manifests )
122+ assert .NoError (t , err )
123+ assert .Len (t , manifests .Items , 6 )
124+ decoder := json .NewSerializer (json .DefaultMetaFactory , scheme , scheme , true )
125+ foundSecret := false
126+ foundDeployment := false
127+ for i , item := range manifests .Items {
128+ obj , err := runtime .Decode (decoder , item .Raw )
129+ assert .NoError (t , err )
130+ if i == 0 {
131+ _ , ok := obj .(* corev1.Namespace )
132+ assert .True (t , ok , "First object needs to be a namespace" )
133+ }
134+ if secret , ok := obj .(* corev1.Secret ); ok {
135+ foundSecret = true
136+ assert .Equal (t , tc .saToken , secret .StringData ["token" ])
137+ }
138+ if deployment , ok := obj .(* appsv1.Deployment ); ok {
139+ foundDeployment = true
140+ assert .Equal (t , "https://example.com" , deployment .Spec .Template .Spec .Containers [0 ].Env [0 ].Value )
141+ assert .Equal (t , tc .clusterName , deployment .Spec .Template .Spec .Containers [0 ].Env [1 ].Value )
142+ }
143+ }
144+ assert .True (t , foundSecret , "Could not find secret with steward token" )
145+ assert .True (t , foundDeployment , "Could not find deployment for steward" )
146+ })
48147 }
49- assert .True (t , foundSecret , "Could not find secret with steward token" )
50- assert .True (t , foundDeployment , "Could not find deployment for steward" )
51148}
52149
53150func TestInstallStewardNoToken (t * testing.T ) {
0 commit comments