3
3
import java .io .IOException ;
4
4
import java .nio .file .Files ;
5
5
import java .nio .file .Path ;
6
+ import java .util .Arrays ;
6
7
7
8
import org .junit .jupiter .api .AfterEach ;
8
9
import org .junit .jupiter .api .Test ;
9
10
import org .junit .jupiter .api .io .TempDir ;
10
11
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 ;
11
15
import io .fabric8 .kubernetes .api .model .coordination .v1 .Lease ;
12
16
import io .fabric8 .kubernetes .client .Config ;
13
17
import io .javaoperatorsdk .operator .api .config .ConfigurationService ;
14
18
import io .javaoperatorsdk .operator .api .config .LeaderElectionConfiguration ;
15
19
16
20
import static io .fabric8 .kubernetes .client .Config .KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY ;
17
21
import 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 ;
18
24
import static org .junit .jupiter .api .Assertions .assertThrows ;
19
25
import static org .junit .jupiter .api .Assertions .assertTrue ;
20
26
import static org .mockito .Mockito .mock ;
21
27
import static org .mockito .Mockito .when ;
22
28
23
29
class LeaderElectionManagerTest {
24
30
25
- private LeaderElectionManager leaderElectionManager () {
31
+ private LeaderElectionManager leaderElectionManager (Object selfSubjectReview ) {
26
32
ControllerManager controllerManager = mock (ControllerManager .class );
27
- final var kubernetesClient = MockKubernetesClient .client (Lease .class );
33
+ final var kubernetesClient = MockKubernetesClient .client (Lease .class , selfSubjectReview );
28
34
when (kubernetesClient .getConfiguration ()).thenReturn (Config .autoConfigure (null ));
29
35
var configurationService =
30
36
ConfigurationService .newOverriddenConfigurationService (
@@ -48,14 +54,72 @@ void testInitInferLeaseNamespace(@TempDir Path tempDir) throws IOException {
48
54
System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
49
55
System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
50
56
51
- final var leaderElectionManager = leaderElectionManager ();
57
+ final var leaderElectionManager = leaderElectionManager (null );
52
58
leaderElectionManager .start ();
53
59
assertTrue (leaderElectionManager .isLeaderElectionEnabled ());
54
60
}
55
61
56
62
@ Test
57
63
void testFailedToInitInferLeaseNamespace () {
58
64
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 );
60
124
}
61
125
}
0 commit comments