Skip to content

Commit d1b6972

Browse files
achmelopablocarle
andauthored
fix: disable infinispan diagnostics by default (#4157)
Signed-off-by: ac892247 <[email protected]> Co-authored-by: Pablo Carle <[email protected]>
1 parent a7d3700 commit d1b6972

File tree

10 files changed

+107
-18
lines changed

10 files changed

+107
-18
lines changed

.github/workflows/integration-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ jobs:
162162

163163
- name: Run CI Tests
164164
run: >
165-
./gradlew :integration-tests:runContainerTests --info
165+
./gradlew runStartUpCheck :integration-tests:runContainerTests --info -Denvironment.config=-docker
166166
-Partifactory_user=${{ secrets.ARTIFACTORY_USERNAME }} -Partifactory_password=${{ secrets.ARTIFACTORY_PASSWORD }}
167167
- uses: ./.github/actions/dump-jacoco
168168
if: always()

apiml-utility/src/main/resources/logback-spring.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<turboFilter class="org.zowe.apiml.product.logging.LogLevelInfoFilter"/>
1515
<turboFilter class="org.zowe.apiml.product.logging.ApimlDuplicateMessagesFilter">
1616
<AllowedRepetitions>0</AllowedRepetitions>
17+
<cacheSize>3000</cacheSize>
1718
</turboFilter>
1819
</springProfile>
1920

caching-service-package/src/main/resources/bin/start.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ _BPX_JOBNAME=${ZWE_zowe_job_prefix}${CACHING_CODE} ${JAVA_BIN_DIR}java \
271271
-Djgroups.bind.address=${ZWE_configs_storage_infinispan_jgroups_host:-${ZWE_haInstance_hostname:-localhost}} \
272272
-Djgroups.bind.port=${ZWE_configs_storage_infinispan_jgroups_port:-7600} \
273273
-Djgroups.keyExchange.port=${ZWE_configs_storage_infinispan_jgroups_keyExchange_port:-7601} \
274+
-Djgroups.tcp.diag.enabled=${ZWE_configs_storage_infinispan_jgroups_tcp_diag_enabled:-false} \
274275
-Dcaching.storage.infinispan.initialHosts=${ZWE_configs_storage_infinispan_initialHosts:-localhost[7600]} \
275276
-Dserver.address=${ZWE_configs_zowe_network_server_listenAddresses_0:-${ZWE_zowe_network_server_listenAddresses_0:-"0.0.0.0"}} \
276277
-Dserver.ssl.enabled=${ZWE_configs_server_ssl_enabled:-true} \

caching-service/src/main/java/org/zowe/apiml/caching/service/infinispan/config/InfinispanConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class InfinispanConfig {
6060
private String address;
6161
@Value("${jgroups.keyExchange.port:7601}")
6262
private String keyExchangePort;
63+
@Value("${jgroups.tcp.diag.enabled:false}")
64+
private String tcpDiagEnabled;
6365

6466
@PostConstruct
6567
void updateKeyring() {
@@ -93,6 +95,7 @@ DefaultCacheManager cacheManager(ResourceLoader resourceLoader) {
9395
System.setProperty("server.ssl.keyStoreType", keyStoreType);
9496
System.setProperty("server.ssl.keyStore", keyStore);
9597
System.setProperty("server.ssl.keyStorePassword", keyStorePass);
98+
System.setProperty("jgroups.tcp.diag.enabled", String.valueOf(Boolean.parseBoolean(tcpDiagEnabled)));
9699
ConfigurationBuilderHolder holder;
97100

98101
try (InputStream configurationStream = resourceLoader.getResource(

caching-service/src/main/resources/infinispan.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
thread_pool.min_threads="${jgroups.thread_pool.min_threads:0}"
2121
thread_pool.max_threads="${jgroups.thread_pool.max_threads:200}"
2222
thread_pool.keep_alive_time="60000"
23+
diag.enabled="${jgroups.tcp.diag.enabled:false}"
2324
/>
2425
<TCPPING
2526
initial_hosts="${jgroups.tcpping.initial_hosts}"

gateway-service/src/main/java/org/zowe/apiml/gateway/filters/security/AuthExceptionHandlerReactive.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.fasterxml.jackson.core.JsonProcessingException;
1414
import com.fasterxml.jackson.databind.ObjectMapper;
1515
import lombok.RequiredArgsConstructor;
16-
import org.springframework.http.HttpStatus;
1716
import org.springframework.stereotype.Component;
1817
import org.springframework.web.server.ServerWebExchange;
1918
import org.zowe.apiml.constants.ApimlConstants;
@@ -23,6 +22,11 @@
2322

2423
import java.nio.charset.StandardCharsets;
2524

25+
import static org.apache.http.HttpHeaders.CONTENT_TYPE;
26+
import static org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE;
27+
import static org.springframework.http.HttpStatus.UNAUTHORIZED;
28+
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
29+
2630
@Component
2731
@RequiredArgsConstructor
2832
public class AuthExceptionHandlerReactive {
@@ -32,9 +36,9 @@ public class AuthExceptionHandlerReactive {
3236

3337
public Mono<Void> handleTokenNotValid(ServerWebExchange exchange) {
3438
var response = exchange.getResponse();
35-
response.setStatusCode(HttpStatus.UNAUTHORIZED);
39+
response.setStatusCode(UNAUTHORIZED);
3640
response.getHeaders().add(ApimlConstants.AUTH_FAIL_HEADER, "Invalid token");
37-
response.getHeaders().add("Content-Type", "application/json");
41+
response.getHeaders().add(CONTENT_TYPE, APPLICATION_JSON_VALUE);
3842

3943
ApiMessageView message = messageService
4044
.createMessage("org.zowe.apiml.common.unauthorized", exchange.getRequest().getPath())
@@ -49,4 +53,23 @@ public Mono<Void> handleTokenNotValid(ServerWebExchange exchange) {
4953

5054
return response.writeWith(Mono.just(response.bufferFactory().wrap(bytes)));
5155
}
56+
57+
public Mono<Void> handleServiceUnavailable(ServerWebExchange exchange) {
58+
var response = exchange.getResponse();
59+
response.setStatusCode(SERVICE_UNAVAILABLE);
60+
response.getHeaders().add(CONTENT_TYPE, APPLICATION_JSON_VALUE);
61+
62+
ApiMessageView message = messageService
63+
.createMessage("org.zowe.apiml.common.serviceUnavailable", exchange.getRequest().getPath())
64+
.mapToView();
65+
66+
byte[] bytes;
67+
try {
68+
bytes = objectMapper.writeValueAsBytes(message);
69+
} catch (JsonProcessingException e) {
70+
bytes = "{\"message\":\"service unavailable\"}".getBytes(StandardCharsets.UTF_8);
71+
}
72+
73+
return response.writeWith(Mono.just(response.bufferFactory().wrap(bytes)));
74+
}
5275
}

gateway-service/src/main/java/org/zowe/apiml/gateway/filters/security/TokenAuthFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class TokenAuthFilter implements WebFilter {
3737
private final TokenProvider tokenProvider;
3838
private final AuthConfigurationProperties authConfigurationProperties;
3939
private final AuthExceptionHandlerReactive authExceptionHandlerReactive;
40+
4041
@Override
4142
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
4243
var token = resolveToken(exchange.getRequest()).filter(StringUtils::isNotBlank);
@@ -50,7 +51,7 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
5051
}
5152
return authExceptionHandlerReactive.handleTokenNotValid(exchange);
5253

53-
})
54+
}).onErrorResume(ex -> authExceptionHandlerReactive.handleServiceUnavailable(exchange))
5455
).orElseGet(() -> chain.filter(exchange));
5556
}
5657

gateway-service/src/test/java/org/zowe/apiml/gateway/filters/security/AuthExceptionHandlerReactiveTest.java

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.fasterxml.jackson.core.JsonParseException;
1414
import com.fasterxml.jackson.core.JsonProcessingException;
1515
import com.fasterxml.jackson.databind.ObjectMapper;
16+
import org.apache.http.HttpHeaders;
1617
import org.junit.jupiter.api.AfterEach;
1718
import org.junit.jupiter.api.BeforeEach;
1819
import org.junit.jupiter.api.Nested;
@@ -21,6 +22,7 @@
2122
import org.mockito.Mock;
2223
import org.mockito.junit.jupiter.MockitoExtension;
2324
import org.springframework.http.HttpStatus;
25+
import org.springframework.http.MediaType;
2426
import org.springframework.http.server.RequestPath;
2527
import org.springframework.http.server.reactive.ServerHttpRequest;
2628
import org.springframework.mock.http.server.reactive.MockServerHttpResponse;
@@ -41,8 +43,10 @@
4143
@ExtendWith(MockitoExtension.class)
4244
public class AuthExceptionHandlerReactiveTest {
4345

44-
@Mock private MessageService messageService;
45-
@Mock private ObjectMapper objectMapper;
46+
@Mock
47+
private MessageService messageService;
48+
@Mock
49+
private ObjectMapper objectMapper;
4650

4751
private AuthExceptionHandlerReactive handler;
4852

@@ -54,10 +58,12 @@ void setUp() {
5458
@Nested
5559
class GivenHandler {
5660

57-
@Mock private ServerWebExchange exchange;
61+
@Mock
62+
private ServerWebExchange exchange;
5863

5964
private MockServerHttpResponse response;
6065

66+
6167
@BeforeEach
6268
void setUp() {
6369
response = new MockServerHttpResponse();
@@ -69,9 +75,8 @@ void setUp() {
6975

7076
@AfterEach
7177
void assertResponse() {
72-
assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
73-
assertEquals(List.of("Invalid token"), response.getHeaders().get("X-Zowe-Auth-Failure"));
74-
assertEquals(List.of("application/json"), response.getHeaders().get("Content-Type"));
78+
79+
assertEquals(List.of(MediaType.APPLICATION_JSON_VALUE), response.getHeaders().get(HttpHeaders.CONTENT_TYPE));
7580
}
7681

7782
@Test
@@ -89,6 +94,8 @@ void whenHandleInvalidToken_thenUpdateResponse() throws JsonProcessingException
8994
.verify();
9095

9196
assertEquals("{\"code\":\"ZWEA11\"}", response.getBodyAsString().block());
97+
assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
98+
assertEquals(List.of("Invalid token"), response.getHeaders().get("X-Zowe-Auth-Failure"));
9299
}
93100

94101
@Test
@@ -106,8 +113,45 @@ void whenHandleInvalidToken_AndException_thenDefaultMessage() throws JsonProcess
106113
.verify();
107114

108115
assertEquals("{\"message\":\"Invalid token\"}", response.getBodyAsString().block());
116+
assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
117+
assertEquals(List.of("Invalid token"), response.getHeaders().get("X-Zowe-Auth-Failure"));
118+
}
119+
120+
@Test
121+
void whenHandleUnavailableService_thenUpdateResponse() throws JsonProcessingException {
122+
var view = mock(ApiMessageView.class);
123+
var correctMessage = mock(Message.class);
124+
when(messageService.createMessage(eq("org.zowe.apiml.common.serviceUnavailable"), any(RequestPath.class)))
125+
.thenReturn(correctMessage);
126+
when(correctMessage.mapToView()).thenReturn(view);
127+
128+
when(objectMapper.writeValueAsBytes(view)).thenReturn("{\"code\":\"ZWEAO503\"}".getBytes());
129+
130+
StepVerifier.create(handler.handleServiceUnavailable(exchange))
131+
.expectComplete()
132+
.verify();
133+
134+
assertEquals("{\"code\":\"ZWEAO503\"}", response.getBodyAsString().block());
135+
assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode());
109136
}
110137

138+
@Test
139+
void whenHandleUnavailableService_AndException_thenDefaultMessage() throws JsonProcessingException {
140+
var view = mock(ApiMessageView.class);
141+
var correctMessage = mock(Message.class);
142+
when(messageService.createMessage(eq("org.zowe.apiml.common.serviceUnavailable"), any(RequestPath.class)))
143+
.thenReturn(correctMessage);
144+
when(correctMessage.mapToView()).thenReturn(view);
145+
146+
when(objectMapper.writeValueAsBytes(view)).thenThrow(new JsonParseException("exception"));
147+
148+
StepVerifier.create(handler.handleServiceUnavailable(exchange))
149+
.expectComplete()
150+
.verify();
151+
152+
assertEquals("{\"message\":\"service unavailable\"}", response.getBodyAsString().block());
153+
assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode());
154+
}
111155
}
112156

113157
}

gateway-service/src/test/java/org/zowe/apiml/gateway/filters/security/TokenAuthFilterTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import static java.util.Arrays.asList;
3434
import static java.util.Collections.singletonMap;
35-
import static org.junit.jupiter.api.Assertions.assertEquals;
3635
import static org.mockito.ArgumentMatchers.any;
3736
import static org.mockito.Mockito.*;
3837
import static org.springframework.util.CollectionUtils.toMultiValueMap;
@@ -130,14 +129,14 @@ void givenTokenIsInCookieValid_thenCreateAuthentication() {
130129
}
131130

132131
@Test
133-
void givenTokenIsInvalidError_thenStopChainAndReturnError() {
132+
void givenTokenIsInvalidError_thenCompletesWithCorrectHandler() {
134133
mockTokenInCookie();
135-
134+
when(authExceptionHandlerReactive.handleServiceUnavailable(any()))
135+
.thenReturn(Mono.empty());
136136
when(tokenProvider.validateToken("token")).thenReturn(Mono.error(new RuntimeException("error in validation")));
137137
StepVerifier.create(tokenAuthFilter.filter(serverWebExchange, chain))
138-
.expectErrorSatisfies(error -> assertEquals("error in validation", error.getMessage()))
139-
.verify();
140-
138+
.verifyComplete();
139+
verify(authExceptionHandlerReactive, times(1)).handleServiceUnavailable(any());
141140
verify(chain, never()).filter(serverWebExchange);
142141
}
143142

@@ -157,7 +156,7 @@ void givenTokenIsInvalidEmpty_thenStopChainAndReturnEmpty() {
157156
void givenTokenIsInvalidEmptyUser_thenHandleException() {
158157
mockTokenInCookie();
159158
when(tokenProvider.validateToken("token")).thenReturn(Mono.just(new QueryResponse()));
160-
when(authExceptionHandlerReactive.handleTokenNotValid(any()))
159+
when(authExceptionHandlerReactive.handleServiceUnavailable(any()))
161160
.thenReturn(Mono.error(new TokenNotValidException("Invalid token")));
162161

163162
StepVerifier.create(tokenAuthFilter.filter(serverWebExchange, chain))

schemas/caching-schema.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,22 @@
8282
"default": 7601
8383
}
8484
}
85+
},
86+
"tcp": {
87+
"type": "object",
88+
"description": "TCP stack",
89+
"properties": {
90+
"diag": {
91+
"type": "object",
92+
"description": "Cluster diagnostics",
93+
"properties": {
94+
"enabled": {
95+
"type": "boolean",
96+
"description": "Enable diagnostics of infinispan cluster"
97+
}
98+
}
99+
}
100+
}
85101
}
86102
}
87103
},

0 commit comments

Comments
 (0)