33import java .io .IOException ;
44import java .nio .file .Files ;
55import java .nio .file .Path ;
6+ import java .util .Arrays ;
67
78import org .junit .jupiter .api .AfterEach ;
89import org .junit .jupiter .api .Test ;
910import org .junit .jupiter .api .io .TempDir ;
1011
12+ import io .fabric8 .kubernetes .api .model .authorization .v1 .ResourceRule ;
13+ import io .fabric8 .kubernetes .api .model .authorization .v1 .SelfSubjectRulesReview ;
14+ import io .fabric8 .kubernetes .api .model .authorization .v1 .SubjectRulesReviewStatus ;
1115import io .fabric8 .kubernetes .api .model .coordination .v1 .Lease ;
1216import io .fabric8 .kubernetes .client .Config ;
1317import io .javaoperatorsdk .operator .api .config .ConfigurationService ;
1418import io .javaoperatorsdk .operator .api .config .LeaderElectionConfiguration ;
1519
1620import static io .fabric8 .kubernetes .client .Config .KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY ;
1721import static io .fabric8 .kubernetes .client .Config .KUBERNETES_NAMESPACE_FILE ;
22+ import static io .javaoperatorsdk .operator .LeaderElectionManager .COORDINATION_GROUP ;
23+ import static io .javaoperatorsdk .operator .LeaderElectionManager .LEASES_RESOURCE ;
1824import static org .junit .jupiter .api .Assertions .assertThrows ;
1925import static org .junit .jupiter .api .Assertions .assertTrue ;
2026import static org .mockito .Mockito .mock ;
2127import static org .mockito .Mockito .when ;
2228
2329class LeaderElectionManagerTest {
2430
25- private LeaderElectionManager leaderElectionManager () {
31+ private LeaderElectionManager leaderElectionManager (Object selfSubjectReview ) {
2632 ControllerManager controllerManager = mock (ControllerManager .class );
27- final var kubernetesClient = MockKubernetesClient .client (Lease .class );
33+ final var kubernetesClient = MockKubernetesClient .client (Lease .class , selfSubjectReview );
2834 when (kubernetesClient .getConfiguration ()).thenReturn (Config .autoConfigure (null ));
2935 var configurationService =
3036 ConfigurationService .newOverriddenConfigurationService (
@@ -48,14 +54,72 @@ void testInitInferLeaseNamespace(@TempDir Path tempDir) throws IOException {
4854 System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
4955 System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
5056
51- final var leaderElectionManager = leaderElectionManager ();
57+ final var leaderElectionManager = leaderElectionManager (null );
5258 leaderElectionManager .start ();
5359 assertTrue (leaderElectionManager .isLeaderElectionEnabled ());
5460 }
5561
5662 @ Test
5763 void testFailedToInitInferLeaseNamespace () {
5864 System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
59- assertThrows (IllegalArgumentException .class , () -> leaderElectionManager ().start ());
65+ final var leaderElectionManager = leaderElectionManager (null );
66+ assertThrows (IllegalArgumentException .class , leaderElectionManager ::start );
67+ }
68+
69+ @ Test
70+ void testInitPermissionsMultipleRulesWithResourceName (@ TempDir Path tempDir ) throws IOException {
71+ var namespace = "foo" ;
72+ var namespacePath = tempDir .resolve ("namespace" );
73+ Files .writeString (namespacePath , namespace );
74+
75+ System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
76+ System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
77+
78+ SelfSubjectRulesReview review = new SelfSubjectRulesReview ();
79+ review .setStatus (new SubjectRulesReviewStatus ());
80+ var resourceRule1 = new ResourceRule ();
81+ resourceRule1 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
82+ resourceRule1 .setResources (Arrays .asList (LEASES_RESOURCE ));
83+ resourceRule1 .setResourceNames (Arrays .asList ("test" ));
84+ resourceRule1 .setVerbs (Arrays .asList ("get" , "update" ));
85+ var resourceRule2 = new ResourceRule ();
86+ resourceRule2 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
87+ resourceRule2 .setResources (Arrays .asList (LEASES_RESOURCE ));
88+ resourceRule2 .setVerbs (Arrays .asList ("create" ));
89+ review .getStatus ().setResourceRules (Arrays .asList (resourceRule1 , resourceRule2 ));
90+
91+ final var leaderElectionManager = leaderElectionManager (review );
92+ leaderElectionManager .start ();
93+ assertTrue (leaderElectionManager .isLeaderElectionEnabled ());
94+ }
95+
96+ @ Test
97+ void testFailedToInitMissingPermission (@ TempDir Path tempDir ) throws IOException {
98+ var namespace = "foo" ;
99+ var namespacePath = tempDir .resolve ("namespace" );
100+ Files .writeString (namespacePath , namespace );
101+
102+ System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
103+ System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
104+
105+ SelfSubjectRulesReview review = new SelfSubjectRulesReview ();
106+ review .setStatus (new SubjectRulesReviewStatus ());
107+ var resourceRule1 = new ResourceRule ();
108+ resourceRule1 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
109+ resourceRule1 .setResources (Arrays .asList (LEASES_RESOURCE ));
110+ resourceRule1 .setVerbs (Arrays .asList ("get" ));
111+ var resourceRule2 = new ResourceRule ();
112+ resourceRule2 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
113+ resourceRule2 .setResources (Arrays .asList (LEASES_RESOURCE ));
114+ resourceRule2 .setVerbs (Arrays .asList ("update" ));
115+ var resourceRule3 = new ResourceRule ();
116+ resourceRule3 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
117+ resourceRule3 .setResources (Arrays .asList (LEASES_RESOURCE ));
118+ resourceRule3 .setResourceNames (Arrays .asList ("some-other-lease" ));
119+ resourceRule3 .setVerbs (Arrays .asList ("create" ));
120+ review .getStatus ().setResourceRules (Arrays .asList (resourceRule1 , resourceRule2 , resourceRule3 ));
121+
122+ final var leaderElectionManager = leaderElectionManager (review );
123+ assertThrows (OperatorException .class , leaderElectionManager ::start );
60124 }
61125}
0 commit comments