6
6
7
7
import static com .meterware .simplestub .Stub .createStrictStub ;
8
8
import static oracle .kubernetes .operator .KubernetesConstants .INTROSPECTOR_CONFIG_MAP_NAME_SUFFIX ;
9
- import static oracle .kubernetes .operator .ProcessingConstants . DOMAIN_TOPOLOGY ;
9
+ import static oracle .kubernetes .operator .LabelConstants . SERVERNAME_LABEL ;
10
10
import static oracle .kubernetes .operator .ProcessingConstants .JOB_POD_NAME ;
11
+ import static org .hamcrest .Matchers .equalTo ;
11
12
import static org .hamcrest .Matchers .notNullValue ;
12
13
import static org .hamcrest .junit .MatcherAssert .assertThat ;
13
14
20
21
import io .kubernetes .client .models .V1JobStatus ;
21
22
import io .kubernetes .client .models .V1ObjectMeta ;
22
23
import io .kubernetes .client .models .V1Pod ;
24
+ import io .kubernetes .client .models .V1PodSpec ;
23
25
import io .kubernetes .client .models .V1SecretReference ;
26
+ import io .kubernetes .client .models .V1Service ;
24
27
import java .util .ArrayList ;
28
+ import java .util .Arrays ;
25
29
import java .util .HashMap ;
26
30
import java .util .List ;
27
31
import java .util .Map ;
28
32
import java .util .concurrent .ScheduledFuture ;
29
33
import java .util .concurrent .TimeUnit ;
34
+ import java .util .stream .IntStream ;
35
+ import java .util .stream .Stream ;
30
36
import oracle .kubernetes .TestUtils ;
37
+ import oracle .kubernetes .operator .helpers .AnnotationHelper ;
31
38
import oracle .kubernetes .operator .helpers .DomainPresenceInfo ;
32
39
import oracle .kubernetes .operator .helpers .KubernetesTestSupport ;
40
+ import oracle .kubernetes .operator .helpers .KubernetesUtils ;
33
41
import oracle .kubernetes .operator .helpers .KubernetesVersion ;
34
42
import oracle .kubernetes .operator .helpers .LegalNames ;
43
+ import oracle .kubernetes .operator .helpers .ServiceHelper ;
35
44
import oracle .kubernetes .operator .helpers .TuningParametersStub ;
36
45
import oracle .kubernetes .operator .helpers .UnitTestHash ;
37
46
import oracle .kubernetes .operator .utils .InMemoryCertificates ;
38
- import oracle .kubernetes .operator .utils .WlsDomainConfigSupport ;
39
47
import oracle .kubernetes .operator .work .FiberGate ;
40
48
import oracle .kubernetes .operator .work .FiberTestSupport ;
41
49
import oracle .kubernetes .weblogic .domain .DomainConfigurator ;
42
50
import oracle .kubernetes .weblogic .domain .DomainConfiguratorFactory ;
43
51
import oracle .kubernetes .weblogic .domain .model .Domain ;
44
52
import oracle .kubernetes .weblogic .domain .model .DomainSpec ;
53
+ import org .joda .time .DateTime ;
45
54
import org .junit .After ;
46
55
import org .junit .Before ;
47
56
import org .junit .Test ;
@@ -53,22 +62,31 @@ public class DomainProcessorTest {
53
62
private static final String INTROSPECTION_JOB = "jobPod" ;
54
63
private static final String CLUSTER = "cluster" ;
55
64
private static final int MAX_SERVERS = 5 ;
65
+ private static final String MS_PREFIX = "managed-server" ;
66
+ private static final int MIN_REPLICAS = 2 ;
67
+ private static final int NUM_ADMIN_SERVERS = 1 ;
68
+ private static final int NUM_JOB_PODS = 1 ;
56
69
57
70
private List <Memento > mementos = new ArrayList <>();
58
71
private KubernetesTestSupport testSupport = new KubernetesTestSupport ();
59
72
private DomainConfigurator domainConfigurator ;
60
- private String [] managedServerNames = new String [MAX_SERVERS ];
73
+ private String [] managedServerNames =
74
+ IntStream .rangeClosed (1 , MAX_SERVERS ).mapToObj (n -> MS_PREFIX + n ).toArray (String []::new );
61
75
private Map <String , DomainPresenceInfo > presenceInfoMap = new HashMap <>();
62
76
private DomainProcessorDelegateStub delegate =
63
77
createStrictStub (DomainProcessorDelegateStub .class , testSupport );
64
78
private DomainProcessorImpl processor = new DomainProcessorImpl (delegate );
65
79
private Domain domain =
66
80
new Domain ()
67
- .withMetadata (new V1ObjectMeta ().name (UID ).namespace (NS ))
81
+ .withMetadata (withTimestamps ( new V1ObjectMeta ().name (UID ).namespace (NS ) ))
68
82
.withSpec (
69
83
new DomainSpec ()
70
84
.withWebLogicCredentialsSecret (new V1SecretReference ().name ("secret-name" )));
71
85
86
+ private static V1ObjectMeta withTimestamps (V1ObjectMeta meta ) {
87
+ return meta .creationTimestamp (DateTime .now ()).resourceVersion ("1" );
88
+ }
89
+
72
90
@ Before
73
91
public void setUp () throws Exception {
74
92
mementos .add (TestUtils .silenceOperatorLogger ());
@@ -78,16 +96,6 @@ public void setUp() throws Exception {
78
96
mementos .add (InMemoryCertificates .install ());
79
97
mementos .add (UnitTestHash .install ());
80
98
81
- WlsDomainConfigSupport configSupport =
82
- new WlsDomainConfigSupport (UID ).withAdminServerName (ADMIN_SERVER_NAME );
83
- configSupport .addWlsServer (ADMIN_SERVER_NAME , 7001 );
84
-
85
- for (int num = 0 ; num < MAX_SERVERS ; num ++)
86
- configSupport .addWlsServer (
87
- managedServerNames [num ] = "managed-server" + (num + 1 ), 8001 + num );
88
- configSupport .addWlsCluster (CLUSTER , managedServerNames );
89
- testSupport .addToPacket (DOMAIN_TOPOLOGY , configSupport .createDomainConfig ());
90
-
91
99
domainConfigurator = DomainConfiguratorFactory .forDomain (domain );
92
100
testSupport .addToPacket (JOB_POD_NAME , INTROSPECTION_JOB );
93
101
testSupport .doOnCreate (
@@ -132,6 +140,61 @@ public void whenDomainConfiguredForMaxServers_establishMatchingPresence() {
132
140
assertThat (info .getClusterService (CLUSTER ), notNullValue ());
133
141
}
134
142
143
+ @ Test
144
+ public void whenDomainScaledDown_removeExcessPodsAndServices () {
145
+ defineServerResources (ADMIN_SERVER_NAME );
146
+ Arrays .stream (managedServerNames ).forEach (this ::defineServerResources );
147
+
148
+ domainConfigurator .configureCluster (CLUSTER ).withReplicas (MIN_REPLICAS );
149
+ DomainPresenceInfo info = new DomainPresenceInfo (domain );
150
+ processor .makeRightDomainPresence (info , true , false , false );
151
+
152
+ assertThat ((int ) getServerServices ().count (), equalTo (MIN_REPLICAS + NUM_ADMIN_SERVERS ));
153
+ assertThat (getRunningPods ().size (), equalTo (MIN_REPLICAS + NUM_ADMIN_SERVERS + NUM_JOB_PODS ));
154
+ }
155
+
156
+ private Stream <V1Service > getServerServices () {
157
+ return getRunningServices ().stream ().filter (ServiceHelper ::isServerService );
158
+ }
159
+
160
+ private List <V1Service > getRunningServices () {
161
+ return testSupport .getResources (KubernetesTestSupport .SERVICE );
162
+ }
163
+
164
+ private List <V1Pod > getRunningPods () {
165
+ return testSupport .getResources (KubernetesTestSupport .POD );
166
+ }
167
+
168
+ private void defineServerResources (String serverName ) {
169
+ testSupport .defineResources (createServerPod (serverName ), createServerService (serverName ));
170
+ }
171
+
172
+ private V1Pod createServerPod (String serverName ) {
173
+ return AnnotationHelper .withSha256Hash (
174
+ new V1Pod ()
175
+ .metadata (
176
+ withServerLabels (
177
+ new V1ObjectMeta ().name (LegalNames .toServerName (UID , serverName )).namespace (NS ),
178
+ serverName ))
179
+ .spec (new V1PodSpec ()));
180
+ }
181
+
182
+ private V1ObjectMeta withServerLabels (V1ObjectMeta meta , String serverName ) {
183
+ return KubernetesUtils .withOperatorLabels (meta , UID )
184
+ .putLabelsItem (SERVERNAME_LABEL , serverName );
185
+ }
186
+
187
+ private V1Service createServerService (String serverName ) {
188
+ return AnnotationHelper .withSha256Hash (
189
+ new V1Service ()
190
+ .metadata (
191
+ withServerLabels (
192
+ new V1ObjectMeta ()
193
+ .name (LegalNames .toServerServiceName (UID , serverName ))
194
+ .namespace (NS ),
195
+ serverName )));
196
+ }
197
+
135
198
private void assertServerPodAndServicePresent (DomainPresenceInfo info , String serverName ) {
136
199
assertThat (serverName + " server service" , info .getServerService (serverName ), notNullValue ());
137
200
assertThat (serverName + " pod" , info .getServerPod (serverName ), notNullValue ());
@@ -183,19 +246,29 @@ public ScheduledFuture<?> scheduleWithFixedDelay(
183
246
+ CLUSTER
184
247
+ "\" \n "
185
248
+ " servers:\n "
186
- + " - name: \" managed-server1\" \n "
249
+ + " - name: \" "
250
+ + MS_PREFIX
251
+ + "1\" \n "
187
252
+ " listenPort: 8001\n "
188
253
+ " listenAddress: \" domain1-managed-server1\" \n "
189
- + " - name: \" managed-server2\" \n "
254
+ + " - name: \" "
255
+ + MS_PREFIX
256
+ + "2\" \n "
190
257
+ " listenPort: 8001\n "
191
258
+ " listenAddress: \" domain1-managed-server2\" \n "
192
- + " - name: \" managed-server3\" \n "
259
+ + " - name: \" "
260
+ + MS_PREFIX
261
+ + "3\" \n "
193
262
+ " listenPort: 8001\n "
194
263
+ " listenAddress: \" domain1-managed-server3\" \n "
195
- + " - name: \" managed-server4\" \n "
264
+ + " - name: \" "
265
+ + MS_PREFIX
266
+ + "4\" \n "
196
267
+ " listenPort: 8001\n "
197
268
+ " listenAddress: \" domain1-managed-server4\" \n "
198
- + " - name: \" managed-server5\" \n "
269
+ + " - name: \" "
270
+ + MS_PREFIX
271
+ + "5\" \n "
199
272
+ " listenPort: 8001\n "
200
273
+ " listenAddress: \" domain1-managed-server5\" \n "
201
274
+ " servers:\n "
0 commit comments