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 ;
7
+ import java .util .Optional ;
6
8
7
9
import org .junit .jupiter .api .AfterEach ;
8
10
import org .junit .jupiter .api .Test ;
9
11
import org .junit .jupiter .api .io .TempDir ;
10
12
13
+ import io .fabric8 .kubernetes .api .model .authorization .v1 .ResourceRule ;
14
+ import io .fabric8 .kubernetes .api .model .authorization .v1 .SelfSubjectRulesReview ;
15
+ import io .fabric8 .kubernetes .api .model .authorization .v1 .SubjectRulesReviewStatus ;
11
16
import io .fabric8 .kubernetes .api .model .coordination .v1 .Lease ;
12
17
import io .fabric8 .kubernetes .client .Config ;
13
18
import io .javaoperatorsdk .operator .api .config .ConfigurationService ;
14
19
import io .javaoperatorsdk .operator .api .config .LeaderElectionConfiguration ;
15
20
16
21
import static io .fabric8 .kubernetes .client .Config .KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY ;
17
22
import static io .fabric8 .kubernetes .client .Config .KUBERNETES_NAMESPACE_FILE ;
23
+ import static io .javaoperatorsdk .operator .LeaderElectionManager .COORDINATION_GROUP ;
24
+ import static io .javaoperatorsdk .operator .LeaderElectionManager .LEASES_RESOURCE ;
18
25
import static org .junit .jupiter .api .Assertions .assertThrows ;
19
26
import static org .junit .jupiter .api .Assertions .assertTrue ;
20
27
import static org .mockito .Mockito .mock ;
21
28
import static org .mockito .Mockito .when ;
22
29
23
30
class LeaderElectionManagerTest {
24
31
25
- private LeaderElectionManager leaderElectionManager () {
32
+ private LeaderElectionManager leaderElectionManager (Optional < Object > selfSubjectReview ) {
26
33
ControllerManager controllerManager = mock (ControllerManager .class );
27
- final var kubernetesClient = MockKubernetesClient .client (Lease .class );
34
+ final var kubernetesClient = selfSubjectReview
35
+ .map (review -> MockKubernetesClient .client (Lease .class , () -> review ))
36
+ .orElseGet (() -> MockKubernetesClient .client (Lease .class ));
28
37
when (kubernetesClient .getConfiguration ()).thenReturn (Config .autoConfigure (null ));
29
38
var configurationService =
30
39
ConfigurationService .newOverriddenConfigurationService (
@@ -48,14 +57,72 @@ void testInitInferLeaseNamespace(@TempDir Path tempDir) throws IOException {
48
57
System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
49
58
System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
50
59
51
- final var leaderElectionManager = leaderElectionManager ();
60
+ final var leaderElectionManager = leaderElectionManager (Optional . empty () );
52
61
leaderElectionManager .start ();
53
62
assertTrue (leaderElectionManager .isLeaderElectionEnabled ());
54
63
}
55
64
56
65
@ Test
57
66
void testFailedToInitInferLeaseNamespace () {
58
67
System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
59
- assertThrows (IllegalArgumentException .class , () -> leaderElectionManager ().start ());
68
+ final var leaderElectionManager = leaderElectionManager (Optional .empty ());
69
+ assertThrows (IllegalArgumentException .class , leaderElectionManager ::start );
70
+ }
71
+
72
+ @ Test
73
+ void testInitPermissionsMultipleRulesWithResourceName (@ TempDir Path tempDir ) throws IOException {
74
+ var namespace = "foo" ;
75
+ var namespacePath = tempDir .resolve ("namespace" );
76
+ Files .writeString (namespacePath , namespace );
77
+
78
+ System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
79
+ System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
80
+
81
+ SelfSubjectRulesReview review = new SelfSubjectRulesReview ();
82
+ review .setStatus (new SubjectRulesReviewStatus ());
83
+ var resourceRule1 = new ResourceRule ();
84
+ resourceRule1 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
85
+ resourceRule1 .setResources (Arrays .asList (LEASES_RESOURCE ));
86
+ resourceRule1 .setResourceNames (Arrays .asList ("test" ));
87
+ resourceRule1 .setVerbs (Arrays .asList ("get" , "update" ));
88
+ var resourceRule2 = new ResourceRule ();
89
+ resourceRule2 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
90
+ resourceRule2 .setResources (Arrays .asList (LEASES_RESOURCE ));
91
+ resourceRule2 .setVerbs (Arrays .asList ("create" ));
92
+ review .getStatus ().setResourceRules (Arrays .asList (resourceRule1 , resourceRule2 ));
93
+
94
+ final var leaderElectionManager = leaderElectionManager (Optional .of (review ));
95
+ leaderElectionManager .start ();
96
+ assertTrue (leaderElectionManager .isLeaderElectionEnabled ());
97
+ }
98
+
99
+ @ Test
100
+ void testFailedToInitMissingPermission (@ TempDir Path tempDir ) throws IOException {
101
+ var namespace = "foo" ;
102
+ var namespacePath = tempDir .resolve ("namespace" );
103
+ Files .writeString (namespacePath , namespace );
104
+
105
+ System .setProperty (KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY , "false" );
106
+ System .setProperty (KUBERNETES_NAMESPACE_FILE , namespacePath .toString ());
107
+
108
+ SelfSubjectRulesReview review = new SelfSubjectRulesReview ();
109
+ review .setStatus (new SubjectRulesReviewStatus ());
110
+ var resourceRule1 = new ResourceRule ();
111
+ resourceRule1 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
112
+ resourceRule1 .setResources (Arrays .asList (LEASES_RESOURCE ));
113
+ resourceRule1 .setVerbs (Arrays .asList ("get" ));
114
+ var resourceRule2 = new ResourceRule ();
115
+ resourceRule2 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
116
+ resourceRule2 .setResources (Arrays .asList (LEASES_RESOURCE ));
117
+ resourceRule2 .setVerbs (Arrays .asList ("update" ));
118
+ var resourceRule3 = new ResourceRule ();
119
+ resourceRule3 .setApiGroups (Arrays .asList (COORDINATION_GROUP ));
120
+ resourceRule3 .setResources (Arrays .asList (LEASES_RESOURCE ));
121
+ resourceRule3 .setResourceNames (Arrays .asList ("some-other-lease" ));
122
+ resourceRule3 .setVerbs (Arrays .asList ("create" ));
123
+ review .getStatus ().setResourceRules (Arrays .asList (resourceRule1 , resourceRule2 , resourceRule3 ));
124
+
125
+ final var leaderElectionManager = leaderElectionManager (Optional .of (review ));
126
+ assertThrows (OperatorException .class , leaderElectionManager ::start );
60
127
}
61
128
}
0 commit comments