@@ -856,6 +856,118 @@ func TestNodeAuthorizerSharedResources(t *testing.T) {
856
856
}
857
857
}
858
858
859
+ func TestNodeAuthorizerAddEphemeralContainers (t * testing.T ) {
860
+ g := NewGraph ()
861
+ g .destinationEdgeThreshold = 1
862
+ identifier := nodeidentifier .NewDefaultNodeIdentifier ()
863
+ authz := NewAuthorizer (g , identifier , bootstrappolicy .NodeRules ())
864
+
865
+ node1 := & user.DefaultInfo {Name : "system:node:node1" , Groups : []string {"system:nodes" }}
866
+ pod := & corev1.Pod {
867
+ ObjectMeta : metav1.ObjectMeta {Name : "pod1-node1" , Namespace : "ns1" },
868
+ Spec : corev1.PodSpec {
869
+ NodeName : "node1" ,
870
+ Volumes : []corev1.Volume {
871
+ {VolumeSource : corev1.VolumeSource {Secret : & corev1.SecretVolumeSource {SecretName : "node1-only" }}},
872
+ },
873
+ },
874
+ }
875
+
876
+ ecNewSecret := corev1.EphemeralContainer {
877
+ TargetContainerName : "targetContainerName" ,
878
+ EphemeralContainerCommon : corev1.EphemeralContainerCommon {
879
+ Image : "imageURL" ,
880
+ Name : "eph" ,
881
+ Command : []string {"command" },
882
+ EnvFrom : []corev1.EnvFromSource {
883
+ {
884
+ SecretRef : & corev1.SecretEnvSource {
885
+ LocalObjectReference : corev1.LocalObjectReference {
886
+ Name : "new-secret" ,
887
+ },
888
+ Optional : nil ,
889
+ },
890
+ },
891
+ },
892
+ SecurityContext : & corev1.SecurityContext {
893
+ Privileged : & []bool {true }[0 ],
894
+ },
895
+ },
896
+ }
897
+
898
+ ecNewConfigMap := corev1.EphemeralContainer {
899
+ TargetContainerName : "targetContainerName" ,
900
+ EphemeralContainerCommon : corev1.EphemeralContainerCommon {
901
+ Image : "imageURL" ,
902
+ Name : "eph" ,
903
+ Command : []string {"command" },
904
+ EnvFrom : []corev1.EnvFromSource {
905
+ {
906
+ ConfigMapRef : & corev1.ConfigMapEnvSource {
907
+ LocalObjectReference : corev1.LocalObjectReference {
908
+ Name : "new-config-map" ,
909
+ },
910
+ Optional : nil ,
911
+ },
912
+ },
913
+ },
914
+ SecurityContext : & corev1.SecurityContext {
915
+ Privileged : & []bool {true }[0 ],
916
+ },
917
+ },
918
+ }
919
+ p := & graphPopulator {}
920
+ p .graph = g
921
+ p .addPod (pod )
922
+
923
+ testcases := []struct {
924
+ User user.Info
925
+ Secret string
926
+ ConfigMap string
927
+ Decision authorizer.Decision
928
+ EphCont * corev1.EphemeralContainer
929
+ }{
930
+ {User : node1 , Decision : authorizer .DecisionAllow , Secret : "node1-only" },
931
+ {User : node1 , Decision : authorizer .DecisionNoOpinion , Secret : "new-secret" },
932
+ {User : node1 , Decision : authorizer .DecisionAllow , Secret : "new-secret" , EphCont : & ecNewSecret },
933
+ {User : node1 , Decision : authorizer .DecisionNoOpinion , ConfigMap : "new-config-map" },
934
+ {User : node1 , Decision : authorizer .DecisionAllow , ConfigMap : "new-config-map" , EphCont : & ecNewConfigMap },
935
+ }
936
+
937
+ for i , tc := range testcases {
938
+ var (
939
+ decision authorizer.Decision
940
+ err error
941
+ )
942
+ if tc .EphCont != nil {
943
+ newPod := & corev1.Pod {}
944
+ pod .DeepCopyInto (newPod )
945
+ newPod .Spec .EphemeralContainers = append (newPod .Spec .EphemeralContainers , * tc .EphCont )
946
+ p .updatePod (pod , newPod )
947
+ }
948
+
949
+ if len (tc .Secret ) > 0 {
950
+ decision , _ , err = authz .Authorize (context .Background (), authorizer.AttributesRecord {User : tc .User , ResourceRequest : true , Verb : "get" , Resource : "secrets" , Namespace : "ns1" , Name : tc .Secret })
951
+ if err != nil {
952
+ t .Errorf ("%d: unexpected error: %v" , i , err )
953
+ continue
954
+ }
955
+ } else if len (tc .ConfigMap ) > 0 {
956
+ decision , _ , err = authz .Authorize (context .Background (), authorizer.AttributesRecord {User : tc .User , ResourceRequest : true , Verb : "get" , Resource : "configmaps" , Namespace : "ns1" , Name : tc .ConfigMap })
957
+ if err != nil {
958
+ t .Errorf ("%d: unexpected error: %v" , i , err )
959
+ continue
960
+ }
961
+ } else {
962
+ t .Fatalf ("test case must include a request for a Secret" )
963
+ }
964
+
965
+ if decision != tc .Decision {
966
+ t .Errorf ("%d: expected %v, got %v" , i , tc .Decision , decision )
967
+ }
968
+ }
969
+ }
970
+
859
971
type sampleDataOpts struct {
860
972
nodes int
861
973
namespaces int
@@ -1226,6 +1338,36 @@ func populate(graph *Graph, nodes []*corev1.Node, pods []*corev1.Pod, pvs []*cor
1226
1338
}
1227
1339
}
1228
1340
1341
+ func updateMoo (graph * Graph , oldPod * corev1.Pod ) {
1342
+ p := & graphPopulator {}
1343
+ p .graph = graph
1344
+ p .addPod (oldPod )
1345
+ newPod := oldPod
1346
+ newPod .Spec .EphemeralContainers = append (newPod .Spec .EphemeralContainers , corev1.EphemeralContainer {
1347
+ TargetContainerName : "targetContainerName" ,
1348
+ EphemeralContainerCommon : corev1.EphemeralContainerCommon {
1349
+ Image : "imageURL" ,
1350
+ Name : "eph" ,
1351
+ Command : []string {"command" },
1352
+ EnvFrom : []corev1.EnvFromSource {
1353
+ {
1354
+ SecretRef : & corev1.SecretEnvSource {
1355
+ LocalObjectReference : corev1.LocalObjectReference {
1356
+ Name : "new-secret" ,
1357
+ },
1358
+ Optional : nil ,
1359
+ },
1360
+ },
1361
+ },
1362
+ SecurityContext : & corev1.SecurityContext {
1363
+ Privileged : & []bool {true }[0 ],
1364
+ },
1365
+ },
1366
+ })
1367
+
1368
+ p .updatePod (oldPod , newPod )
1369
+ }
1370
+
1229
1371
func randomSubset (a , b int ) []int {
1230
1372
if b < a {
1231
1373
b = a
0 commit comments