From ea98fac0af5ea24c5d3e64920bd11437a4fca0d3 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 4 May 2026 05:57:22 +0500
Subject: [PATCH 01/71] chore: refactoring
---
core-utils/k8s/pom.xml | 24 ++-
.../core/utils/k8s/M2MClientFactory.java | 50 +++++
.../core/utils/k8s/impl/M2MInterceptor.java | 108 +++++++++++
.../core/utils/k8s/impl/UrlCache.java | 90 +++++++++
.../utils/k8s/impl/M2MInterceptorTest.java | 182 ++++++++++++++++++
.../core/utils/k8s/impl/UrlCacheTest.java | 38 ++++
core-utils/k8s/src/test/resources/logback.xml | 8 +-
7 files changed, 496 insertions(+), 4 deletions(-)
create mode 100644 core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
create mode 100644 core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
create mode 100644 core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCache.java
create mode 100644 core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java
create mode 100644 core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCacheTest.java
diff --git a/core-utils/k8s/pom.xml b/core-utils/k8s/pom.xml
index b79f4a825..e22d766d1 100644
--- a/core-utils/k8s/pom.xml
+++ b/core-utils/k8s/pom.xml
@@ -49,6 +49,22 @@
jackson-databind
2.21.2
+
+ com.squareup.okhttp3
+ okhttp
+ 4.12.0
+
+
+ com.netcracker.cloud.security.core.utils
+ tls-utils
+ 3.1.0-SNAPSHOT
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ 3.2.3
+
+
@@ -72,7 +88,7 @@
com.squareup.okhttp3
mockwebserver
- 5.3.2
+ 4.12.0
test
@@ -81,6 +97,12 @@
1.5.32
test
+
+ org.wiremock
+ wiremock
+ 3.13.2
+ test
+
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
new file mode 100644
index 000000000..8ed95a63f
--- /dev/null
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
@@ -0,0 +1,50 @@
+package com.netcracker.cloud.security.core.utils.k8s;
+
+import com.netcracker.cloud.security.core.utils.k8s.impl.M2MInterceptor;
+import com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache;
+import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.OkHttpClient;
+
+import java.nio.file.Paths;
+import java.util.Optional;
+import java.util.function.Supplier;
+
+@Slf4j
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class M2MClientFactory {
+ public static final String DBAAS_AGENT_URL_PROP = "com.netcracker.cloud.dbaas.agent.url";
+ public static final String MAAS_AGENT_URL_PROP = "com.netcracker.cloud.maas.agent.url";
+
+ private static final Supplier k8sAuthHeaderSupplier =
+ getBearerAuthHeaderSupplier(() -> KubernetesAudienceToken.getToken(AudienceName.NETCRACKER));
+
+ public static OkHttpClient getM2MClient(Supplier keycloakTokenSupplier) {
+ return getClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier));
+ }
+
+ public static OkHttpClient getDBaaSClient(Supplier keycloakTokenSupplier) {
+ return getAgentClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(DBAAS_AGENT_URL_PROP)).orElse("http://dbaas-agent:8080"));
+ }
+
+ public static OkHttpClient getMaaSClient(Supplier keycloakTokenSupplier) {
+ return getAgentClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(MAAS_AGENT_URL_PROP)).orElse("http://maas-agent:8080"));
+ }
+
+ private static OkHttpClient getAgentClient(Supplier keycloakTokenSupplier, String agentUrl) {
+ return getClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl));
+ }
+
+ private static OkHttpClient getClient(M2MInterceptor interceptor) {
+ return new OkHttpClient.Builder()
+ .sslSocketFactory(TlsUtils.getSslContext().getSocketFactory(), TlsUtils.getTrustManager())
+ .addInterceptor(interceptor)
+ .build();
+ }
+
+ private static Supplier getBearerAuthHeaderSupplier(Supplier tokenSupplier) {
+ return () -> "Bearer " + tokenSupplier.get();
+ }
+}
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
new file mode 100644
index 000000000..9db27d14d
--- /dev/null
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
@@ -0,0 +1,108 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.HttpUrl;
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.function.Supplier;
+
+import static com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache.calculateCacheKey;
+import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
+
+@Slf4j
+public final class M2MInterceptor implements Interceptor {
+
+ public static final String KUBERNETES_TOKEN_ACQUISITION_ERROR = """
+ Error acquiring kubernetes token for m2m communication.
+ The current version of the security library expects a kubernetes token with the `netcracker` audience to be mounted in the deployment.
+ if you do not intend to use a kubernetes token at this time, please roll back to a previous version of the library.
+ otherwise, make sure that a kubernetes token with the `netcracker` audience is properly mounted.
+ the previous authentication method will be used as a fallback.""";
+ public static final String KUBERNETES_TOKEN_UNAUTHORIZED_ERROR = """
+ Unauthorized access (http 401).
+ During an m2m interaction attempt using a kubernetes token with the `netcracker` audience, a 401 error was received.
+ The possible cause is an outdated version of the security library on the server side.
+ The previous authentication method will be used as a fallback.""";
+
+ private final UrlCache urlCache;
+ private final Supplier fallbackAuthHeaderSupplier;
+ private final Supplier k8sAuthHeaderSupplier;
+ private final HttpUrl fallbackBaseUrl;
+
+ public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier) {
+ this(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier, null);
+ }
+
+ public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, String fallbackBaseUrl) {
+ this.urlCache = urlCache;
+ this.fallbackAuthHeaderSupplier = fallbackAuthHeaderSupplier;
+ this.k8sAuthHeaderSupplier = k8sAuthHeaderSupplier;
+ this.fallbackBaseUrl = (fallbackBaseUrl != null) ? HttpUrl.get(fallbackBaseUrl) : null;
+ }
+
+ @NotNull
+ @Override
+ public Response intercept(final Interceptor.Chain chain) throws IOException {
+ final Request request = chain.request();
+ final String cacheKey = calculateCacheKey(request.url().toString());
+ if (!urlCache.containsKey(cacheKey)) {
+ //first call (no information) / kubernetes token is applicable
+ final Request altered;
+ try {
+ altered = buildRequest(request, k8sAuthHeaderSupplier.get(), false);
+ } catch (IllegalStateException ex) {
+ final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
+ return doRequestFallback(fallbackRequest, KUBERNETES_TOKEN_ACQUISITION_ERROR, cacheKey, chain);
+ }
+ final Response response = chain.proceed(altered);
+ if (response.code() == HTTP_UNAUTHORIZED) {
+ //authentication failed, need to use old approach
+ response.close();
+ final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
+ return doRequestFallback(fallbackRequest, KUBERNETES_TOKEN_UNAUTHORIZED_ERROR, cacheKey, chain);
+ }
+ return response;
+ }
+ final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
+ return chain.proceed(fallbackRequest);
+ }
+
+ private Response doRequestFallback(final Request fallbackRequest,
+ final String reason,
+ final String cacheKey,
+ final Interceptor.Chain chain) throws IOException {
+ final Response fallbackResponse = chain.proceed(fallbackRequest);
+ if (fallbackResponse.isSuccessful()) {
+ urlCache.store(cacheKey);
+ log.warn("Failed to establish m2m connection to {}\n{}", fallbackRequest.url(), reason);
+ }
+ return fallbackResponse;
+ }
+
+ private Request buildRequest(final Request initialRequest, final String authHeader, final boolean useFallbackUrl) {
+ if (StringUtils.isEmpty(authHeader)) {
+ throw new IllegalStateException("M2M auth header is empty.");
+ }
+ HttpUrl targetUrl = initialRequest.url();
+ if(useFallbackUrl && fallbackBaseUrl != null) {
+ targetUrl = rebaseUrl(initialRequest.url(), fallbackBaseUrl);
+ }
+ return initialRequest.newBuilder()
+ .url(targetUrl)
+ .header("Authorization", authHeader)
+ .build();
+ }
+
+ private static HttpUrl rebaseUrl(final HttpUrl original, final HttpUrl base) {
+ return original.newBuilder()
+ .scheme(base.scheme())
+ .host(base.host())
+ .port(base.port())
+ .build();
+ }
+}
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCache.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCache.java
new file mode 100644
index 000000000..24edd19b8
--- /dev/null
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCache.java
@@ -0,0 +1,90 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+public class UrlCache {
+ private static final String INTERNAL_GATEWAY = "internal-gateway";
+ private static final int CACHE_SIZE = 400;
+ private static final long CACHE_DURATION_SECONDS = TimeUnit.HOURS.toSeconds(5);
+ private final Cache cache;
+
+ public UrlCache() {
+ this(CACHE_SIZE, CACHE_DURATION_SECONDS);
+ }
+
+ public UrlCache(final int cacheSize, final long ttlSeconds) {
+ this.cache = Caffeine.newBuilder()
+ .maximumSize(cacheSize)
+ .expireAfterAccess(ttlSeconds, TimeUnit.SECONDS)
+ .build();
+ }
+
+ public void store(@NotNull final String key) {
+ cache.put(key, Boolean.TRUE);
+ }
+
+ public boolean containsKey(@NotNull final String key) {
+ return cache.getIfPresent(key) != null;
+ }
+
+ public static String calculateCacheKey(final String rawUrl) {
+ URI parsedURI;
+ try {
+ parsedURI = new URI(rawUrl);
+ } catch (Exception ex) {
+ throw new RuntimeException("Failed during parsing of URL: ", ex); //NOSONAR
+ }
+ return calculateCacheKey(parsedURI);
+ }
+
+ public static String calculateCacheKey(final URI parsedURI) {
+ return parsedURI.getHost().contains(INTERNAL_GATEWAY)
+ ? calculateCacheKeyForInternalGateway(parsedURI)
+ : parsedURI.getHost() + ":" + parsedURI.getPort();
+ }
+
+ private static String calculateCacheKeyForInternalGateway(final URI parsedUri) {
+ final String[] segments = StringUtils.strip(parsedUri.getPath(), "/").split("/");
+ final List filteredSegments = new ArrayList<>();
+
+ String version = "";
+ String serviceName = "";
+
+ for (String segment : segments) {
+ if (StringUtils.isNotEmpty(version)) {
+ serviceName = segment;
+ break;
+ }
+ filteredSegments.add(segment);
+ if (isVersion(segment)) {
+ version = segment;
+ }
+ }
+
+ if (StringUtils.isEmpty(version)) {
+ log.debug("internal-gateway url does not contain any version; whole path will be used as a key for m2m decision cache");
+ }
+ String key = parsedUri.getHost() + ":" + parsedUri.getPort() + "/" + StringUtils.join(filteredSegments, "/");
+ if (parsedUri.getPath().startsWith("/api") && StringUtils.isNotEmpty(serviceName)) {
+ key = key + "/" + serviceName;
+ }
+
+ return key;
+ }
+
+ private static boolean isVersion(final String segment) {
+ if (segment.length() < 2 || segment.charAt(0) != 'v')
+ return false;
+ return segment.substring(1).matches("\\d+");
+ }
+}
diff --git a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java
new file mode 100644
index 000000000..3b7f1d5d9
--- /dev/null
+++ b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java
@@ -0,0 +1,182 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import org.junit.jupiter.api.Test;
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.client.WireMock;
+import lombok.SneakyThrows;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.mockito.Mockito;
+
+import java.util.function.Supplier;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+class M2MInterceptorTest {
+ private static final String TEST_ENDPOINT = "/test/endpoint";
+ private static final int TEST_CACHE_SIZE = 10;
+ private static final long TEST_CACHE_DURATION_SEC = 60;
+
+ private WireMockServer wireMockServer;
+ private OkHttpClient client;
+
+ private Supplier fallbackSupplier;
+ private Supplier k8sSupplier;
+
+ private static final String K8S_TOKEN_HEADER = "Bearer k8s-test-token";
+ private static final String FALLBACK_TOKEN_HEADER = "Bearer fallback-test-token";
+
+ @BeforeEach
+ @SuppressWarnings("unchecked")
+ void beforeEach() {
+ wireMockServer = new WireMockServer(0);
+ wireMockServer.start();
+ WireMock.configureFor("localhost", wireMockServer.port());
+
+ UrlCache urlCache = new UrlCache(TEST_CACHE_SIZE, TEST_CACHE_DURATION_SEC);
+ fallbackSupplier = Mockito.mock(Supplier.class);
+ k8sSupplier = Mockito.mock(Supplier.class);
+
+ // Default behavior: return valid tokens
+ when(k8sSupplier.get()).thenReturn(K8S_TOKEN_HEADER);
+ when(fallbackSupplier.get()).thenReturn(FALLBACK_TOKEN_HEADER);
+
+ final M2MInterceptor interceptor = new M2MInterceptor(urlCache, fallbackSupplier, k8sSupplier);
+
+ client = new OkHttpClient.Builder()
+ .addInterceptor(interceptor)
+ .build();
+ }
+
+ @AfterEach
+ void afterEach() {
+ wireMockServer.stop();
+ }
+
+ @Test
+ @SneakyThrows
+ void kubernetesTokenAuth_Success() {
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200)));
+
+ try (Response response = client.newCall(buildRequest()).execute()) {
+ assertEquals(200, response.code());
+ }
+
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)));
+ }
+
+ @Test
+ @SneakyThrows
+ void keycloakTokenAuth_UnauthorizedFallback() {
+ // 1. First call with K8s token returns 401
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(401)));
+
+ // 2. Fallback call with Keycloak token returns 200
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200)));
+
+ try (Response response = client.newCall(buildRequest()).execute()) {
+ assertEquals(200, response.code());
+ }
+
+ // Verify both requests were made
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+
+ // 3. Second call should go STRAIGHT to fallback because URL is now cached as "non-k8s"
+ try (Response response = client.newCall(buildRequest()).execute()) {
+ assertEquals(200, response.code());
+ }
+
+ // Total count for fallback should be 2, but K8s should still be 1
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ verify(2, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+ }
+
+ @Test
+ @SneakyThrows
+ void kubernetesTokenAcquisitionError_Fallback() {
+ // Simulate acquisition error
+ when(k8sSupplier.get()).thenThrow(new IllegalStateException("K8s failed"));
+
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200)));
+
+ try (Response response = client.newCall(buildRequest()).execute()) {
+ assertEquals(200, response.code());
+ }
+
+ // Verify it never tried K8s at the network level and went straight to fallback
+ verify(0, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+ }
+
+ @Test
+ @SneakyThrows
+ void bothTokensEmpty_ThrowsException() {
+ when(k8sSupplier.get()).thenReturn("");
+ when(fallbackSupplier.get()).thenReturn("");
+
+ assertThrows(IllegalStateException.class, () -> {
+ client.newCall(buildRequest()).execute();
+ });
+ }
+
+ private Request buildRequest() {
+ return new Request.Builder()
+ .url(wireMockServer.baseUrl() + TEST_ENDPOINT)
+ .get()
+ .build();
+ }
+
+ @Test
+ @SneakyThrows
+ void fallbackUrl_RebasesHostWhenFallbackOccurs() {
+ WireMockServer fallbackServer = new WireMockServer(0);
+ fallbackServer.start();
+ WireMock.configureFor("localhost", fallbackServer.port());
+
+ fallbackServer.stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200)));
+
+ wireMockServer.stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(401)));
+
+ UrlCache urlCache = new UrlCache(TEST_CACHE_SIZE, TEST_CACHE_DURATION_SEC);
+ String fallbackBaseUrl = "http://localhost:" + fallbackServer.port();
+
+ M2MInterceptor interceptor = new M2MInterceptor(urlCache, fallbackSupplier, k8sSupplier, fallbackBaseUrl);
+ OkHttpClient clientWithFallbackUrl = new OkHttpClient.Builder()
+ .addInterceptor(interceptor)
+ .build();
+
+ Request request = new Request.Builder()
+ .url(wireMockServer.baseUrl() + TEST_ENDPOINT)
+ .get()
+ .build();
+
+ try (Response response = clientWithFallbackUrl.newCall(request).execute()) {
+ assertEquals(200, response.code());
+ }
+
+ wireMockServer.verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ fallbackServer.verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+
+ fallbackServer.stop();
+ }
+}
diff --git a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCacheTest.java b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCacheTest.java
new file mode 100644
index 000000000..a450fe4dd
--- /dev/null
+++ b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/UrlCacheTest.java
@@ -0,0 +1,38 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import org.junit.jupiter.api.Test;
+
+import static com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache.calculateCacheKey;
+import static org.junit.jupiter.api.Assertions.*;
+
+class UrlCacheTest {
+
+ @Test
+ void calculateCacheKeyTest() {
+ String key = calculateCacheKey("https://internal-gateway:3030/api/v1/service-a/resource/123");
+ assertEquals("internal-gateway:3030/api/v1/service-a", key);
+
+ key = calculateCacheKey("https://internal-gateway:3030/api/v1");
+ assertEquals("internal-gateway:3030/api/v1", key);
+
+ key = calculateCacheKey("https://internal-gateway:3030/custom-prefix/api/v2/module-b/action");
+ assertEquals("internal-gateway:3030/custom-prefix/api/v2", key);
+
+ key = calculateCacheKey("https://internal-gateway:3030/long/complex/path/v3/target/item");
+ assertEquals("internal-gateway:3030/long/complex/path/v3", key);
+
+ key = calculateCacheKey("https://internal-gateway:3030/api/v/resource");
+ assertEquals("internal-gateway:3030/api/v/resource", key);
+
+ key = calculateCacheKey("https://internal-gateway:3030/api/vv/resource");
+ assertEquals("internal-gateway:3030/api/vv/resource", key);
+
+ key = calculateCacheKey("https://internal-gateway:3030/api/v1/service?query=param&data=true");
+ assertEquals("internal-gateway:3030/api/v1/service", key);
+
+ key = calculateCacheKey("https://external-service:8080/api/v1/resource");
+ assertEquals("external-service:8080", key);
+
+ assertThrows(RuntimeException.class, () -> calculateCacheKey("illegal characters here"));
+ }
+}
diff --git a/core-utils/k8s/src/test/resources/logback.xml b/core-utils/k8s/src/test/resources/logback.xml
index 9fa50918a..473e4e83e 100644
--- a/core-utils/k8s/src/test/resources/logback.xml
+++ b/core-utils/k8s/src/test/resources/logback.xml
@@ -1,17 +1,19 @@
-
-
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n
-
+
+
+
+
+
From daabb7bd4c79966871264cd2e93e68a46fbf5082 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 4 May 2026 14:27:52 +0500
Subject: [PATCH 02/71] chore: refactoring
---
core-utils/k8s/pom.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/core-utils/k8s/pom.xml b/core-utils/k8s/pom.xml
index e22d766d1..640a80647 100644
--- a/core-utils/k8s/pom.xml
+++ b/core-utils/k8s/pom.xml
@@ -10,6 +10,7 @@
k8s-utils
+ 3.1.0-rest-client-SNAPSHOT
jar
From 0a6025b36e5cb281bac6bc3899c6985f80b1489b Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 04:19:49 +0500
Subject: [PATCH 03/71] chore: refactoring
---
.../springcloud-config-source/runtime/pom.xml | 8 +++++++-
.../config/source/ConfigServerClientImpl.java | 7 +++----
.../dbaas-client/dbaas-common/runtime/pom.xml | 5 +++++
.../cloud/dbaas/common/config/M2MDbaaSClient.java | 8 +++-----
.../routes-registrator/runtime/pom.xml | 7 ++++++-
.../gateway/route/RouteRegistrationConfig.java | 12 +++---------
.../config-server-loader-resttemplate/pom.xml | 5 +++++
.../config-server-loader-webclient/pom.xml | 5 +++++
...ientConfigServerConfigDataLocationResolver.java | 14 ++++++--------
core-utils/k8s/pom.xml | 2 +-
.../security/core/utils/k8s/M2MClientFactory.java | 3 ---
11 files changed, 44 insertions(+), 32 deletions(-)
diff --git a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml
index db01951f3..11f398ab7 100644
--- a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml
+++ b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml
@@ -58,7 +58,13 @@
com.squareup.okhttp3
okhttp
-
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-rest-client-SNAPSHOT
+
+
+
org.mockito
mockito-core
diff --git a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
index 55802062b..941465d6d 100644
--- a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
+++ b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
@@ -6,8 +6,8 @@
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import com.netcracker.cloud.quarkus.security.auth.M2MManager;
-import com.netcracker.cloud.security.core.auth.Token;
import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import okhttp3.*;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.eclipse.microprofile.config.Config;
@@ -36,7 +36,8 @@ public class ConfigServerClientImpl implements ConfigServerClient {
private URL url;
public ConfigServerClientImpl(String csUrl) throws MalformedURLException {
- client = new OkHttpClient.Builder()
+ client = M2MClientFactory.getM2MClient(() -> M2MManager.getInstance().getToken().getTokenValue())
+ .newBuilder()
.connectionSpecs(Collections.singletonList(
csUrl.startsWith("https") ? ConnectionSpec.COMPATIBLE_TLS : ConnectionSpec.CLEARTEXT)
)
@@ -87,9 +88,7 @@ private String processRequest(Request request) throws IOException {
int count = 1;
while (true) {
try {
- Token token = M2MManager.getInstance().getToken();
request = request.newBuilder()
- .addHeader("Authorization", token.getTokenType() + " " + token.getTokenValue())
.build();
Response response = client.newCall(request).execute();
return response.body().string();
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml
index 7fd6ee6d2..5fa738252 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml
@@ -63,6 +63,11 @@
com.netcracker.cloud.security.core.utils
tls-utils
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-rest-client-SNAPSHOT
+
io.quarkus
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
index 559aa3ddc..1025673f5 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
@@ -10,6 +10,7 @@
import com.netcracker.cloud.quarkus.security.auth.M2MManager;
import com.netcracker.cloud.security.core.auth.Token;
import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import java.util.Optional;
@@ -28,13 +29,10 @@ public M2MDbaaSClient(DbaasClientConfig config) {
public DbaasClient build() {
String url = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
- OkHttpClient httpClient = new OkHttpClient.Builder()
+ OkHttpClient httpClient = M2MClientFactory.getDBaaSClient(() -> M2MManager.getInstance().getToken().getTokenValue()).newBuilder()
.addInterceptor(chain -> {
Request original = chain.request();
- Token token = M2MManager.getInstance().getToken();
- String credentials = token.getTokenType() + " " + token.getTokenValue();
- Request.Builder requestBuilder = original.newBuilder()
- .addHeader("Authorization", credentials);
+ Request.Builder requestBuilder = original.newBuilder();
Optional tenantContextData = ContextManager.getSafe(TENANT_CONTEXT_NAME);
if (tenantContextData.isPresent() && tenantContextData.get().getTenant() != null) {
requestBuilder.addHeader("tenant", tenantContextData.get().getTenant());
diff --git a/core-quarkus-extensions/routes-registrator/runtime/pom.xml b/core-quarkus-extensions/routes-registrator/runtime/pom.xml
index 3e84e7283..9a24158f4 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/pom.xml
+++ b/core-quarkus-extensions/routes-registrator/runtime/pom.xml
@@ -47,7 +47,12 @@
com.netcracker.cloud.security.core.utils
tls-utils
-
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-rest-client-SNAPSHOT
+
+
io.quarkus
quarkus-junit
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
index fca416dcb..49d1e58e1 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
@@ -14,6 +14,7 @@
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.eclipse.microprofile.config.inject.ConfigProperty;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import java.util.Optional;
@@ -82,15 +83,8 @@ ControlPlaneClient controlPlaneClient(@Named(CONTROL_PLANE_HTTP_CLIENT) OkHttpCl
@Produces
@Named(CONTROL_PLANE_HTTP_CLIENT)
OkHttpClient controlPlaneHttpClient() {
- return new OkHttpClient.Builder()
- .addInterceptor(chain -> {
- Token token = M2MManager.getInstance().getToken();
- Request original = chain.request();
- Request request = original.newBuilder()
- .addHeader("Authorization", token.getTokenType() + " " + token.getTokenValue())
- .build();
- return chain.proceed(request);
- })
+ return M2MClientFactory.getM2MClient(() -> M2MManager.getInstance().getToken().getTokenValue())
+ .newBuilder()
.retryOnConnectionFailure(true)
.build();
}
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
index ff4748195..58d858684 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
@@ -25,5 +25,10 @@
rest-security-adapters
${project.version}
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-SNAPSHOT
+
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml b/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
index 9a3efcdf6..460745cd7 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
@@ -25,5 +25,10 @@
rest-security-adapters
${project.version}
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-SNAPSHOT
+
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
index 9fa2e419b..35dc344c7 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
@@ -6,8 +6,10 @@
import com.netcracker.cloud.security.core.auth.M2MManager;
import org.springframework.boot.bootstrap.ConfigurableBootstrapContext;
import org.springframework.boot.logging.DeferredLogFactory;
+import org.springframework.http.client.reactive.ClientHttpConnector;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.WebClient;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
@@ -26,14 +28,10 @@ public MicroserviceRestClient getMicroserviceRestClient() {
}
private WebClient createM2MWebClient() {
- WebClient.Builder builder = WebClient.builder();
- if (hasM2M(configurableBootstrapContext)) {
- builder.filter(
- (request, next) ->
- next.exchange(ClientRequest.from(request).
- header(AUTHORIZATION, "Bearer " + getM2MToken(configurableBootstrapContext)).build())
- );
- }
+ var client = M2MClientFactory.getM2MClient(() -> getM2MToken(configurableBootstrapContext));
+ ClientHttpConnector connector = new OkHttp3ClientHttpRequestFactory(client);
+ WebClient.Builder builder = WebClient.builder()
+ .clientConnector(connector);
return builder.build();
}
diff --git a/core-utils/k8s/pom.xml b/core-utils/k8s/pom.xml
index 640a80647..f00d82ba5 100644
--- a/core-utils/k8s/pom.xml
+++ b/core-utils/k8s/pom.xml
@@ -50,7 +50,7 @@
jackson-databind
2.21.2
-
+
com.squareup.okhttp3
okhttp
4.12.0
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
index 8ed95a63f..ae3503da0 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
@@ -2,13 +2,11 @@
import com.netcracker.cloud.security.core.utils.k8s.impl.M2MInterceptor;
import com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache;
-import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
-import java.nio.file.Paths;
import java.util.Optional;
import java.util.function.Supplier;
@@ -39,7 +37,6 @@ private static OkHttpClient getAgentClient(Supplier keycloakTokenSupplie
private static OkHttpClient getClient(M2MInterceptor interceptor) {
return new OkHttpClient.Builder()
- .sslSocketFactory(TlsUtils.getSslContext().getSocketFactory(), TlsUtils.getTrustManager())
.addInterceptor(interceptor)
.build();
}
From 197d75c0d6813f4116913586d9fe5a3eb270fcae Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 10:15:53 +0500
Subject: [PATCH 04/71] chore: refactoring
---
.../springcloud-config-source/runtime/pom.xml | 2 +-
.../dbaas-client/dbaas-common/runtime/pom.xml | 2 +-
.../dbaas/common/config/M2MDbaaSClientTest.java | 2 +-
.../routes-registrator/runtime/pom.xml | 2 +-
.../gateway/route/RouteRegistrationConfig.java | 2 ++
.../config-server-loader-webclient/pom.xml | 5 -----
...ientConfigServerConfigDataLocationResolver.java | 14 ++++++++------
core-utils/k8s/pom.xml | 1 -
.../core/utils/k8s/impl/M2MInterceptor.java | 2 +-
9 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml
index 11f398ab7..9c8dabcea 100644
--- a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml
+++ b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/pom.xml
@@ -61,7 +61,7 @@
com.netcracker.cloud.security.core.utils
k8s-utils
- 3.1.0-rest-client-SNAPSHOT
+ 3.1.0-SNAPSHOT
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml
index 5fa738252..b512de634 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/pom.xml
@@ -66,7 +66,7 @@
com.netcracker.cloud.security.core.utils
k8s-utils
- 3.1.0-rest-client-SNAPSHOT
+ 3.1.0-SNAPSHOT
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
index adea1a0b5..4ac107d0a 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
@@ -29,7 +29,7 @@ void testBuild() throws NoSuchFieldException, IllegalAccessException {
clientField.setAccessible(true);
OkHttpClient clientValue = (OkHttpClient) clientField.get(client);
assertNotNull(client);
- assertEquals(2, clientValue.interceptors().size());
+ assertEquals(3, clientValue.interceptors().size());
}
}
diff --git a/core-quarkus-extensions/routes-registrator/runtime/pom.xml b/core-quarkus-extensions/routes-registrator/runtime/pom.xml
index 9a24158f4..9909daf12 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/pom.xml
+++ b/core-quarkus-extensions/routes-registrator/runtime/pom.xml
@@ -50,7 +50,7 @@
com.netcracker.cloud.security.core.utils
k8s-utils
- 3.1.0-rest-client-SNAPSHOT
+ 3.1.0-SNAPSHOT
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
index 49d1e58e1..40c962838 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
@@ -5,6 +5,7 @@
import com.netcracker.cloud.routesregistration.common.gateway.route.rest.RegistrationRequestFactory;
import com.netcracker.cloud.routesregistration.common.gateway.route.transformation.RouteTransformer;
import com.netcracker.cloud.security.core.auth.Token;
+import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
import io.quarkus.arc.Unremovable;
import io.reactivex.Scheduler;
import io.reactivex.schedulers.Schedulers;
@@ -86,6 +87,7 @@ OkHttpClient controlPlaneHttpClient() {
return M2MClientFactory.getM2MClient(() -> M2MManager.getInstance().getToken().getTokenValue())
.newBuilder()
.retryOnConnectionFailure(true)
+ .sslSocketFactory(TlsUtils.getSslContext().getSocketFactory(), TlsUtils.getTrustManager())
.build();
}
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml b/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
index 460745cd7..9a3efcdf6 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
@@ -25,10 +25,5 @@
rest-security-adapters
${project.version}
-
- com.netcracker.cloud.security.core.utils
- k8s-utils
- 3.1.0-SNAPSHOT
-
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
index 35dc344c7..9fa2e419b 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
@@ -6,10 +6,8 @@
import com.netcracker.cloud.security.core.auth.M2MManager;
import org.springframework.boot.bootstrap.ConfigurableBootstrapContext;
import org.springframework.boot.logging.DeferredLogFactory;
-import org.springframework.http.client.reactive.ClientHttpConnector;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.WebClient;
-import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
@@ -28,10 +26,14 @@ public MicroserviceRestClient getMicroserviceRestClient() {
}
private WebClient createM2MWebClient() {
- var client = M2MClientFactory.getM2MClient(() -> getM2MToken(configurableBootstrapContext));
- ClientHttpConnector connector = new OkHttp3ClientHttpRequestFactory(client);
- WebClient.Builder builder = WebClient.builder()
- .clientConnector(connector);
+ WebClient.Builder builder = WebClient.builder();
+ if (hasM2M(configurableBootstrapContext)) {
+ builder.filter(
+ (request, next) ->
+ next.exchange(ClientRequest.from(request).
+ header(AUTHORIZATION, "Bearer " + getM2MToken(configurableBootstrapContext)).build())
+ );
+ }
return builder.build();
}
diff --git a/core-utils/k8s/pom.xml b/core-utils/k8s/pom.xml
index f00d82ba5..613953309 100644
--- a/core-utils/k8s/pom.xml
+++ b/core-utils/k8s/pom.xml
@@ -10,7 +10,6 @@
k8s-utils
- 3.1.0-rest-client-SNAPSHOT
jar
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
index 9db27d14d..c9e33b661 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
@@ -55,7 +55,7 @@ public Response intercept(final Interceptor.Chain chain) throws IOException {
final Request altered;
try {
altered = buildRequest(request, k8sAuthHeaderSupplier.get(), false);
- } catch (IllegalStateException ex) {
+ } catch (IllegalStateException|IllegalArgumentException ex) {
final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
return doRequestFallback(fallbackRequest, KUBERNETES_TOKEN_ACQUISITION_ERROR, cacheKey, chain);
}
From 383a2520ed2b97ae19dcca6b8282b4e26a98d3b3 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 10:19:24 +0500
Subject: [PATCH 05/71] chore: refactoring
---
.../config-server-loader-resttemplate/pom.xml | 5 -----
1 file changed, 5 deletions(-)
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
index 58d858684..ff4748195 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
@@ -25,10 +25,5 @@
rest-security-adapters
${project.version}
-
- com.netcracker.cloud.security.core.utils
- k8s-utils
- 3.1.0-SNAPSHOT
-
From a61f289591a4dc554e3ff338402991598d2c1b7b Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 10:40:14 +0500
Subject: [PATCH 06/71] chore: refactoring
---
.../config/source/ConfigServerClientImpl.java | 2 +-
.../dbaas/common/config/M2MDbaaSClient.java | 3 +-
.../route/RouteRegistrationConfig.java | 4 +-
.../core/utils/k8s/M2MClientFactory.java | 41 ++--
.../core/utils/k8s/impl/M2MAuthenticator.java | 124 ++++++++++++
.../core/utils/k8s/impl/M2MHttpClient.java | 138 +++++++++++++
.../core/utils/k8s/impl/M2MInterceptor.java | 94 ++-------
.../utils/k8s/impl/M2MHttpClientTest.java | 182 ++++++++++++++++++
8 files changed, 492 insertions(+), 96 deletions(-)
create mode 100644 core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MAuthenticator.java
create mode 100644 core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java
create mode 100644 core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java
diff --git a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
index 941465d6d..e3c260562 100644
--- a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
+++ b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
@@ -36,7 +36,7 @@ public class ConfigServerClientImpl implements ConfigServerClient {
private URL url;
public ConfigServerClientImpl(String csUrl) throws MalformedURLException {
- client = M2MClientFactory.getM2MClient(() -> M2MManager.getInstance().getToken().getTokenValue())
+ client = M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue())
.newBuilder()
.connectionSpecs(Collections.singletonList(
csUrl.startsWith("https") ? ConnectionSpec.COMPATIBLE_TLS : ConnectionSpec.CLEARTEXT)
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
index 1025673f5..1880f4209 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
@@ -8,7 +8,6 @@
import com.netcracker.cloud.dbaas.client.DbaasClient;
import com.netcracker.cloud.framework.contexts.tenant.TenantContextObject;
import com.netcracker.cloud.quarkus.security.auth.M2MManager;
-import com.netcracker.cloud.security.core.auth.Token;
import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
@@ -29,7 +28,7 @@ public M2MDbaaSClient(DbaasClientConfig config) {
public DbaasClient build() {
String url = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
- OkHttpClient httpClient = M2MClientFactory.getDBaaSClient(() -> M2MManager.getInstance().getToken().getTokenValue()).newBuilder()
+ OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue()).newBuilder()
.addInterceptor(chain -> {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder();
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
index 40c962838..12432e5e2 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
@@ -4,7 +4,6 @@
import com.netcracker.cloud.routesregistration.common.gateway.route.*;
import com.netcracker.cloud.routesregistration.common.gateway.route.rest.RegistrationRequestFactory;
import com.netcracker.cloud.routesregistration.common.gateway.route.transformation.RouteTransformer;
-import com.netcracker.cloud.security.core.auth.Token;
import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
import io.quarkus.arc.Unremovable;
import io.reactivex.Scheduler;
@@ -13,7 +12,6 @@
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Named;
import okhttp3.OkHttpClient;
-import okhttp3.Request;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
@@ -84,7 +82,7 @@ ControlPlaneClient controlPlaneClient(@Named(CONTROL_PLANE_HTTP_CLIENT) OkHttpCl
@Produces
@Named(CONTROL_PLANE_HTTP_CLIENT)
OkHttpClient controlPlaneHttpClient() {
- return M2MClientFactory.getM2MClient(() -> M2MManager.getInstance().getToken().getTokenValue())
+ return M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue())
.newBuilder()
.retryOnConnectionFailure(true)
.sslSocketFactory(TlsUtils.getSslContext().getSocketFactory(), TlsUtils.getTrustManager())
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
index ae3503da0..9a880a3bb 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
@@ -1,16 +1,17 @@
package com.netcracker.cloud.security.core.utils.k8s;
+import com.netcracker.cloud.security.core.utils.k8s.impl.M2MAuthenticator;
+import com.netcracker.cloud.security.core.utils.k8s.impl.M2MHttpClient;
import com.netcracker.cloud.security.core.utils.k8s.impl.M2MInterceptor;
import com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
+import java.net.http.HttpClient;
import java.util.Optional;
import java.util.function.Supplier;
-@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class M2MClientFactory {
public static final String DBAAS_AGENT_URL_PROP = "com.netcracker.cloud.dbaas.agent.url";
@@ -19,28 +20,46 @@ public final class M2MClientFactory {
private static final Supplier k8sAuthHeaderSupplier =
getBearerAuthHeaderSupplier(() -> KubernetesAudienceToken.getToken(AudienceName.NETCRACKER));
- public static OkHttpClient getM2MClient(Supplier keycloakTokenSupplier) {
- return getClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier));
+ public static OkHttpClient getM2mOkHttpClient(Supplier keycloakTokenSupplier) {
+ return getOkHttpClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier));
}
- public static OkHttpClient getDBaaSClient(Supplier keycloakTokenSupplier) {
- return getAgentClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(DBAAS_AGENT_URL_PROP)).orElse("http://dbaas-agent:8080"));
+ public static OkHttpClient getDbaasOkHttpClient(Supplier keycloakTokenSupplier) {
+ return getAgentOkHttpClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(DBAAS_AGENT_URL_PROP)).orElse("http://dbaas-agent:8080"));
}
- public static OkHttpClient getMaaSClient(Supplier keycloakTokenSupplier) {
- return getAgentClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(MAAS_AGENT_URL_PROP)).orElse("http://maas-agent:8080"));
+ public static OkHttpClient getMaasOkHttpClient(Supplier keycloakTokenSupplier) {
+ return getAgentOkHttpClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(MAAS_AGENT_URL_PROP)).orElse("http://maas-agent:8080"));
}
- private static OkHttpClient getAgentClient(Supplier keycloakTokenSupplier, String agentUrl) {
- return getClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl));
+ public static HttpClient getM2mHttpClient(Supplier keycloakTokenSupplier) {
+ return buildHttpClient(new M2MAuthenticator(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier));
}
- private static OkHttpClient getClient(M2MInterceptor interceptor) {
+ public static HttpClient getDbaasHttpClient(Supplier keycloakTokenSupplier) {
+ String agentUrl = Optional.ofNullable(System.getProperty(DBAAS_AGENT_URL_PROP)).orElse("http://dbaas-agent:8080");
+ return buildHttpClient(new M2MAuthenticator(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl));
+ }
+
+ public static HttpClient getMaasHttpClient(Supplier keycloakTokenSupplier) {
+ String agentUrl = Optional.ofNullable(System.getProperty(MAAS_AGENT_URL_PROP)).orElse("http://maas-agent:8080");
+ return buildHttpClient(new M2MAuthenticator(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl));
+ }
+
+ private static OkHttpClient getAgentOkHttpClient(Supplier keycloakTokenSupplier, String agentUrl) {
+ return getOkHttpClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl));
+ }
+
+ private static OkHttpClient getOkHttpClient(M2MInterceptor interceptor) {
return new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
}
+ private static HttpClient buildHttpClient(M2MAuthenticator authenticator) {
+ return new M2MHttpClient(HttpClient.newHttpClient(), authenticator);
+ }
+
private static Supplier getBearerAuthHeaderSupplier(Supplier tokenSupplier) {
return () -> "Bearer " + tokenSupplier.get();
}
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MAuthenticator.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MAuthenticator.java
new file mode 100644
index 000000000..837dfb20e
--- /dev/null
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MAuthenticator.java
@@ -0,0 +1,124 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+import static com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache.calculateCacheKey;
+import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
+
+@Slf4j
+public final class M2MAuthenticator {
+
+ public static final String KUBERNETES_TOKEN_ACQUISITION_ERROR = """
+ Error acquiring kubernetes token for m2m communication.
+ The current version of the security library expects a kubernetes token with the `netcracker` audience to be mounted in the deployment.
+ if you do not intend to use a kubernetes token at this time, please roll back to a previous version of the library.
+ otherwise, make sure that a kubernetes token with the `netcracker` audience is properly mounted.
+ the previous authentication method will be used as a fallback.""";
+ public static final String KUBERNETES_TOKEN_UNAUTHORIZED_ERROR = """
+ Unauthorized access (http 401).
+ During an m2m interaction attempt using a kubernetes token with the `netcracker` audience, a 401 error was received.
+ The possible cause is an outdated version of the security library on the server side.
+ The previous authentication method will be used as a fallback.""";
+
+ @FunctionalInterface
+ public interface HttpSender {
+ T send(URI url, String authHeader) throws IOException;
+ }
+
+ private final UrlCache urlCache;
+ private final Supplier fallbackAuthHeaderSupplier;
+ private final Supplier k8sAuthHeaderSupplier;
+ private final URI fallbackBaseUri;
+
+ public M2MAuthenticator(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier) {
+ this(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier, null);
+ }
+
+ public M2MAuthenticator(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, String fallbackBaseUrl) {
+ this.urlCache = urlCache;
+ this.fallbackAuthHeaderSupplier = fallbackAuthHeaderSupplier;
+ this.k8sAuthHeaderSupplier = k8sAuthHeaderSupplier;
+ this.fallbackBaseUri = (fallbackBaseUrl != null) ? URI.create(fallbackBaseUrl) : null;
+ }
+
+ public T execute(
+ URI requestUrl,
+ HttpSender sender,
+ Predicate isUnauthorized,
+ Predicate isSuccessful,
+ Consumer closeResponse) throws IOException {
+
+ final String cacheKey = calculateCacheKey(requestUrl);
+
+ if (!urlCache.containsKey(cacheKey)) {
+ try {
+ String k8sHeader = k8sAuthHeaderSupplier.get();
+ validateAuthHeader(k8sHeader);
+ T response = sender.send(requestUrl, k8sHeader);
+ if (!isUnauthorized.test(response)) {
+ return response;
+ }
+ closeResponse.accept(response);
+ return doFallback(requestUrl, sender, isSuccessful, KUBERNETES_TOKEN_UNAUTHORIZED_ERROR, cacheKey);
+ } catch (IllegalStateException | IllegalArgumentException ex) {
+ return doFallback(requestUrl, sender, isSuccessful, KUBERNETES_TOKEN_ACQUISITION_ERROR, cacheKey);
+ }
+ }
+
+ URI targetUrl = resolveTargetUrl(requestUrl);
+ String authHeader = fallbackAuthHeaderSupplier.get();
+ validateAuthHeader(authHeader);
+ return sender.send(targetUrl, authHeader);
+ }
+
+ private T doFallback(
+ URI requestUrl,
+ HttpSender sender,
+ Predicate isSuccessful,
+ String reason,
+ String cacheKey) throws IOException {
+
+ URI targetUrl = resolveTargetUrl(requestUrl);
+ String authHeader = fallbackAuthHeaderSupplier.get();
+ validateAuthHeader(authHeader);
+ T response = sender.send(targetUrl, authHeader);
+ if (isSuccessful.test(response)) {
+ urlCache.store(cacheKey);
+ log.warn("Failed to establish m2m connection to {}\n{}", targetUrl, reason);
+ }
+ return response;
+ }
+
+ private URI resolveTargetUrl(URI original) {
+ if (fallbackBaseUri == null) {
+ return original;
+ }
+ try {
+ return new URI(
+ fallbackBaseUri.getScheme(),
+ null,
+ fallbackBaseUri.getHost(),
+ fallbackBaseUri.getPort(),
+ original.getPath(),
+ original.getQuery(),
+ original.getFragment()
+ );
+ } catch (URISyntaxException e) {
+ throw new IllegalStateException("Failed to rebase URI: " + original, e);
+ }
+ }
+
+ private static void validateAuthHeader(String authHeader) {
+ if (StringUtils.isEmpty(authHeader)) {
+ throw new IllegalStateException("M2M auth header is empty.");
+ }
+ }
+}
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java
new file mode 100644
index 000000000..3fa8b9d70
--- /dev/null
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java
@@ -0,0 +1,138 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLParameters;
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.CookieHandler;
+import java.net.ProxySelector;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.time.Duration;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+
+public final class M2MHttpClient extends HttpClient {
+
+ private final HttpClient delegate;
+ private final M2MAuthenticator authenticator;
+
+ public M2MHttpClient(HttpClient delegate, M2MAuthenticator authenticator) {
+ this.delegate = delegate;
+ this.authenticator = authenticator;
+ }
+
+ @Override
+ public HttpResponse send(HttpRequest request, HttpResponse.BodyHandler responseBodyHandler)
+ throws IOException, InterruptedException {
+ try {
+ return authenticator.execute(
+ request.uri(),
+ (targetUrl, authHeader) -> sendWithDelegate(buildRequest(request, targetUrl, authHeader), responseBodyHandler),
+ response -> response.statusCode() == 401,
+ response -> response.statusCode() >= 200 && response.statusCode() < 300,
+ response -> { }
+ );
+ } catch (IOException e) {
+ if (e.getCause() instanceof InterruptedException ie) {
+ throw ie;
+ }
+ throw e;
+ }
+ }
+
+ private HttpResponse sendWithDelegate(HttpRequest request, HttpResponse.BodyHandler handler) throws IOException {
+ try {
+ return delegate.send(request, handler);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IOException("Interrupted during HTTP request", e);
+ }
+ }
+
+ @Override
+ public CompletableFuture> sendAsync(HttpRequest request, HttpResponse.BodyHandler responseBodyHandler) {
+ return CompletableFuture.supplyAsync(() -> {
+ try {
+ return send(request, responseBodyHandler);
+ } catch (IOException | InterruptedException e) {
+ if (e instanceof InterruptedException) {
+ Thread.currentThread().interrupt();
+ }
+ throw new RuntimeException(e);
+ }
+ }, executor().orElse(Runnable::run));
+ }
+
+ @Override
+ public CompletableFuture> sendAsync(HttpRequest request, HttpResponse.BodyHandler responseBodyHandler, HttpResponse.PushPromiseHandler pushPromiseHandler) {
+ return sendAsync(request, responseBodyHandler);
+ }
+
+ private static HttpRequest buildRequest(HttpRequest original, URI targetUrl, String authHeader) {
+ HttpRequest.Builder builder = HttpRequest.newBuilder()
+ .uri(targetUrl)
+ .method(original.method(), original.bodyPublisher().orElse(HttpRequest.BodyPublishers.noBody()));
+ original.headers().map().forEach((name, values) -> {
+ for (String value : values) {
+ builder.header(name, value);
+ }
+ });
+ builder.header("Authorization", authHeader);
+ original.timeout().ifPresent(builder::timeout);
+ return builder.build();
+ }
+
+ @Override
+ public Optional cookieHandler() {
+ return delegate.cookieHandler();
+ }
+
+ @Override
+ public Optional connectTimeout() {
+ return delegate.connectTimeout();
+ }
+
+ @Override
+ public Redirect followRedirects() {
+ return delegate.followRedirects();
+ }
+
+ @Override
+ public Optional proxy() {
+ return delegate.proxy();
+ }
+
+ @Override
+ public SSLContext sslContext() {
+ return delegate.sslContext();
+ }
+
+ @Override
+ public SSLParameters sslParameters() {
+ return delegate.sslParameters();
+ }
+
+ @Override
+ public Optional authenticator() {
+ return delegate.authenticator();
+ }
+
+ @Override
+ public Version version() {
+ return delegate.version();
+ }
+
+ @Override
+ public Optional executor() {
+ return delegate.executor();
+ }
+
+ @Override
+ public void close() {
+ delegate.close();
+ }
+}
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
index c9e33b661..c3b94c375 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
@@ -1,108 +1,44 @@
package com.netcracker.cloud.security.core.utils.k8s.impl;
-import lombok.extern.slf4j.Slf4j;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
-import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
+import java.net.URI;
import java.util.function.Supplier;
-import static com.netcracker.cloud.security.core.utils.k8s.impl.UrlCache.calculateCacheKey;
-import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
-
-@Slf4j
public final class M2MInterceptor implements Interceptor {
- public static final String KUBERNETES_TOKEN_ACQUISITION_ERROR = """
- Error acquiring kubernetes token for m2m communication.
- The current version of the security library expects a kubernetes token with the `netcracker` audience to be mounted in the deployment.
- if you do not intend to use a kubernetes token at this time, please roll back to a previous version of the library.
- otherwise, make sure that a kubernetes token with the `netcracker` audience is properly mounted.
- the previous authentication method will be used as a fallback.""";
- public static final String KUBERNETES_TOKEN_UNAUTHORIZED_ERROR = """
- Unauthorized access (http 401).
- During an m2m interaction attempt using a kubernetes token with the `netcracker` audience, a 401 error was received.
- The possible cause is an outdated version of the security library on the server side.
- The previous authentication method will be used as a fallback.""";
-
- private final UrlCache urlCache;
- private final Supplier fallbackAuthHeaderSupplier;
- private final Supplier k8sAuthHeaderSupplier;
- private final HttpUrl fallbackBaseUrl;
+ private final M2MAuthenticator authenticator;
public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier) {
- this(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier, null);
+ this.authenticator = new M2MAuthenticator(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier);
}
public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, String fallbackBaseUrl) {
- this.urlCache = urlCache;
- this.fallbackAuthHeaderSupplier = fallbackAuthHeaderSupplier;
- this.k8sAuthHeaderSupplier = k8sAuthHeaderSupplier;
- this.fallbackBaseUrl = (fallbackBaseUrl != null) ? HttpUrl.get(fallbackBaseUrl) : null;
+ this.authenticator = new M2MAuthenticator(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier, fallbackBaseUrl);
}
@NotNull
@Override
- public Response intercept(final Interceptor.Chain chain) throws IOException {
+ public Response intercept(final Chain chain) throws IOException {
final Request request = chain.request();
- final String cacheKey = calculateCacheKey(request.url().toString());
- if (!urlCache.containsKey(cacheKey)) {
- //first call (no information) / kubernetes token is applicable
- final Request altered;
- try {
- altered = buildRequest(request, k8sAuthHeaderSupplier.get(), false);
- } catch (IllegalStateException|IllegalArgumentException ex) {
- final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
- return doRequestFallback(fallbackRequest, KUBERNETES_TOKEN_ACQUISITION_ERROR, cacheKey, chain);
- }
- final Response response = chain.proceed(altered);
- if (response.code() == HTTP_UNAUTHORIZED) {
- //authentication failed, need to use old approach
- response.close();
- final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
- return doRequestFallback(fallbackRequest, KUBERNETES_TOKEN_UNAUTHORIZED_ERROR, cacheKey, chain);
- }
- return response;
- }
- final Request fallbackRequest = buildRequest(request, fallbackAuthHeaderSupplier.get(), true);
- return chain.proceed(fallbackRequest);
+ return authenticator.execute(
+ request.url().uri(),
+ (targetUrl, authHeader) -> chain.proceed(buildRequest(request, targetUrl, authHeader)),
+ response -> response.code() == 401,
+ Response::isSuccessful,
+ Response::close
+ );
}
- private Response doRequestFallback(final Request fallbackRequest,
- final String reason,
- final String cacheKey,
- final Interceptor.Chain chain) throws IOException {
- final Response fallbackResponse = chain.proceed(fallbackRequest);
- if (fallbackResponse.isSuccessful()) {
- urlCache.store(cacheKey);
- log.warn("Failed to establish m2m connection to {}\n{}", fallbackRequest.url(), reason);
- }
- return fallbackResponse;
- }
-
- private Request buildRequest(final Request initialRequest, final String authHeader, final boolean useFallbackUrl) {
- if (StringUtils.isEmpty(authHeader)) {
- throw new IllegalStateException("M2M auth header is empty.");
- }
- HttpUrl targetUrl = initialRequest.url();
- if(useFallbackUrl && fallbackBaseUrl != null) {
- targetUrl = rebaseUrl(initialRequest.url(), fallbackBaseUrl);
- }
- return initialRequest.newBuilder()
- .url(targetUrl)
- .header("Authorization", authHeader)
- .build();
- }
-
- private static HttpUrl rebaseUrl(final HttpUrl original, final HttpUrl base) {
+ private static Request buildRequest(Request original, URI targetUrl, String authHeader) {
return original.newBuilder()
- .scheme(base.scheme())
- .host(base.host())
- .port(base.port())
+ .url(HttpUrl.get(targetUrl))
+ .header("Authorization", authHeader)
.build();
}
}
diff --git a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java
new file mode 100644
index 000000000..e4282eb70
--- /dev/null
+++ b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java
@@ -0,0 +1,182 @@
+package com.netcracker.cloud.security.core.utils.k8s.impl;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.client.WireMock;
+import lombok.SneakyThrows;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.function.Supplier;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+class M2MHttpClientTest {
+ private static final String TEST_ENDPOINT = "/test/endpoint";
+ private static final int TEST_CACHE_SIZE = 10;
+ private static final long TEST_CACHE_DURATION_SEC = 60;
+
+ private WireMockServer wireMockServer;
+ private HttpClient client;
+
+ private Supplier fallbackSupplier;
+ private Supplier k8sSupplier;
+
+ private static final String K8S_TOKEN_HEADER = "Bearer k8s-test-token";
+ private static final String FALLBACK_TOKEN_HEADER = "Bearer fallback-test-token";
+
+ @BeforeEach
+ @SuppressWarnings("unchecked")
+ void beforeEach() {
+ wireMockServer = new WireMockServer(0);
+ wireMockServer.start();
+ WireMock.configureFor("localhost", wireMockServer.port());
+
+ UrlCache urlCache = new UrlCache(TEST_CACHE_SIZE, TEST_CACHE_DURATION_SEC);
+ fallbackSupplier = Mockito.mock(Supplier.class);
+ k8sSupplier = Mockito.mock(Supplier.class);
+
+ when(k8sSupplier.get()).thenReturn(K8S_TOKEN_HEADER);
+ when(fallbackSupplier.get()).thenReturn(FALLBACK_TOKEN_HEADER);
+
+ M2MAuthenticator authenticator = new M2MAuthenticator(urlCache, fallbackSupplier, k8sSupplier);
+ client = new M2MHttpClient(HttpClient.newHttpClient(), authenticator);
+ }
+
+ @AfterEach
+ void afterEach() {
+ wireMockServer.stop();
+ }
+
+ @Test
+ @SneakyThrows
+ void kubernetesTokenAuth_Success() {
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200).withBody("ok")));
+
+ HttpResponse response = client.send(buildRequest(), HttpResponse.BodyHandlers.ofString());
+
+ assertEquals(200, response.statusCode());
+ assertEquals("ok", response.body());
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)));
+ }
+
+ @Test
+ @SneakyThrows
+ void keycloakTokenAuth_UnauthorizedFallback() {
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(401)));
+
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200).withBody("fallback-ok")));
+
+ HttpResponse response = client.send(buildRequest(), HttpResponse.BodyHandlers.ofString());
+
+ assertEquals(200, response.statusCode());
+ assertEquals("fallback-ok", response.body());
+
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+
+ // Second call should go straight to fallback (cached)
+ HttpResponse response2 = client.send(buildRequest(), HttpResponse.BodyHandlers.ofString());
+ assertEquals(200, response2.statusCode());
+
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ verify(2, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+ }
+
+ @Test
+ @SneakyThrows
+ void kubernetesTokenAcquisitionError_Fallback() {
+ when(k8sSupplier.get()).thenThrow(new IllegalStateException("K8s failed"));
+
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200).withBody("fallback-ok")));
+
+ HttpResponse response = client.send(buildRequest(), HttpResponse.BodyHandlers.ofString());
+
+ assertEquals(200, response.statusCode());
+ verify(0, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT)).withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+ }
+
+ @Test
+ @SneakyThrows
+ void bothTokensEmpty_ThrowsException() {
+ when(k8sSupplier.get()).thenReturn("");
+ when(fallbackSupplier.get()).thenReturn("");
+
+ assertThrows(IllegalStateException.class, () -> client.send(buildRequest(), HttpResponse.BodyHandlers.ofString()));
+ }
+
+ @Test
+ @SneakyThrows
+ void fallbackUrl_RebasesHostWhenFallbackOccurs() {
+ WireMockServer fallbackServer = new WireMockServer(0);
+ fallbackServer.start();
+ WireMock.configureFor("localhost", fallbackServer.port());
+
+ fallbackServer.stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200).withBody("from-fallback-server")));
+
+ wireMockServer.stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(401)));
+
+ UrlCache urlCache = new UrlCache(TEST_CACHE_SIZE, TEST_CACHE_DURATION_SEC);
+ String fallbackBaseUrl = "http://localhost:" + fallbackServer.port();
+
+ M2MAuthenticator authenticator = new M2MAuthenticator(urlCache, fallbackSupplier, k8sSupplier, fallbackBaseUrl);
+ HttpClient clientWithFallback = new M2MHttpClient(HttpClient.newHttpClient(), authenticator);
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(wireMockServer.baseUrl() + TEST_ENDPOINT))
+ .GET()
+ .build();
+
+ HttpResponse response = clientWithFallback.send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertEquals(200, response.statusCode());
+ assertEquals("from-fallback-server", response.body());
+
+ wireMockServer.verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER)));
+ fallbackServer.verify(1, getRequestedFor(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(FALLBACK_TOKEN_HEADER)));
+
+ fallbackServer.stop();
+ }
+
+ @Test
+ @SneakyThrows
+ void sendAsync_Works() {
+ stubFor(get(urlEqualTo(TEST_ENDPOINT))
+ .withHeader("Authorization", equalTo(K8S_TOKEN_HEADER))
+ .willReturn(aResponse().withStatus(200).withBody("async-ok")));
+
+ HttpResponse response = client.sendAsync(buildRequest(), HttpResponse.BodyHandlers.ofString()).get();
+
+ assertEquals(200, response.statusCode());
+ assertEquals("async-ok", response.body());
+ }
+
+ private HttpRequest buildRequest() {
+ return HttpRequest.newBuilder()
+ .uri(URI.create(wireMockServer.baseUrl() + TEST_ENDPOINT))
+ .GET()
+ .build();
+ }
+}
From a270791c21808caee64911a2b611bdd232999e9e Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 11:42:06 +0500
Subject: [PATCH 07/71] chore: refactoring
---
.../config-server-loader-resttemplate/pom.xml | 5 +++++
...onfigServerConfigDataLocationResolver.java | 22 +++++++++----------
.../config-server-loader-webclient/pom.xml | 5 +++++
...onfigServerConfigDataLocationResolver.java | 15 +++++--------
4 files changed, 27 insertions(+), 20 deletions(-)
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
index ff4748195..58d858684 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/pom.xml
@@ -25,5 +25,10 @@
rest-security-adapters
${project.version}
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-SNAPSHOT
+
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
index 23b3d2ca9..db396b728 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
@@ -1,5 +1,6 @@
package com.netcracker.cloud.configserver.resttemplate;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
@@ -14,6 +15,7 @@
import org.springframework.boot.bootstrap.ConfigurableBootstrapContext;
import org.springframework.boot.logging.DeferredLogFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import java.util.Collections;
@@ -39,19 +41,17 @@ private RestTemplate createM2MRestTemplate() {
RestTemplate template = new RestTemplate();
SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(Timeout.ofMilliseconds(readTimeout)).build();
- final PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = PoolingHttpClientConnectionManagerBuilder.create()
- .setDefaultSocketConfig(socketConfig)
- .build();
- HttpClient httpClient = HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager).build();
-
- template.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
if (hasM2M(configurableBootstrapContext)) {
- template.setInterceptors(Collections.singletonList((request, body, execution) -> {
- request.getHeaders().setBearerAuth(getM2MToken(configurableBootstrapContext));
- return execution.execute(request, body);
- }));
- }
+ var client = M2MClientFactory.getM2mHttpClient(() -> getM2MToken(configurableBootstrapContext));
+ template.setRequestFactory(new JdkClientHttpRequestFactory(client));
+ } else {
+ final PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = PoolingHttpClientConnectionManagerBuilder.create()
+ .setDefaultSocketConfig(socketConfig)
+ .build();
+ HttpClient httpClient = HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager).build();
+ template.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
+ }
return template;
}
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml b/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
index 9a3efcdf6..460745cd7 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/pom.xml
@@ -25,5 +25,10 @@
rest-security-adapters
${project.version}
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-SNAPSHOT
+
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
index 9fa2e419b..e40a85a6a 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
@@ -4,12 +4,12 @@
import com.netcracker.cloud.restclient.MicroserviceRestClient;
import com.netcracker.cloud.restclient.webclient.MicroserviceWebClient;
import com.netcracker.cloud.security.core.auth.M2MManager;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import org.springframework.boot.bootstrap.ConfigurableBootstrapContext;
import org.springframework.boot.logging.DeferredLogFactory;
-import org.springframework.web.reactive.function.client.ClientRequest;
+import org.springframework.http.client.reactive.JdkClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
-
-import static org.springframework.http.HttpHeaders.AUTHORIZATION;
+import java.net.http.HttpClient;
public class WebClientConfigServerConfigDataLocationResolver extends AbstractCustomConfigServerConfigDataLocationResolver {
@@ -26,13 +26,10 @@ public MicroserviceRestClient getMicroserviceRestClient() {
}
private WebClient createM2MWebClient() {
- WebClient.Builder builder = WebClient.builder();
+ var builder = WebClient.builder();
if (hasM2M(configurableBootstrapContext)) {
- builder.filter(
- (request, next) ->
- next.exchange(ClientRequest.from(request).
- header(AUTHORIZATION, "Bearer " + getM2MToken(configurableBootstrapContext)).build())
- );
+ HttpClient client = M2MClientFactory.getM2mHttpClient(() -> getM2MToken(configurableBootstrapContext));
+ builder.clientConnector(new JdkClientHttpConnector(client));
}
return builder.build();
}
From f41f7a6e404f4b86fb7984aa08719eb8580eac41 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 11:42:24 +0500
Subject: [PATCH 08/71] chore: refactoring
---
.../com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
index 1880f4209..4447a3eec 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
@@ -28,6 +28,7 @@ public M2MDbaaSClient(DbaasClientConfig config) {
public DbaasClient build() {
String url = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
+ System.setProperty(M2MClientFactory.DBAAS_AGENT_URL_PROP, url);
OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue()).newBuilder()
.addInterceptor(chain -> {
Request original = chain.request();
From a34724915c4d355a09404723f247f765aa546a4d Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 11:43:07 +0500
Subject: [PATCH 09/71] chore: refactoring
---
.../cloud/security/core/utils/k8s/impl/M2MInterceptor.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
index c3b94c375..71ea39de0 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
@@ -8,6 +8,7 @@
import java.io.IOException;
import java.net.URI;
+import java.util.Objects;
import java.util.function.Supplier;
public final class M2MInterceptor implements Interceptor {
@@ -37,7 +38,7 @@ public Response intercept(final Chain chain) throws IOException {
private static Request buildRequest(Request original, URI targetUrl, String authHeader) {
return original.newBuilder()
- .url(HttpUrl.get(targetUrl))
+ .url(Objects.requireNonNull(HttpUrl.get(targetUrl)))
.header("Authorization", authHeader)
.build();
}
From 22fc313b7bd073826e47664e7c25db97baad5feb Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 12:29:38 +0500
Subject: [PATCH 10/71] chore: refactoring
---
maas-client/client/pom.xml | 5 +++++
.../maas/client/impl/MaaSAPIClientImpl.java | 6 +++---
.../cloud/maas/client/impl/http/HttpClient.java | 16 +++++++++++-----
.../impl/apiversion/ServerApiVersionTest.java | 4 +++-
.../impl/kafka/KafkaMaaSClientImplTest.java | 4 +++-
.../impl/kafka/KafkaWatchTenantTopicsTest.java | 13 +++++++++----
.../impl/rabbit/RabbitMaaSClientImplTest.java | 4 +++-
.../impl/TenantManagerConnectorImplTest.java | 4 ++--
8 files changed, 39 insertions(+), 17 deletions(-)
diff --git a/maas-client/client/pom.xml b/maas-client/client/pom.xml
index eb47db51b..bd0fcf469 100644
--- a/maas-client/client/pom.xml
+++ b/maas-client/client/pom.xml
@@ -59,6 +59,11 @@
slf4j-api
2.0.17
+
+ com.netcracker.cloud.security.core.utils
+ k8s-utils
+ 3.1.0-SNAPSHOT
+
diff --git a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java
index 49a66ad8e..e8717678b 100644
--- a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java
+++ b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java
@@ -20,14 +20,14 @@ public class MaaSAPIClientImpl implements MaaSAPIClient {
private final ApiUrlProvider apiProvider;
public MaaSAPIClientImpl(Supplier tokenSupplier) {
- this.restClient = new HttpClient(tokenSupplier);
+ this.restClient = HttpClient.getMaasClient(tokenSupplier);
this.serverApiVersion = new ServerApiVersion(restClient, Env.apiUrl());
- this.tenantManagerConnector = new Lazy<>(() -> new TenantManagerConnectorImpl(restClient));
+ this.tenantManagerConnector = new Lazy<>(() -> new TenantManagerConnectorImpl(HttpClient.getM2mClient(tokenSupplier)));
this.apiProvider = new ApiUrlProvider(serverApiVersion, Env.apiUrl());
}
public MaaSAPIClientImpl(Supplier tokenSupplier, TenantManagerConnector tenantManagerConnector, BlueGreenStatePublisher statePublisher) {
- this.restClient = new HttpClient(tokenSupplier);
+ this.restClient = HttpClient.getMaasClient(tokenSupplier);
this.serverApiVersion = new ServerApiVersion(restClient, Env.apiUrl());
this.tenantManagerConnector = new Lazy<>(() -> tenantManagerConnector);
this.apiProvider = new ApiUrlProvider(serverApiVersion, Env.apiUrl());
diff --git a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java
index a7b2f366d..c19152069 100644
--- a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java
+++ b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java
@@ -2,6 +2,7 @@
import com.netcracker.cloud.context.propagation.core.RequestContextPropagation;
import com.netcracker.cloud.maas.client.impl.Env;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import okhttp3.OkHttpClient;
import okhttp3.Request;
@@ -10,16 +11,21 @@
public class HttpClient {
private final OkHttpClient httpClient;
- public HttpClient(Supplier tokenSupplier) {
- this.httpClient = new OkHttpClient.Builder()
+ public static HttpClient getM2mClient(Supplier tokenSupplier) {
+ return new HttpClient(M2MClientFactory.getM2mOkHttpClient(tokenSupplier));
+ }
+
+ public static HttpClient getMaasClient(Supplier tokenSupplier) {
+ return new HttpClient(M2MClientFactory.getMaasOkHttpClient(tokenSupplier));
+ }
+
+ private HttpClient(OkHttpClient client) {
+ this.httpClient = client.newBuilder()
.addInterceptor(chain -> {
Request.Builder reqBuilder = chain.request().newBuilder();
// dump context
RequestContextPropagation.populateResponse((key, value) -> reqBuilder.header(key, String.valueOf(value)));
-
- // add authorization token
- reqBuilder.header("Authorization", Env.apiAuth() + " " + tokenSupplier.get());
Env.namespaceOpt().ifPresent(ns -> reqBuilder.header("X-Origin-Namespace", ns));
// process request
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/apiversion/ServerApiVersionTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/apiversion/ServerApiVersionTest.java
index fa0809339..9632c8636 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/apiversion/ServerApiVersionTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/apiversion/ServerApiVersionTest.java
@@ -2,6 +2,7 @@
import com.netcracker.cloud.maas.client.Utils;
import com.netcracker.cloud.maas.client.impl.http.HttpClient;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockserver.integration.ClientAndServer;
@@ -50,7 +51,8 @@ private ServerApiVersion setup(ClientAndServer mockServer, String version) {
.withBody(Utils.readResourceAsString("api-version." + version + ".json"))
);
- var httpClient = new HttpClient(() -> "faketoken");
+ System.setProperty(M2MClientFactory.MAAS_AGENT_URL_PROP, "http://localhost:" + mockServer.getPort());
+ var httpClient = HttpClient.getMaasClient(() -> "faketoken");
return new ServerApiVersion(httpClient, "http://localhost:" + mockServer.getPort());
}
}
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java
index f02a69d18..08912e15c 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java
@@ -17,6 +17,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -764,7 +765,8 @@ void testSearchTopic(ClientAndServer mockServer) {
}
private KafkaMaaSClientImpl createKafkaClient(String agentUrl) {
- var httpClient = new HttpClient(() -> "faketoken");
+ System.setProperty(M2MClientFactory.MAAS_AGENT_URL_PROP, agentUrl);
+ var httpClient = HttpClient.getMaasClient(() -> "faketoken");
var serverApiVersion = new ServerApiVersion(httpClient, agentUrl);
return new KafkaMaaSClientImpl(
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java
index 58af89501..adf5278bc 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java
@@ -5,6 +5,7 @@
import com.netcracker.cloud.maas.client.impl.Env;
import com.netcracker.cloud.maas.client.impl.apiversion.ServerApiVersion;
import com.netcracker.cloud.maas.client.impl.http.HttpClient;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import com.netcracker.cloud.tenantmanager.client.impl.TenantManagerConnectorImpl;
import com.netcracker.cloud.testharness.MaaSCocoonExtension;
import com.netcracker.cloud.testharness.TenantManagerMockInject;
@@ -50,8 +51,10 @@ public void resetMOckServer(ClientAndServer mockServer) {
@Test
public void testWatchEvents(ClientAndServer mockServer) throws Exception {
withProp(Env.PROP_NAMESPACE, "core-dev", () -> {
- HttpClient httpClient = new HttpClient(() -> "faketoken");
- var agentUrl = "http://localhost:" + mockServer.getPort();
+ var agentUrl = "http://localhost:" + mockServer.getPort();
+ System.setProperty(M2MClientFactory.MAAS_AGENT_URL_PROP, agentUrl);
+
+ HttpClient httpClient = HttpClient.getMaasClient(() -> "faketoken");
var serverApiVersion = new ServerApiVersion(httpClient, agentUrl);
KafkaMaaSClientImpl client = new KafkaMaaSClientImpl(
@@ -130,8 +133,10 @@ public void testWatchEvents(ClientAndServer mockServer) throws Exception {
@Test
public void testWatchEvents_ButTopicsNotFoundInMaaS(ClientAndServer mockServer) throws Exception {
withProp(Env.PROP_NAMESPACE, "core-dev", () -> {
- HttpClient httpClient = new HttpClient(() -> "faketoken");
- var agentUrl = "http://localhost:" + mockServer.getPort();
+ var agentUrl = "http://localhost:" + mockServer.getPort();
+ System.setProperty(M2MClientFactory.MAAS_AGENT_URL_PROP, agentUrl);
+
+ HttpClient httpClient = HttpClient.getMaasClient(() -> "faketoken");
KafkaMaaSClientImpl client = new KafkaMaaSClientImpl(
httpClient,
() -> new TenantManagerConnectorImpl(tmMock.getUrl(), httpClient),
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/rabbit/RabbitMaaSClientImplTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/rabbit/RabbitMaaSClientImplTest.java
index 6badea5fb..b495afb8c 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/rabbit/RabbitMaaSClientImplTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/rabbit/RabbitMaaSClientImplTest.java
@@ -7,6 +7,7 @@
import com.netcracker.cloud.maas.client.impl.Env;
import com.netcracker.cloud.maas.client.impl.apiversion.ServerApiVersion;
import com.netcracker.cloud.maas.client.impl.http.HttpClient;
+import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -217,7 +218,8 @@ public void testVersionedQueueName1() {
}
private RabbitMaaSClientImpl createRabbitClient(String agentUrl) {
- var httpClient = new HttpClient(() -> "faketoken");
+ System.setProperty(M2MClientFactory.MAAS_AGENT_URL_PROP, agentUrl);
+ var httpClient = HttpClient.getMaasClient(() -> "faketoken");
var serverApiVersion = new ServerApiVersion(httpClient, agentUrl);
return new RabbitMaaSClientImpl(httpClient, new ApiUrlProvider(serverApiVersion, agentUrl));
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/tenantmanager/client/impl/TenantManagerConnectorImplTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/tenantmanager/client/impl/TenantManagerConnectorImplTest.java
index dac2283d9..4596bf1c2 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/tenantmanager/client/impl/TenantManagerConnectorImplTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/tenantmanager/client/impl/TenantManagerConnectorImplTest.java
@@ -31,7 +31,7 @@ class TenantManagerConnectorImplTest {
@Test
public void testApi() throws Exception {
BlockingQueue> events = new LinkedBlockingDeque<>();
- try (TenantManagerConnectorImpl client = new TenantManagerConnectorImpl(tmMock.getUrl(), new HttpClient(() -> "faketoken"))) {
+ try (TenantManagerConnectorImpl client = new TenantManagerConnectorImpl(tmMock.getUrl(), HttpClient.getM2mClient(() -> "faketoken"))) {
client.subscribe(events::add);
List tenants = events.poll(1, TimeUnit.SECONDS);
assertNotNull(tenants);
@@ -66,7 +66,7 @@ public void testApi() throws Exception {
public void testReconnect() throws Exception {
withProp(Env.PROP_TENANT_MANAGER_RECONNECT_TIMEOUT, "1", () -> {
BlockingQueue> events = new LinkedBlockingDeque<>();
- try (TenantManagerConnectorImpl client = new TenantManagerConnectorImpl(tmMock.getUrl(), new HttpClient(() -> "faketoken"))) {
+ try (TenantManagerConnectorImpl client = new TenantManagerConnectorImpl(tmMock.getUrl(), HttpClient.getM2mClient(() -> "faketoken"))) {
client.subscribe(events::add);
List tenants = events.poll(1, TimeUnit.SECONDS);
From c87d188dbf52f0eb87f5d57cfc987c8f58182350 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Tue, 5 May 2026 12:59:54 +0500
Subject: [PATCH 11/71] chore: refactoring
---
.../maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java
index adf5278bc..6920aa8c1 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaWatchTenantTopicsTest.java
@@ -59,7 +59,7 @@ public void testWatchEvents(ClientAndServer mockServer) throws Exception {
KafkaMaaSClientImpl client = new KafkaMaaSClientImpl(
httpClient,
- () -> new TenantManagerConnectorImpl(tmMock.getUrl(), httpClient),
+ () -> new TenantManagerConnectorImpl(tmMock.getUrl(), HttpClient.getM2mClient(() -> "faketoken")),
new ApiUrlProvider(serverApiVersion, agentUrl));
BlockingQueue> events = new LinkedBlockingDeque<>();
@@ -139,7 +139,7 @@ public void testWatchEvents_ButTopicsNotFoundInMaaS(ClientAndServer mockServer)
HttpClient httpClient = HttpClient.getMaasClient(() -> "faketoken");
KafkaMaaSClientImpl client = new KafkaMaaSClientImpl(
httpClient,
- () -> new TenantManagerConnectorImpl(tmMock.getUrl(), httpClient),
+ () -> new TenantManagerConnectorImpl(tmMock.getUrl(), HttpClient.getM2mClient(() -> "faketoken")),
new ApiUrlProvider(new ServerApiVersion(httpClient, agentUrl), agentUrl));
BlockingQueue> events = new LinkedBlockingDeque<>();
From 4d4617ce79ec923606e9f2e81edd6e9881fdf069 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Wed, 6 May 2026 11:30:18 +0500
Subject: [PATCH 12/71] chore: refactoring
---
.../quarkus/client/config/MaasKafkaProdClientConfig.java | 4 ++--
.../spring/client/config/MaasKafkaProdClientConfig.java | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java b/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java
index 48b2d690c..fce4f4131 100644
--- a/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java
+++ b/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java
@@ -21,7 +21,7 @@ public class MaasKafkaProdClientConfig {
@Singleton
@Produces
KafkaMaaSClient kafkaMaaSClient(MaasKafkaProps props, M2MManager m2mManager) {
- HttpClient httpClient = new HttpClient(() -> m2mManager.getToken().getTokenValue());
+ HttpClient httpClient = HttpClient.getM2mClient(() -> m2mManager.getToken().getTokenValue());
return new KafkaMaaSClientImpl(
httpClient,
() -> new TenantManagerConnectorImpl(httpClient),
@@ -41,7 +41,7 @@ MaasKafkaTopicServiceProvider maasKafkaTopicServiceProvider(KafkaMaaSClient kafk
@Produces
@DefaultBean
InternalTenantService internalTenantService(M2MManager m2mManager) {
- HttpClient httpClient = new HttpClient(() -> m2mManager.getToken().getTokenValue());
+ HttpClient httpClient = HttpClient.getM2mClient(() -> m2mManager.getToken().getTokenValue());
TenantManagerConnectorImpl tenantManagerConnector = new TenantManagerConnectorImpl(httpClient);
return new InternalTenantServiceImpl(tenantManagerConnector);
}
diff --git a/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java b/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java
index 46d95d69c..7dae07738 100644
--- a/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java
+++ b/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java
@@ -29,12 +29,12 @@ public class MaasKafkaProdClientConfig {
@Bean
HttpClient maasHttpClient(@Autowired M2MManager m2MManager) {
- return new HttpClient(() -> m2MManager.getToken().getTokenValue());
+ return HttpClient.getMaasClient(() -> m2MManager.getToken().getTokenValue());
}
@Bean
- TenantManagerConnector tenantManagerConnector(HttpClient httpClient) {
- return new TenantManagerConnectorImpl(httpClient);
+ TenantManagerConnector tenantManagerConnector(@Autowired M2MManager m2MManager) {
+ return new TenantManagerConnectorImpl(HttpClient.getM2mClient(() -> m2MManager.getToken().getTokenValue()));
}
@Bean
From 6497c3c585e5fcd05b289d44d71ba4a193429fb0 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Wed, 6 May 2026 12:09:54 +0500
Subject: [PATCH 13/71] chore: refactoring
---
.../dbaas/common/config/M2MDbaaSClient.java | 16 ++++++++++------
...teConfigServerConfigDataLocationResolver.java | 2 --
.../core/utils/k8s/impl/M2MHttpClient.java | 11 ++++++-----
.../core/utils/k8s/impl/M2MHttpClientTest.java | 4 +++-
.../core/utils/k8s/impl/M2MInterceptorTest.java | 5 ++---
5 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
index 4447a3eec..86b59b3e0 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
@@ -1,15 +1,15 @@
package com.netcracker.cloud.dbaas.common.config;
-import jakarta.enterprise.context.ApplicationScoped;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
import com.netcracker.cloud.context.propagation.core.ContextManager;
import com.netcracker.cloud.dbaas.client.DbaaSClientOkHttpImpl;
import com.netcracker.cloud.dbaas.client.DbaasClient;
import com.netcracker.cloud.framework.contexts.tenant.TenantContextObject;
import com.netcracker.cloud.quarkus.security.auth.M2MManager;
-import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
+import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
+import jakarta.enterprise.context.ApplicationScoped;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
import java.util.Optional;
@@ -18,9 +18,9 @@
@ApplicationScoped
public class M2MDbaaSClient {
- private DbaasClientConfig config;
private static final int MAX_RETRIES = 3;
private static final long INITIAL_RETRY_DELAY = 500;
+ private final DbaasClientConfig config;
public M2MDbaaSClient(DbaasClientConfig config) {
this.config = config;
@@ -28,8 +28,12 @@ public M2MDbaaSClient(DbaasClientConfig config) {
public DbaasClient build() {
String url = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
+
System.setProperty(M2MClientFactory.DBAAS_AGENT_URL_PROP, url);
- OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue()).newBuilder()
+ OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue());
+ System.clearProperty(M2MClientFactory.DBAAS_AGENT_URL_PROP);
+
+ httpClient = httpClient.newBuilder()
.addInterceptor(chain -> {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder();
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
index db396b728..42dc38423 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
@@ -18,8 +18,6 @@
import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
-import java.util.Collections;
-
public class RestTemplateConfigServerConfigDataLocationResolver extends AbstractCustomConfigServerConfigDataLocationResolver {
@Value("${connection.readTimeout:60000}")
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java
index 3fa8b9d70..b1615acce 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClient.java
@@ -3,6 +3,7 @@
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import java.io.IOException;
+import java.io.UncheckedIOException;
import java.net.Authenticator;
import java.net.CookieHandler;
import java.net.ProxySelector;
@@ -58,11 +59,11 @@ public CompletableFuture> sendAsync(HttpRequest request, Htt
return CompletableFuture.supplyAsync(() -> {
try {
return send(request, responseBodyHandler);
- } catch (IOException | InterruptedException e) {
- if (e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- throw new RuntimeException(e);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException("Request was interrupted", e);
+ } catch (IOException e) {
+ throw new UncheckedIOException("IO error during request execution", e);
}
}, executor().orElse(Runnable::run));
}
diff --git a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java
index e4282eb70..5505ffb48 100644
--- a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java
+++ b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MHttpClientTest.java
@@ -118,7 +118,9 @@ void bothTokensEmpty_ThrowsException() {
when(k8sSupplier.get()).thenReturn("");
when(fallbackSupplier.get()).thenReturn("");
- assertThrows(IllegalStateException.class, () -> client.send(buildRequest(), HttpResponse.BodyHandlers.ofString()));
+ var req = buildRequest();
+ var respHandler = HttpResponse.BodyHandlers.ofString();
+ assertThrows(IllegalStateException.class, () -> client.send(req, respHandler));
}
@Test
diff --git a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java
index 3b7f1d5d9..8c52472a3 100644
--- a/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java
+++ b/core-utils/k8s/src/test/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptorTest.java
@@ -128,9 +128,8 @@ void bothTokensEmpty_ThrowsException() {
when(k8sSupplier.get()).thenReturn("");
when(fallbackSupplier.get()).thenReturn("");
- assertThrows(IllegalStateException.class, () -> {
- client.newCall(buildRequest()).execute();
- });
+ var call = client.newCall(buildRequest());
+ assertThrows(IllegalStateException.class, call::execute);
}
private Request buildRequest() {
From 5173dbe284b566037a7ca077fca526974ec66916 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Fri, 8 May 2026 17:24:20 +0500
Subject: [PATCH 14/71] chore: refactoring
---
.../cloud/dbaas/common/config/M2MDbaaSClient.java | 7 ++++---
.../cloud/dbaas/common/config/M2MDbaaSClientTest.java | 5 +++--
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
index 86b59b3e0..961c82710 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
@@ -27,9 +27,10 @@ public M2MDbaaSClient(DbaasClientConfig config) {
}
public DbaasClient build() {
- String url = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
+ String dbaasUrl = config.dbaasUrl().get();
+ String dbaasAgentUrl = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
- System.setProperty(M2MClientFactory.DBAAS_AGENT_URL_PROP, url);
+ System.setProperty(M2MClientFactory.DBAAS_AGENT_URL_PROP, dbaasAgentUrl);
OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue());
System.clearProperty(M2MClientFactory.DBAAS_AGENT_URL_PROP);
@@ -46,6 +47,6 @@ public DbaasClient build() {
.addInterceptor(new RetryInterceptor(MAX_RETRIES, INITIAL_RETRY_DELAY))
.sslSocketFactory(TlsUtils.getSslContext().getSocketFactory(), TlsUtils.getTrustManager())
.build();
- return new DbaaSClientOkHttpImpl(url, httpClient);
+ return new DbaaSClientOkHttpImpl(dbaasUrl, httpClient);
}
}
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
index 4ac107d0a..7f727ea27 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
@@ -16,10 +16,13 @@
class M2MDbaaSClientTest {
private M2MDbaaSClient m2MDbaaSClient;
private static final String DB_AGENT_URL = "http://dbaas-agent:8080";
+ private static final String DB_AGGREGATOR_URL = "http://dbaas-aggregator:8080";
+
@BeforeEach
void setUp() {
DbaasClientConfig config = mock(DbaasClientConfig.class);
when(config.dbaasAgentUrl()).thenReturn(Optional.of(DB_AGENT_URL));
+ when(config.dbaasUrl()).thenReturn(Optional.of(DB_AGGREGATOR_URL));
m2MDbaaSClient = new M2MDbaaSClient(config);
}
@Test
@@ -32,5 +35,3 @@ void testBuild() throws NoSuchFieldException, IllegalAccessException {
assertEquals(3, clientValue.interceptors().size());
}
}
-
-
From 5aba50bfeee1af3a0a156d3c25bccdb72457eb70 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Fri, 8 May 2026 17:53:35 +0500
Subject: [PATCH 15/71] chore: refactoring
---
.../cloud/dbaas/client/DbaasClientImpl.java | 26 +++++++++----------
.../config/DbaasClientConfiguration.java | 3 +--
.../config/SpringDbaasApiProperties.java | 9 +------
.../dbaas/client/DbaasClientRetryTest.java | 2 ++
.../src/test/resources/application.yml | 6 ++++-
5 files changed, 22 insertions(+), 24 deletions(-)
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/DbaasClientImpl.java b/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/DbaasClientImpl.java
index cb04b224e..9fb12349c 100644
--- a/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/DbaasClientImpl.java
+++ b/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/DbaasClientImpl.java
@@ -38,21 +38,21 @@ public class DbaasClientImpl implements DbaasClient {
private final MicroserviceRestClient dbaasRestClient;
private final RetryTemplate retryTemplate;
private final RetryTemplate awaitAsyncDbCreationRetryTemplate;
- private final String dbaasAgentHost;
+ private final String dbaasHost;
private final ClassifierChecker classifierChecker;
private static final String RECEIVED_RESPONSE = "Received response {}";
- public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, String dbaasAgentHost) {
- this(dbaasRestClient, null, dbaasAgentHost);
+ public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, String dbaasHost) {
+ this(dbaasRestClient, null, dbaasHost);
}
- public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, RetryTemplate retryTemplate, String dbaasAgentHost) {
- this(dbaasRestClient, retryTemplate, null, dbaasAgentHost);
+ public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, RetryTemplate retryTemplate, String dbaasHost) {
+ this(dbaasRestClient, retryTemplate, null, dbaasHost);
}
- public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, RetryTemplate retryTemplate, RetryTemplate awaitAsyncDbCreationRetryTemplate, String dbaasAgentHost) {
+ public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, RetryTemplate retryTemplate, RetryTemplate awaitAsyncDbCreationRetryTemplate, String dbaasHost) {
Objects.requireNonNull(dbaasRestClient);
- Objects.requireNonNull(dbaasAgentHost);
+ Objects.requireNonNull(dbaasHost);
if (retryTemplate == null) {
retryTemplate = getDefaultRetryTemplate();
}
@@ -61,7 +61,7 @@ public DbaasClientImpl(MicroserviceRestClient dbaasRestClient, RetryTemplate ret
}
this.dbaasRestClient = dbaasRestClient;
this.retryTemplate = retryTemplate;
- this.dbaasAgentHost = dbaasAgentHost;
+ this.dbaasHost = dbaasHost;
this.awaitAsyncDbCreationRetryTemplate = awaitAsyncDbCreationRetryTemplate;
classifierChecker = new ClassifierChecker();
}
@@ -88,7 +88,7 @@ private void rethrowException(MicroserviceRestClientException restException, Str
@Nullable
public PhysicalDatabases getPhysicalDatabases(String type)
throws DbaasException, DbaasUnavailableException {
- URI uri = new UriTemplate(dbaasAgentHost + GET_PHYSICAL_DATABASES_TEMPLATE_ENDPOINT).expand(type);
+ URI uri = new UriTemplate(dbaasHost + GET_PHYSICAL_DATABASES_TEMPLATE_ENDPOINT).expand(type);
try {
return this.retryTemplate.execute(
context -> getPhysicalDatabaseExecuteRequest(uri));
@@ -117,7 +117,7 @@ public > D getOrCreateDatabase(DatabaseType databaseClass = type.getDatabaseClass();
try {
- URI uri = new UriTemplate(dbaasAgentHost + ASYNC_CREATE_DATABASE_TEMPLATE_ENDPOINT).expand(namespace);
+ URI uri = new UriTemplate(dbaasHost + ASYNC_CREATE_DATABASE_TEMPLATE_ENDPOINT).expand(namespace);
String uriString = uri.toString();
return this.retryTemplate.execute(
context -> executeCreateDbRequest(uriString, dbCreateRequest, databaseClass)
@@ -161,7 +161,7 @@ public > D getDatabase(final DatabaseType
HashMap params = new HashMap<>();
params.put(NAMESPACE, namespace);
params.put("type", type.getName());
- URI uri = new UriTemplate(dbaasAgentHost + GET_CONNECTION_TEMPLATE_ENDPOINT).expand(params);
+ URI uri = new UriTemplate(dbaasHost + GET_CONNECTION_TEMPLATE_ENDPOINT).expand(params);
try {
return this.retryTemplate.execute(
context -> executeGetDatabaseRequest(uri, classifier, userRole, databaseClass)
@@ -203,7 +203,7 @@ private > D executeGetDatabaseRequest(URI uri,
public boolean isAvailable() {
try {
- URI isAvailableUri = URI.create(dbaasAgentHost + HEALTH_ENDPOINT);
+ URI isAvailableUri = URI.create(dbaasHost + HEALTH_ENDPOINT);
log.debug("Sending isAvailable request to URI: {}", isAvailableUri);
RestClientResponseEntity
*/
@Deprecated(forRemoval = true)
-public interface MicroserviceMutexService {
+public interface MicroserviceMutexService extends AutoCloseable {
/**
* Try to acquire Microservice lock within specified timeout with particular reason.
diff --git a/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java b/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java
index b2e62db9e..8a39d45d8 100644
--- a/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java
+++ b/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java
@@ -32,7 +32,7 @@
@Slf4j
@Deprecated(forRemoval = true)
-public class ConsulMicroserviceMutexService implements MicroserviceMutexService, AutoCloseable {
+public class ConsulMicroserviceMutexService implements MicroserviceMutexService {
public static final String MS_MUTEX_CONSUL_PATH_TEMPLATE = "config/%s/%s/bluegreen/mutex/%s/%s"; //config/{namespace}/{microservice}/bluegreen/mutex/{name}/{pod}
public static final Duration DEFAULT_TTL = Duration.ofMinutes(1);
public static final Duration MIN_TTL = Duration.ofSeconds(10);
diff --git a/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/InMemoryMicroserviceMutexService.java b/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/InMemoryMicroserviceMutexService.java
index 008e2a5f7..652e97bb8 100644
--- a/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/InMemoryMicroserviceMutexService.java
+++ b/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/InMemoryMicroserviceMutexService.java
@@ -23,6 +23,11 @@ public boolean isLocked(String name) throws LockFailedException {
throw unsupported();
}
+ @Override
+ public void close() {
+ throw unsupported();
+ }
+
private UnsupportedOperationException unsupported() {
return new UnsupportedOperationException("not implemented yet");
}
From fc6c03e93909fbb44aee5d53a8c8e7c16bc0112d Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 14:14:14 +0500
Subject: [PATCH 63/71] chore: refactoring
---
.../maas/client/impl/kafka/KafkaMaaSClientImplTest.java | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java
index 0f0dbe09f..21e596b7e 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/kafka/KafkaMaaSClientImplTest.java
@@ -754,8 +754,10 @@ void testSearchTopic(ClientAndServer mockServer) {
""")
);
- var client = createKafkaClient("http://localhost:" + mockServer.getPort());
- var result = client.search(SearchCriteria.builder().topic("abc").build());
+ java.util.List result;
+ try (var client = createKafkaClient("http://localhost:" + mockServer.getPort())) {
+ result = client.search(SearchCriteria.builder().topic("abc").build());
+ }
assertEquals(1, result.size());
}
@@ -769,7 +771,7 @@ void testClose(ClientAndServer mockServer) {
client.watchTopicCreate("orders", addr -> {});
client.close();
- assertDoesNotThrow(() -> client.close());
+ assertDoesNotThrow(client::close);
});
});
}
From 891743a6aac1960a374a4254cc425e07afe32ac6 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 14:17:11 +0500
Subject: [PATCH 64/71] chore: refactoring
---
.../impl/service/ConsulMicroserviceMutexService.java | 5 +----
.../restclient/okhttp/MicroserviceOkHttpRestClient.java | 2 +-
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java b/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java
index 8a39d45d8..a1a81de28 100644
--- a/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java
+++ b/core-blue-green-state-monitor/blue-green-state-monitor-java/src/main/java/com/netcracker/cloud/bluegreen/impl/service/ConsulMicroserviceMutexService.java
@@ -316,10 +316,7 @@ public SessionContext(HttpClientAdapter client, String consulUrl, String session
this.name = name;
this.pod = pod;
this.cancelled = new AtomicBoolean(false);
- this.executorService = Executors.newScheduledThreadPool(1, r -> {
- Thread t = new Thread(r, String.format("ms-lock-renewer-%s", name));
- return t;
- });
+ this.executorService = Executors.newScheduledThreadPool(1, r -> new Thread(r, String.format("ms-lock-renewer-%s", name)));
Runnable renewSession = () -> {
try {
Duration ttl = this.renewSession();
diff --git a/core-restclient/microservice-restclient-okhttp/src/main/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClient.java b/core-restclient/microservice-restclient-okhttp/src/main/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClient.java
index 1275f0a76..ba355ffc7 100644
--- a/core-restclient/microservice-restclient-okhttp/src/main/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClient.java
+++ b/core-restclient/microservice-restclient-okhttp/src/main/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClient.java
@@ -26,7 +26,7 @@
@Slf4j
public class MicroserviceOkHttpRestClient extends AbstractMicroserviceRestClient {
- private final String contentTypeHeader = "Content-Type";
+ private static final String contentTypeHeader = "Content-Type";
private final OkHttpClient client;
@Getter
From e6ce3575401f3518524e1dadf95d46df85e5168f Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 16:32:34 +0500
Subject: [PATCH 65/71] chore: refactoring
---
.../routes-registrator/pom.xml | 1 +
.../routes-registrator/runtime/pom.xml | 6 ++
.../route/RouteRegistrationConfigTest.java | 33 ++++++++---
...gServerConfigDataLocationResolverTest.java | 13 +++++
.../src/test/resources/application.yaml | 6 +-
.../maas/spring/MaaSClientConfigTest.java | 57 +++++++++++++++++++
6 files changed, 107 insertions(+), 9 deletions(-)
create mode 100644 maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java
diff --git a/core-quarkus-extensions/routes-registrator/pom.xml b/core-quarkus-extensions/routes-registrator/pom.xml
index b3055f930..20c820130 100644
--- a/core-quarkus-extensions/routes-registrator/pom.xml
+++ b/core-quarkus-extensions/routes-registrator/pom.xml
@@ -13,6 +13,7 @@
routes-registrator-parent
+ 5.2.0
${project.basedir}/../../report-aggregate/target/site/jacoco-aggregate/jacoco.xml
diff --git a/core-quarkus-extensions/routes-registrator/runtime/pom.xml b/core-quarkus-extensions/routes-registrator/runtime/pom.xml
index 85c7995df..190adb7b4 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/pom.xml
+++ b/core-quarkus-extensions/routes-registrator/runtime/pom.xml
@@ -56,6 +56,12 @@
quarkus-junit
test
+
+ org.mockito
+ mockito-inline
+ ${mockito-inline.version}
+ test
+
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java b/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
index 3dfc1987c..2fce3609c 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
@@ -20,10 +20,14 @@
@QuarkusTest
+@TestProfile(RouteRegistrationConfigTest.K8sEnabledProfile.class)
class RouteRegistrationConfigTest {
private static final String ANOTHER_CONTROL_PLANE_HTTP_CLIENT = "anotherControlPlaneHttpClient";
+ @Inject
+ RouteRegistrationConfig config;
+
@Inject
@Named(ANOTHER_CONTROL_PLANE_HTTP_CLIENT)
OkHttpClient anotherControlPlaneHttpClient;
@@ -57,6 +61,26 @@ void testPostRoutesEnabled_whenMeshTypeIsCore_andRegistrationEnabled() {
Assertions.assertTrue(routesRestRegistrationProcessor.isPostRoutesEnabled());
}
+ @Test
+ void testM2mOkHttpClient_isCalledWithK8sEnabledTrue() {
+ try (var mockedFactory = org.mockito.Mockito.mockStatic(com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory.class)) {
+ mockedFactory.when(() -> com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory.getM2mOkHttpClient(org.mockito.ArgumentMatchers.any(), org.mockito.ArgumentMatchers.eq(true)))
+ .thenReturn(new OkHttpClient.Builder().build());
+
+ // Trigger the producer method
+ config.controlPlaneHttpClient();
+
+ mockedFactory.verify(() -> com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory.getM2mOkHttpClient(org.mockito.ArgumentMatchers.any(), org.mockito.ArgumentMatchers.eq(true)));
+ }
+ }
+
+ public static class K8sEnabledProfile implements QuarkusTestProfile {
+ @Override
+ public Map getConfigOverrides() {
+ return Map.of("security.m2m.kubernetes.enabled", "true");
+ }
+ }
+
// idk why, but in QuarkusTest we cannot declare bean via producer method and inject it in that class
// (it says that circular dependencies created)
@ApplicationScoped
@@ -67,12 +91,5 @@ OkHttpClient testControlPlaneHttpClient() {
return new OkHttpClient.Builder().build();
}
}
-
-
-
-
-
-
-
-
}
+
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
index 21448ab82..35fd42736 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
@@ -81,4 +81,17 @@ void checkConfigServerDataResource(){
!configServerConfigDataResource.getProperties().isFailFast());
}
+ @Test
+ void checkK8sEnabledPropertyBinding() throws Exception {
+ environment.setProperty("security.m2m.kubernetes.enabled", "true");
+ Profiles profiles = mock(Profiles.class);
+
+ abstractConfigDataLocationResolver.resolveProfileSpecific(context, ConfigDataLocation.of("optional:configserver:http://config-server:8080"), profiles);
+
+ java.lang.reflect.Field field = AbstractCustomConfigServerConfigDataLocationResolver.class.getDeclaredField("k8sEnabled");
+ field.setAccessible(true);
+ boolean k8sEnabled = (boolean) field.get(abstractConfigDataLocationResolver);
+
+ assertThat(k8sEnabled).isTrue();
+ }
}
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/resources/application.yaml b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/resources/application.yaml
index add956a7b..ba77e708c 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/resources/application.yaml
+++ b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/resources/application.yaml
@@ -1,3 +1,7 @@
cloud:
microservice:
- name: "my-test-app"
\ No newline at end of file
+ name: "my-test-app"
+security:
+ m2m:
+ kubernetes:
+ enabled: true
\ No newline at end of file
diff --git a/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java b/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java
new file mode 100644
index 000000000..49ab2b8b6
--- /dev/null
+++ b/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java
@@ -0,0 +1,57 @@
+package com.netcracker.cloud.maas.spring;
+
+import com.netcracker.cloud.maas.client.api.MaaSAPIClient;
+import com.netcracker.cloud.maas.client.impl.MaaSAPIClientImpl;
+import com.netcracker.cloud.security.core.auth.M2MManager;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockConstruction;
+
+class MaaSClientConfigTest {
+
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(MaaSClientConfig.class, MockM2MManagerConfig.class));
+
+ @Test
+ void shouldPassTrueToClientConstructor() {
+ try (MockedConstruction mocked = mockConstruction(MaaSAPIClientImpl.class,
+ (mock, context) -> {
+ assertThat(context.arguments().get(1)).isEqualTo(true);
+ })) {
+ contextRunner.withPropertyValues("security.m2m.kubernetes.enabled=true")
+ .run(context -> {
+ assertThat(context).hasSingleBean(MaaSAPIClient.class);
+ assertThat(mocked.constructed()).hasSize(1);
+ });
+ }
+ }
+
+ @Test
+ void shouldPassFalseToClientConstructor() {
+ try (MockedConstruction mocked = mockConstruction(MaaSAPIClientImpl.class,
+ (mock, context) -> {
+ assertThat(context.arguments().get(1)).isEqualTo(false);
+ })) {
+ contextRunner.withPropertyValues("security.m2m.kubernetes.enabled=false")
+ .run(context -> {
+ assertThat(context).hasSingleBean(MaaSAPIClient.class);
+ assertThat(mocked.constructed()).hasSize(1);
+ });
+ }
+ }
+
+ @Configuration
+ static class MockM2MManagerConfig {
+ @Bean
+ M2MManager m2MManager() {
+ return mock(M2MManager.class);
+ }
+ }
+}
From 80892b400855ae0e689948bc0645d202ec43e1e3 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 17:06:49 +0500
Subject: [PATCH 66/71] chore: refactoring
---
.../MicroserviceOkHttpRestClientTest.java | 66 +++++++++++++------
1 file changed, 45 insertions(+), 21 deletions(-)
diff --git a/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java b/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
index 44898d871..0b706e7b4 100644
--- a/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
+++ b/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
@@ -12,6 +12,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@@ -36,32 +37,55 @@ void testDefaultRequestHeaders() throws InterruptedException {
}
@Test
- void testTMFRestClientResponseException() throws Exception {
- TmfErrorResponse tmfErrorResponse = TmfErrorResponse.builder()
- .id(UUID.randomUUID().toString())
- .code("TEST")
- .reason("test reason")
- .detail("test detail")
- .status("500")
- .type(TmfErrorResponse.TYPE_V1_0)
- .build();
+ void testRequestBodies() throws Exception {
+ // String body
+ mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
+ restClient.doRequest(testUrl, HttpMethod.POST, null, "test-string", Void.class);
+ RecordedRequest req1 = mockBackEnd.takeRequest();
+ assertNotNull(req1);
+ }
+
+ @Test
+ void testMapResponseBody() throws Exception {
+ // Void
+ mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
+ assertNull(restClient.doRequest(testUrl, HttpMethod.GET, null, null, Void.class).getResponseBody());
- mockBackEnd.enqueue(new MockResponse()
- .setHeader("test-header", "test-value")
- .setResponseCode(500)
- .setBody(new ObjectMapper().writeValueAsString(tmfErrorResponse)));
+ // String
+ mockBackEnd.enqueue(new MockResponse().setResponseCode(200).setBody("hello"));
+ assertEquals("hello", restClient.doRequest(testUrl, HttpMethod.GET, null, null, String.class).getResponseBody());
+
+ // byte[]
+ mockBackEnd.enqueue(new MockResponse().setResponseCode(200).setBody("bytes"));
+ assertArrayEquals("bytes".getBytes(), restClient.doRequest(testUrl, HttpMethod.GET, null, null, byte[].class).getResponseBody());
+ }
+ @Test
+ void testSerializationFailure() {
+ mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
+ // Using an object that cannot be serialized by the default mapper
+ Object unserializable = new Object() {
+ @Override
+ public String toString() {
+ throw new RuntimeException("fail");
+ }
+ };
+ // The default mapper might just use toString() or fail if it's a complex object.
+ // Actually, for serialization, if it's not a primitive, Jackson will try to serialize.
+ // Let's use a class that causes an IOException.
+ assertThrows(Exception.class, () -> {
+ restClient.doRequest(testUrl, HttpMethod.POST, null, new Object(), Void.class);
+ });
+ }
+
+ @Test
+ void testParseError() throws Exception {
+ mockBackEnd.enqueue(new MockResponse().setResponseCode(500).setBody("invalid-json"));
try {
- restClient.doRequest(testUrl, HttpMethod.POST, null, null, Void.class);
- fail("Expected MicroserviceRestClientResponseException");
+ restClient.doRequest(testUrl, HttpMethod.GET, null, null, String.class);
} catch (MicroserviceRestClientResponseException e) {
assertEquals(500, e.getHttpStatus());
- assertEquals("test-value", e.getResponseHeaders().get("test-header").get(0));
- assertTrue(e.getCause() instanceof RemoteCodeException);
- RemoteCodeException remoteCodeException = (RemoteCodeException) e.getCause();
- assertEquals(tmfErrorResponse.getCode(), remoteCodeException.getErrorCode().getCode());
- } finally {
- mockBackEnd.takeRequest(60, TimeUnit.SECONDS);
+ assertTrue(e.getCause() instanceof Exception);
}
}
}
From ddaf27cbb0eb525a0363126de36ffad70566f989 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 17:39:09 +0500
Subject: [PATCH 67/71] chore: refactoring
---
.../MicroserviceOkHttpRestClientTest.java | 8 -----
.../dbaas-client-core/pom.xml | 10 ++++++
.../config/SpringDbaasApiPropertiesTest.java | 32 +++++++++++++++++++
.../client/impl/MaaSAPIClientImplTest.java | 9 ++++--
4 files changed, 48 insertions(+), 11 deletions(-)
create mode 100644 dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java
diff --git a/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java b/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
index 0b706e7b4..278c74bf2 100644
--- a/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
+++ b/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
@@ -38,7 +38,6 @@ void testDefaultRequestHeaders() throws InterruptedException {
@Test
void testRequestBodies() throws Exception {
- // String body
mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
restClient.doRequest(testUrl, HttpMethod.POST, null, "test-string", Void.class);
RecordedRequest req1 = mockBackEnd.takeRequest();
@@ -47,15 +46,12 @@ void testRequestBodies() throws Exception {
@Test
void testMapResponseBody() throws Exception {
- // Void
mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
assertNull(restClient.doRequest(testUrl, HttpMethod.GET, null, null, Void.class).getResponseBody());
- // String
mockBackEnd.enqueue(new MockResponse().setResponseCode(200).setBody("hello"));
assertEquals("hello", restClient.doRequest(testUrl, HttpMethod.GET, null, null, String.class).getResponseBody());
- // byte[]
mockBackEnd.enqueue(new MockResponse().setResponseCode(200).setBody("bytes"));
assertArrayEquals("bytes".getBytes(), restClient.doRequest(testUrl, HttpMethod.GET, null, null, byte[].class).getResponseBody());
}
@@ -63,16 +59,12 @@ void testMapResponseBody() throws Exception {
@Test
void testSerializationFailure() {
mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
- // Using an object that cannot be serialized by the default mapper
Object unserializable = new Object() {
@Override
public String toString() {
throw new RuntimeException("fail");
}
};
- // The default mapper might just use toString() or fail if it's a complex object.
- // Actually, for serialization, if it's not a primitive, Jackson will try to serialize.
- // Let's use a class that causes an IOException.
assertThrows(Exception.class, () -> {
restClient.doRequest(testUrl, HttpMethod.POST, null, new Object(), Void.class);
});
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-core/pom.xml b/dbaas-client/dbaas-client-java/dbaas-client-core/pom.xml
index 48d7840d5..79a073265 100644
--- a/dbaas-client/dbaas-client-java/dbaas-client-core/pom.xml
+++ b/dbaas-client/dbaas-client-java/dbaas-client-core/pom.xml
@@ -11,6 +11,16 @@
dbaas-client-core
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+ org.springframework
+ spring-test
+ test
+
${project.groupId}
framework-contexts
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java b/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java
new file mode 100644
index 000000000..9509415c2
--- /dev/null
+++ b/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java
@@ -0,0 +1,32 @@
+package com.netcracker.cloud.dbaas.client.config;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class SpringDbaasApiPropertiesTest {
+
+ @Test
+ void testGetAddress() {
+ SpringDbaasApiProperties properties = new SpringDbaasApiProperties();
+
+ // Test non-k8s path
+ ReflectionTestUtils.setField(properties, "k8sEnabled", false);
+ ReflectionTestUtils.setField(properties, "dbaasAgentAddress", Optional.of("http://custom"));
+ assertEquals("http://custom", properties.getAddress());
+
+ ReflectionTestUtils.setField(properties, "dbaasAgentAddress", Optional.empty());
+ assertEquals("http://dbaas-agent:8080", properties.getAddress());
+
+ // Test k8s path
+ ReflectionTestUtils.setField(properties, "k8sEnabled", true);
+ ReflectionTestUtils.setField(properties, "dbaasAddress", Optional.of("http://k8s-url"));
+ assertEquals("http://k8s-url", properties.getAddress());
+
+ ReflectionTestUtils.setField(properties, "dbaasAddress", Optional.empty());
+ assertEquals("http://dbaas-agent:8080", properties.getAddress());
+ }
+}
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImplTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImplTest.java
index 4f014d316..737ff43fa 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImplTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImplTest.java
@@ -1,11 +1,14 @@
package com.netcracker.cloud.maas.client.impl;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
class MaaSAPIClientImplTest {
@Test
- void testConstructor() {
- // test that constructor runnable and doesn't throw any exception
- new MaaSAPIClientImpl(() -> "faketoken", false).getRabbitClient();
+ void testCoverage() throws Exception {
+ MaaSAPIClientImpl client = new MaaSAPIClientImpl(() -> "faketoken", false);
+ assertNotNull(client.getKafkaClient());
+ assertNotNull(client.getRabbitClient());
+ client.close();
}
}
From 802cbd183b061c356f1d5399ca3039b8cf5e13c2 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 18:04:36 +0500
Subject: [PATCH 68/71] chore: refactoring
---
.../MicroserviceOkHttpRestClientTest.java | 58 +++++++------------
1 file changed, 21 insertions(+), 37 deletions(-)
diff --git a/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java b/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
index 278c74bf2..44898d871 100644
--- a/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
+++ b/core-restclient/microservice-restclient-okhttp/src/test/java/com/netcracker/cloud/restclient/okhttp/MicroserviceOkHttpRestClientTest.java
@@ -12,7 +12,6 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@@ -37,47 +36,32 @@ void testDefaultRequestHeaders() throws InterruptedException {
}
@Test
- void testRequestBodies() throws Exception {
- mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
- restClient.doRequest(testUrl, HttpMethod.POST, null, "test-string", Void.class);
- RecordedRequest req1 = mockBackEnd.takeRequest();
- assertNotNull(req1);
- }
-
- @Test
- void testMapResponseBody() throws Exception {
- mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
- assertNull(restClient.doRequest(testUrl, HttpMethod.GET, null, null, Void.class).getResponseBody());
+ void testTMFRestClientResponseException() throws Exception {
+ TmfErrorResponse tmfErrorResponse = TmfErrorResponse.builder()
+ .id(UUID.randomUUID().toString())
+ .code("TEST")
+ .reason("test reason")
+ .detail("test detail")
+ .status("500")
+ .type(TmfErrorResponse.TYPE_V1_0)
+ .build();
- mockBackEnd.enqueue(new MockResponse().setResponseCode(200).setBody("hello"));
- assertEquals("hello", restClient.doRequest(testUrl, HttpMethod.GET, null, null, String.class).getResponseBody());
-
- mockBackEnd.enqueue(new MockResponse().setResponseCode(200).setBody("bytes"));
- assertArrayEquals("bytes".getBytes(), restClient.doRequest(testUrl, HttpMethod.GET, null, null, byte[].class).getResponseBody());
- }
+ mockBackEnd.enqueue(new MockResponse()
+ .setHeader("test-header", "test-value")
+ .setResponseCode(500)
+ .setBody(new ObjectMapper().writeValueAsString(tmfErrorResponse)));
- @Test
- void testSerializationFailure() {
- mockBackEnd.enqueue(new MockResponse().setResponseCode(200));
- Object unserializable = new Object() {
- @Override
- public String toString() {
- throw new RuntimeException("fail");
- }
- };
- assertThrows(Exception.class, () -> {
- restClient.doRequest(testUrl, HttpMethod.POST, null, new Object(), Void.class);
- });
- }
-
- @Test
- void testParseError() throws Exception {
- mockBackEnd.enqueue(new MockResponse().setResponseCode(500).setBody("invalid-json"));
try {
- restClient.doRequest(testUrl, HttpMethod.GET, null, null, String.class);
+ restClient.doRequest(testUrl, HttpMethod.POST, null, null, Void.class);
+ fail("Expected MicroserviceRestClientResponseException");
} catch (MicroserviceRestClientResponseException e) {
assertEquals(500, e.getHttpStatus());
- assertTrue(e.getCause() instanceof Exception);
+ assertEquals("test-value", e.getResponseHeaders().get("test-header").get(0));
+ assertTrue(e.getCause() instanceof RemoteCodeException);
+ RemoteCodeException remoteCodeException = (RemoteCodeException) e.getCause();
+ assertEquals(tmfErrorResponse.getCode(), remoteCodeException.getErrorCode().getCode());
+ } finally {
+ mockBackEnd.takeRequest(60, TimeUnit.SECONDS);
}
}
}
From f8abf5c015781005edc5e4c109be6e07166c87b2 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 19:02:55 +0500
Subject: [PATCH 69/71] chore: refactoring
---
.../route/RouteRegistrationConfigTest.java | 8 ------
.../src/test/resources/application.properties | 1 +
.../maas/spring/MaaSClientConfigTest.java | 27 ++++++-------------
.../src/test/resources/application-test.yml | 4 +++
4 files changed, 13 insertions(+), 27 deletions(-)
create mode 100644 maas-client-spring/maas-client-spring/src/test/resources/application-test.yml
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java b/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
index 2fce3609c..ffee85926 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
@@ -20,7 +20,6 @@
@QuarkusTest
-@TestProfile(RouteRegistrationConfigTest.K8sEnabledProfile.class)
class RouteRegistrationConfigTest {
private static final String ANOTHER_CONTROL_PLANE_HTTP_CLIENT = "anotherControlPlaneHttpClient";
@@ -74,13 +73,6 @@ void testM2mOkHttpClient_isCalledWithK8sEnabledTrue() {
}
}
- public static class K8sEnabledProfile implements QuarkusTestProfile {
- @Override
- public Map getConfigOverrides() {
- return Map.of("security.m2m.kubernetes.enabled", "true");
- }
- }
-
// idk why, but in QuarkusTest we cannot declare bean via producer method and inject it in that class
// (it says that circular dependencies created)
@ApplicationScoped
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/test/resources/application.properties b/core-quarkus-extensions/routes-registrator/runtime/src/test/resources/application.properties
index ffba1aad1..b4c8354b5 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/test/resources/application.properties
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/test/resources/application.properties
@@ -1,2 +1,3 @@
cloud.microservice.name=test-app
cloud.microservice.namespace=test-namespace
+security.m2m.kubernetes.enabled=true
diff --git a/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java b/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java
index 49ab2b8b6..e2a22a561 100644
--- a/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java
+++ b/maas-client-spring/maas-client-spring/src/test/java/com/netcracker/cloud/maas/spring/MaaSClientConfigTest.java
@@ -17,6 +17,10 @@
class MaaSClientConfigTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withInitializer(context -> {
+ org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.applyTo(context.getEnvironment());
+ })
+ .withSystemProperties("spring.profiles.active=test")
.withConfiguration(AutoConfigurations.of(MaaSClientConfig.class, MockM2MManagerConfig.class));
@Test
@@ -25,25 +29,10 @@ void shouldPassTrueToClientConstructor() {
(mock, context) -> {
assertThat(context.arguments().get(1)).isEqualTo(true);
})) {
- contextRunner.withPropertyValues("security.m2m.kubernetes.enabled=true")
- .run(context -> {
- assertThat(context).hasSingleBean(MaaSAPIClient.class);
- assertThat(mocked.constructed()).hasSize(1);
- });
- }
- }
-
- @Test
- void shouldPassFalseToClientConstructor() {
- try (MockedConstruction mocked = mockConstruction(MaaSAPIClientImpl.class,
- (mock, context) -> {
- assertThat(context.arguments().get(1)).isEqualTo(false);
- })) {
- contextRunner.withPropertyValues("security.m2m.kubernetes.enabled=false")
- .run(context -> {
- assertThat(context).hasSingleBean(MaaSAPIClient.class);
- assertThat(mocked.constructed()).hasSize(1);
- });
+ contextRunner.run(context -> {
+ assertThat(context).hasSingleBean(MaaSAPIClient.class);
+ assertThat(mocked.constructed()).hasSize(1);
+ });
}
}
diff --git a/maas-client-spring/maas-client-spring/src/test/resources/application-test.yml b/maas-client-spring/maas-client-spring/src/test/resources/application-test.yml
new file mode 100644
index 000000000..150f2cdcb
--- /dev/null
+++ b/maas-client-spring/maas-client-spring/src/test/resources/application-test.yml
@@ -0,0 +1,4 @@
+security:
+ m2m:
+ kubernetes:
+ enabled: true
\ No newline at end of file
From 3bafe6870f8bc8460d574dfd7098804c6c77d49c Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 19:10:20 +0500
Subject: [PATCH 70/71] chore: refactoring
---
...omConfigServerConfigDataLocationResolverTest.java | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
index 35fd42736..d1c23cd89 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
@@ -4,14 +4,16 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.boot.bootstrap.DefaultBootstrapContext;
+import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor;
import org.springframework.boot.context.config.ConfigDataLocation;
import org.springframework.boot.context.config.ConfigDataLocationResolverContext;
import org.springframework.boot.context.config.Profiles;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.cloud.config.client.ConfigServerConfigDataResource;
-import org.springframework.mock.env.MockEnvironment;
+import org.springframework.core.env.StandardEnvironment;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -23,13 +25,16 @@ class AbstractCustomConfigServerConfigDataLocationResolverTest {
private AbstractCustomConfigServerConfigDataLocationResolver abstractConfigDataLocationResolver;
private ConfigDataLocationResolverContext context = mock(ConfigDataLocationResolverContext.class);
- private MockEnvironment environment;
+ private StandardEnvironment environment;
private Binder environmentBinder;
@BeforeEach
public void before() {
- this.environment = new MockEnvironment();
+ this.environment = new StandardEnvironment();
+ this.environment.setActiveProfiles("test");
+ ConfigDataEnvironmentPostProcessor.applyTo(this.environment, null, null, Collections.emptyList());
+
this.environmentBinder = Binder.get(this.environment);
when(context.getBinder()).thenReturn(environmentBinder);
when(context.getBootstrapContext()).thenReturn(new DefaultBootstrapContext());
@@ -83,7 +88,6 @@ void checkConfigServerDataResource(){
@Test
void checkK8sEnabledPropertyBinding() throws Exception {
- environment.setProperty("security.m2m.kubernetes.enabled", "true");
Profiles profiles = mock(Profiles.class);
abstractConfigDataLocationResolver.resolveProfileSpecific(context, ConfigDataLocation.of("optional:configserver:http://config-server:8080"), profiles);
From 5159f633b5d96377699e2f080e320a8503e91e38 Mon Sep 17 00:00:00 2001
From: nurtai325
Date: Mon, 25 May 2026 20:07:48 +0500
Subject: [PATCH 71/71] chore: refactoring
---
.../config/source/ConfigServerClientImpl.java | 4 +--
.../dbaas/common/config/M2MDbaaSClient.java | 4 +--
.../dbaas/common/config/SecurityConfig.java | 2 +-
.../common/config/M2MDbaaSClientTest.java | 2 +-
.../quarkus/MaaSClientConfiguration.java | 4 +--
.../route/RouteRegistrationConfig.java | 8 ++---
.../route/RouteRegistrationConfigTest.java | 2 +-
...onfigServerConfigDataLocationResolver.java | 4 +--
...gServerConfigDataLocationResolverTest.java | 8 ++---
...onfigServerConfigDataLocationResolver.java | 2 +-
...onfigServerConfigDataLocationResolver.java | 2 +-
.../core/utils/k8s/M2MClientFactory.java | 16 +++++-----
.../core/utils/k8s/impl/M2MInterceptor.java | 30 +++++++++----------
.../config/SpringDbaasApiProperties.java | 4 +--
.../config/SpringDbaasApiPropertiesTest.java | 4 +--
.../DbaasRestTemplateConfiguration.java | 4 +--
.../DbaasWebClientConfiguration.java | 4 +--
.../MaaSClientCommonConfiguration.java | 4 +--
.../cloud/maas/spring/MaaSClientConfig.java | 4 +--
.../cloud/maas/client/impl/Env.java | 4 +--
.../maas/client/impl/MaaSAPIClientImpl.java | 18 +++++------
.../maas/client/impl/http/HttpClient.java | 8 ++---
.../cloud/maas/client/impl/EnvTest.java | 2 +-
.../config/MaasKafkaProdClientConfig.java | 6 ++--
.../config/MaasKafkaProdClientConfig.java | 6 ++--
25 files changed, 78 insertions(+), 78 deletions(-)
diff --git a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
index 1de964023..f4a965b93 100644
--- a/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
+++ b/core-quarkus-extensions/config-sources/springcloud-config-source/runtime/src/main/java/com/netcracker/cloud/springcloud/config/source/ConfigServerClientImpl.java
@@ -37,8 +37,8 @@ public class ConfigServerClientImpl implements ConfigServerClient {
public ConfigServerClientImpl(String csUrl) throws MalformedURLException {
final Config cfg = ConfigProvider.getConfig();
- boolean k8sEnabled = cfg.getOptionalValue("security.m2m.kubernetes.enabled", Boolean.class).orElse(false);
- client = M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sEnabled)
+ boolean k8sM2mEnabled = cfg.getOptionalValue("security.m2m.kubernetes.enabled", Boolean.class).orElse(false);
+ client = M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sM2mEnabled)
.newBuilder()
.connectionSpecs(Collections.singletonList(
csUrl.startsWith("https") ? ConnectionSpec.COMPATIBLE_TLS : ConnectionSpec.CLEARTEXT)
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
index d4d2eac39..456c934f1 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClient.java
@@ -35,14 +35,14 @@ public DbaasClient build() {
String dbaasAgentUrl = dbaasConfig.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
String dbaasUrl = dbaasAgentUrl;
- if(securityConfig.k8sEnabled()) {
+ if(securityConfig.k8sM2mEnabled()) {
if(dbaasConfig.dbaasUrl().isEmpty()) {
log.warn("DBaaS address is not available, falling back to dbaas-agent. Specify 'api.dbaas.address' property to DBaaS url");
}
dbaasUrl = dbaasConfig.dbaasUrl().orElse(dbaasAgentUrl);
}
- OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue(), securityConfig.k8sEnabled());
+ OkHttpClient httpClient = M2MClientFactory.getDbaasOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue(), securityConfig.k8sM2mEnabled());
httpClient = httpClient.newBuilder()
.addInterceptor(chain -> {
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/SecurityConfig.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/SecurityConfig.java
index 947f0bf49..65660bfc8 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/SecurityConfig.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/main/java/com/netcracker/cloud/dbaas/common/config/SecurityConfig.java
@@ -11,5 +11,5 @@ public interface SecurityConfig {
*/
@WithName("kubernetes.enabled")
@WithDefault("false")
- boolean k8sEnabled();
+ boolean k8sM2mEnabled();
}
diff --git a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
index 85c49a456..7155cc31b 100644
--- a/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
+++ b/core-quarkus-extensions/dbaas-client/dbaas-common/runtime/src/test/java/com/netcracker/cloud/dbaas/common/config/M2MDbaaSClientTest.java
@@ -21,7 +21,7 @@ class M2MDbaaSClientTest {
@BeforeEach
void setUp() {
SecurityConfig securityConfig = mock(SecurityConfig.class);
- when(securityConfig.k8sEnabled()).thenReturn(true);
+ when(securityConfig.k8sM2mEnabled()).thenReturn(true);
DbaasClientConfig dbaasConfig = mock(DbaasClientConfig.class);
when(dbaasConfig.dbaasAgentUrl()).thenReturn(Optional.of(DB_AGENT_URL));
diff --git a/core-quarkus-extensions/maas-client/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientConfiguration.java b/core-quarkus-extensions/maas-client/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientConfiguration.java
index 695d3a293..4af1f62c9 100644
--- a/core-quarkus-extensions/maas-client/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientConfiguration.java
+++ b/core-quarkus-extensions/maas-client/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientConfiguration.java
@@ -15,13 +15,13 @@
public class MaaSClientConfiguration {
@ConfigProperty(name = "security.m2m.kubernetes.enabled", defaultValue = "false")
- boolean k8sEnabled;
+ boolean k8sM2mEnabled;
@Produces
@DefaultBean
@Singleton
public MaaSAPIClient getMaaSAPIClient() {
- return new MaaSAPIClientImpl(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sEnabled);
+ return new MaaSAPIClientImpl(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sM2mEnabled);
}
@Produces
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
index 493bcf624..08f3aa7dd 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/main/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfig.java
@@ -41,7 +41,7 @@ public class RouteRegistrationConfig {
private Optional deploymentVersion;
- private boolean k8sEnabled;
+ private boolean k8sM2mEnabled;
public RouteRegistrationConfig(@ConfigProperty(name = "cloud.microservice.name") String microserviceName,
@ConfigProperty(name = "cloud.microservice.namespace") String cloudNamespace,
@@ -51,7 +51,7 @@ public RouteRegistrationConfig(@ConfigProperty(name = "cloud.microservice.name")
@ConfigProperty(name = "apigateway.routes.registration.enabled", defaultValue = "true") Boolean postRoutesEnabled,
@ConfigProperty(name = "cloud.microservice.bg_version") Optional deploymentVersion,
@ConfigProperty(name = "SERVICE_MESH_TYPE") Optional serviceMeshType,
- @ConfigProperty(name = "security.m2m.kubernetes.enabled", defaultValue = "false") boolean k8sEnabled) {
+ @ConfigProperty(name = "security.m2m.kubernetes.enabled", defaultValue = "false") boolean k8sM2mEnabled) {
this.microserviceName = microserviceName;
this.cloudNamespace = cloudNamespace;
this.controlPlaneUrl = controlPlaneUrl;
@@ -61,7 +61,7 @@ public RouteRegistrationConfig(@ConfigProperty(name = "cloud.microservice.name")
this.cloudServiceName = microserviceName;
this.deploymentVersion = deploymentVersion;
- this.k8sEnabled = k8sEnabled;
+ this.k8sM2mEnabled = k8sM2mEnabled;
deploymentVersion.ifPresent(s -> this.cloudServiceName += "-" + s);
}
@@ -85,7 +85,7 @@ ControlPlaneClient controlPlaneClient(@Named(CONTROL_PLANE_HTTP_CLIENT) OkHttpCl
@Produces
@Named(CONTROL_PLANE_HTTP_CLIENT)
OkHttpClient controlPlaneHttpClient() {
- return M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sEnabled)
+ return M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sM2mEnabled)
.newBuilder()
.retryOnConnectionFailure(true)
.build();
diff --git a/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java b/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
index ffee85926..cb37b307b 100644
--- a/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
+++ b/core-quarkus-extensions/routes-registrator/runtime/src/test/java/com/netcracker/cloud/quarkus/routesregistration/runtime/gateway/route/RouteRegistrationConfigTest.java
@@ -61,7 +61,7 @@ void testPostRoutesEnabled_whenMeshTypeIsCore_andRegistrationEnabled() {
}
@Test
- void testM2mOkHttpClient_isCalledWithK8sEnabledTrue() {
+ void testM2mOkHttpClient_isCalledWithK8sM2mEnabledTrue() {
try (var mockedFactory = org.mockito.Mockito.mockStatic(com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory.class)) {
mockedFactory.when(() -> com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory.getM2mOkHttpClient(org.mockito.ArgumentMatchers.any(), org.mockito.ArgumentMatchers.eq(true)))
.thenReturn(new OkHttpClient.Builder().build());
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-common/src/main/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-common/src/main/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolver.java
index c5b4042e1..6d118415f 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-common/src/main/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-common/src/main/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolver.java
@@ -19,7 +19,7 @@ public abstract class AbstractCustomConfigServerConfigDataLocationResolver exten
public static final String INNER_CONFIG_SERVER_LOCATION_PREFIX = "confserv:";
private boolean isConfigLocationRegistered = false;
- protected boolean k8sEnabled = false;
+ protected boolean k8sM2mEnabled = false;
public AbstractCustomConfigServerConfigDataLocationResolver(DeferredLogFactory log) {
super(log);
@@ -49,7 +49,7 @@ public List resolveProfileSpecific(ConfigDataLoc
return Collections.emptyList();
}
- this.k8sEnabled = resolverContext.getBinder().bind("security.m2m.kubernetes.enabled", Boolean.class).orElse(false);
+ this.k8sM2mEnabled = resolverContext.getBinder().bind("security.m2m.kubernetes.enabled", Boolean.class).orElse(false);
resolverContext.getBootstrapContext().registerIfAbsent(MicroserviceRestClient.class, BootstrapRegistry.InstanceSupplier.of(getMicroserviceRestClient()));
List configServerConfigDataResources = super.resolveProfileSpecific(resolverContext, location, profiles);
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
index d1c23cd89..2e0f6e29b 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-common/src/test/java/com/netcracker/cloud/configserver/common/configuration/AbstractCustomConfigServerConfigDataLocationResolverTest.java
@@ -87,15 +87,15 @@ void checkConfigServerDataResource(){
}
@Test
- void checkK8sEnabledPropertyBinding() throws Exception {
+ void checkK8sM2mEnabledPropertyBinding() throws Exception {
Profiles profiles = mock(Profiles.class);
abstractConfigDataLocationResolver.resolveProfileSpecific(context, ConfigDataLocation.of("optional:configserver:http://config-server:8080"), profiles);
- java.lang.reflect.Field field = AbstractCustomConfigServerConfigDataLocationResolver.class.getDeclaredField("k8sEnabled");
+ java.lang.reflect.Field field = AbstractCustomConfigServerConfigDataLocationResolver.class.getDeclaredField("k8sM2mEnabled");
field.setAccessible(true);
- boolean k8sEnabled = (boolean) field.get(abstractConfigDataLocationResolver);
+ boolean k8sM2mEnabled = (boolean) field.get(abstractConfigDataLocationResolver);
- assertThat(k8sEnabled).isTrue();
+ assertThat(k8sM2mEnabled).isTrue();
}
}
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
index 052cd5775..d0b117286 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-resttemplate/src/main/java/com/netcracker/cloud/configserver/resttemplate/RestTemplateConfigServerConfigDataLocationResolver.java
@@ -33,7 +33,7 @@ public RestTemplateConfigServerConfigDataLocationResolver(DeferredLogFactory log
@Override
public MicroserviceRestClient getMicroserviceRestClient() {
if (hasM2M(configurableBootstrapContext)) {
- var client = M2MClientFactory.getM2mOkHttpClient(() -> getM2MToken(configurableBootstrapContext), k8sEnabled);
+ var client = M2MClientFactory.getM2mOkHttpClient(() -> getM2MToken(configurableBootstrapContext), k8sM2mEnabled);
return new MicroserviceOkHttpRestClient(client);
}
return createM2MRestTemplate();
diff --git a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
index f178d66a9..c6b60b443 100644
--- a/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
+++ b/core-rest-libraries/config-server-loader/config-server-loader-webclient/src/main/java/com/netcracker/cloud/configserver/webclient/WebClientConfigServerConfigDataLocationResolver.java
@@ -22,7 +22,7 @@ public WebClientConfigServerConfigDataLocationResolver(DeferredLogFactory log, C
@Override
public MicroserviceRestClient getMicroserviceRestClient() {
if (hasM2M(configurableBootstrapContext)) {
- var client = M2MClientFactory.getM2mOkHttpClient(() -> getM2MToken(configurableBootstrapContext), k8sEnabled);
+ var client = M2MClientFactory.getM2mOkHttpClient(() -> getM2MToken(configurableBootstrapContext), k8sM2mEnabled);
return new MicroserviceOkHttpRestClient(client);
}
return createM2MWebClient();
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
index c28fee5be..20392c0d9 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/M2MClientFactory.java
@@ -17,20 +17,20 @@ public final class M2MClientFactory {
private static final Supplier k8sAuthHeaderSupplier =
getBearerAuthHeaderSupplier(() -> KubernetesAudienceToken.getToken(AudienceName.NETCRACKER));
- public static OkHttpClient getM2mOkHttpClient(Supplier keycloakTokenSupplier, boolean k8sEnabled) {
- return getOkHttpClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, k8sEnabled));
+ public static OkHttpClient getM2mOkHttpClient(Supplier keycloakTokenSupplier, boolean k8sM2mEnabled) {
+ return getOkHttpClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, k8sM2mEnabled));
}
- public static OkHttpClient getDbaasOkHttpClient(Supplier keycloakTokenSupplier, boolean k8sEnabled) {
- return getAgentOkHttpClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(DBAAS_AGENT_URL_PROP)).orElse("http://dbaas-agent:8080"), k8sEnabled);
+ public static OkHttpClient getDbaasOkHttpClient(Supplier keycloakTokenSupplier, boolean k8sM2mEnabled) {
+ return getAgentOkHttpClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(DBAAS_AGENT_URL_PROP)).orElse("http://dbaas-agent:8080"), k8sM2mEnabled);
}
- public static OkHttpClient getMaasOkHttpClient(Supplier keycloakTokenSupplier, boolean k8sEnabled) {
- return getAgentOkHttpClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(MAAS_AGENT_URL_PROP)).orElse("http://maas-agent:8080"), k8sEnabled);
+ public static OkHttpClient getMaasOkHttpClient(Supplier keycloakTokenSupplier, boolean k8sM2mEnabled) {
+ return getAgentOkHttpClient(keycloakTokenSupplier, Optional.ofNullable(System.getProperty(MAAS_AGENT_URL_PROP)).orElse("http://maas-agent:8080"), k8sM2mEnabled);
}
- private static OkHttpClient getAgentOkHttpClient(Supplier keycloakTokenSupplier, String agentUrl, boolean k8sEnabled) {
- return getOkHttpClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl, k8sEnabled));
+ private static OkHttpClient getAgentOkHttpClient(Supplier keycloakTokenSupplier, String agentUrl, boolean k8sM2mEnabled) {
+ return getOkHttpClient(new M2MInterceptor(new UrlCache(), getBearerAuthHeaderSupplier(keycloakTokenSupplier), k8sAuthHeaderSupplier, agentUrl, k8sM2mEnabled));
}
private static OkHttpClient getOkHttpClient(M2MInterceptor interceptor) {
diff --git a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
index e59aa2116..f56880d09 100644
--- a/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
+++ b/core-utils/k8s/src/main/java/com/netcracker/cloud/security/core/utils/k8s/impl/M2MInterceptor.java
@@ -30,34 +30,34 @@ Unauthorized access (http 401).
The possible cause is an outdated version of the security library on the server side.
The previous authentication method will be used as a fallback.""";
- private final boolean k8sEnabled;
+ private final boolean k8sM2mEnabled;
private final UrlCache urlCache;
private final Supplier fallbackAuthHeaderSupplier;
private final Supplier k8sAuthHeaderSupplier;
private final HttpUrl fallbackBaseUrl;
- public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, boolean k8sEnabled) {
- this(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier, null, k8sEnabled);
+ public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, boolean k8sM2mEnabled) {
+ this(urlCache, fallbackAuthHeaderSupplier, k8sAuthHeaderSupplier, null, k8sM2mEnabled);
}
- public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, String fallbackBaseUrl, boolean k8sEnabled) {
- this.k8sEnabled = k8sEnabled || isK8sEnabledFromSystem();
+ public M2MInterceptor(UrlCache urlCache, Supplier fallbackAuthHeaderSupplier, Supplier k8sAuthHeaderSupplier, String fallbackBaseUrl, boolean k8sM2mEnabled) {
+ this.k8sM2mEnabled = k8sM2mEnabled || isK8sM2mEnabledFromSystem();
this.urlCache = urlCache;
this.fallbackAuthHeaderSupplier = fallbackAuthHeaderSupplier;
this.k8sAuthHeaderSupplier = k8sAuthHeaderSupplier;
this.fallbackBaseUrl = (fallbackBaseUrl != null) ? HttpUrl.get(fallbackBaseUrl) : null;
}
- private static boolean isK8sEnabledFromSystem() {
- String k8sEnabledProp = System.getProperty("security.m2m.kubernetes.enabled");
- if (k8sEnabledProp == null) {
- k8sEnabledProp = System.getenv("SECURITY_M2M_KUBERNETES_ENABLED");
+ private static boolean isK8sM2mEnabledFromSystem() {
+ String k8sM2mEnabledProp = System.getProperty("security.m2m.kubernetes.enabled");
+ if (k8sM2mEnabledProp == null) {
+ k8sM2mEnabledProp = System.getenv("SECURITY_M2M_KUBERNETES_ENABLED");
}
- var k8sEnabled = Boolean.parseBoolean(k8sEnabledProp);
- if(k8sEnabled) {
+ var k8sM2mEnabled = Boolean.parseBoolean(k8sM2mEnabledProp);
+ if(k8sM2mEnabled) {
log.debug("k8s not explicitly enabled, defaulting to system setting");
}
- return k8sEnabled;
+ return k8sM2mEnabled;
}
@NotNull
@@ -65,7 +65,7 @@ private static boolean isK8sEnabledFromSystem() {
public Response intercept(final Interceptor.Chain chain) throws IOException {
final Request request = chain.request();
final String cacheKey = calculateCacheKey(request.url().toString());
- if (k8sEnabled && !urlCache.containsKey(cacheKey)) {
+ if (k8sM2mEnabled && !urlCache.containsKey(cacheKey)) {
//first call (no information) / kubernetes token is applicable
final Request altered;
try {
@@ -94,7 +94,7 @@ private Response doRequestFallback(final Request fallbackRequest,
final Response fallbackResponse = chain.proceed(fallbackRequest);
if (fallbackResponse.isSuccessful()) {
urlCache.store(cacheKey);
- if(k8sEnabled && Objects.equals(reason, KUBERNETES_TOKEN_ACQUISITION_ERROR)) {
+ if(k8sM2mEnabled && Objects.equals(reason, KUBERNETES_TOKEN_ACQUISITION_ERROR)) {
log.warn("Failed to establish m2m connection to {}\n{}", fallbackRequest.url(), reason);
} else {
log.debug("Failed to establish m2m connection to {}\n{}", fallbackRequest.url(), reason);
@@ -108,7 +108,7 @@ private Request alterRequest(final Request initialRequest, final String authHead
throw new IllegalStateException("M2M auth header is empty.");
}
HttpUrl targetUrl = initialRequest.url();
- if(k8sEnabled && useFallbackUrl && fallbackBaseUrl != null) {
+ if(k8sM2mEnabled && useFallbackUrl && fallbackBaseUrl != null) {
targetUrl = rebaseUrl(initialRequest.url(), fallbackBaseUrl);
}
return initialRequest.newBuilder()
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiProperties.java b/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiProperties.java
index eff84933d..dbd53b9b0 100644
--- a/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiProperties.java
+++ b/dbaas-client/dbaas-client-java/dbaas-client-core/src/main/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiProperties.java
@@ -22,7 +22,7 @@ public class SpringDbaasApiProperties {
@Getter(AccessLevel.NONE)
@Value("${security.m2m.kubernetes.enabled:false}")
- private boolean k8sEnabled;
+ private boolean k8sM2mEnabled;
@Value("${dbaas.api.retry.default.template.maxAttempts:10}")
private int dbaasDefaultRetryMaxAttempts;
@@ -34,7 +34,7 @@ public class SpringDbaasApiProperties {
private int dbaasAsyncRetryTimeoutInS;
public String getAddress() {
- if(!k8sEnabled) {
+ if(!k8sM2mEnabled) {
return dbaasAgentAddress.orElse(DEFAULT_DBAAS_AGENT_URL);
}
if(dbaasAddress.isEmpty()) {
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java b/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java
index 9509415c2..7a88a9851 100644
--- a/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java
+++ b/dbaas-client/dbaas-client-java/dbaas-client-core/src/test/java/com/netcracker/cloud/dbaas/client/config/SpringDbaasApiPropertiesTest.java
@@ -14,7 +14,7 @@ void testGetAddress() {
SpringDbaasApiProperties properties = new SpringDbaasApiProperties();
// Test non-k8s path
- ReflectionTestUtils.setField(properties, "k8sEnabled", false);
+ ReflectionTestUtils.setField(properties, "k8sM2mEnabled", false);
ReflectionTestUtils.setField(properties, "dbaasAgentAddress", Optional.of("http://custom"));
assertEquals("http://custom", properties.getAddress());
@@ -22,7 +22,7 @@ void testGetAddress() {
assertEquals("http://dbaas-agent:8080", properties.getAddress());
// Test k8s path
- ReflectionTestUtils.setField(properties, "k8sEnabled", true);
+ ReflectionTestUtils.setField(properties, "k8sM2mEnabled", true);
ReflectionTestUtils.setField(properties, "dbaasAddress", Optional.of("http://k8s-url"));
assertEquals("http://k8s-url", properties.getAddress());
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-resttemplate/src/main/java/com/netcracker/cloud/dbaas/client/restclient/resttemplate/DbaasRestTemplateConfiguration.java b/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-resttemplate/src/main/java/com/netcracker/cloud/dbaas/client/restclient/resttemplate/DbaasRestTemplateConfiguration.java
index 4cc7df493..8bfed5190 100644
--- a/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-resttemplate/src/main/java/com/netcracker/cloud/dbaas/client/restclient/resttemplate/DbaasRestTemplateConfiguration.java
+++ b/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-resttemplate/src/main/java/com/netcracker/cloud/dbaas/client/restclient/resttemplate/DbaasRestTemplateConfiguration.java
@@ -16,11 +16,11 @@
public class DbaasRestTemplateConfiguration {
@Value("${security.m2m.kubernetes.enabled:false}")
- private boolean k8sEnabled;
+ private boolean k8sM2mEnabled;
@Bean("dbaasRestClient")
public MicroserviceRestClient dbaasRestClient(M2MManager m2MManager){
- var client = M2MClientFactory.getDbaasOkHttpClient(() -> m2MManager.getToken().getTokenValue(), k8sEnabled);
+ var client = M2MClientFactory.getDbaasOkHttpClient(() -> m2MManager.getToken().getTokenValue(), k8sM2mEnabled);
return new MicroserviceOkHttpRestClient(client);
}
}
diff --git a/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-webclient/src/main/java/com/netcracker/cloud/dbaas/client/restclient/webclient/DbaasWebClientConfiguration.java b/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-webclient/src/main/java/com/netcracker/cloud/dbaas/client/restclient/webclient/DbaasWebClientConfiguration.java
index 36d95197f..54f82c7c4 100644
--- a/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-webclient/src/main/java/com/netcracker/cloud/dbaas/client/restclient/webclient/DbaasWebClientConfiguration.java
+++ b/dbaas-client/dbaas-client-java/dbaas-client-restclient/dbaas-client-webclient/src/main/java/com/netcracker/cloud/dbaas/client/restclient/webclient/DbaasWebClientConfiguration.java
@@ -18,11 +18,11 @@
public class DbaasWebClientConfiguration {
@Value("${security.m2m.kubernetes.enabled:false}")
- private boolean k8sEnabled;
+ private boolean k8sM2mEnabled;
@Bean("dbaasRestClient")
public MicroserviceRestClient dbaasRestClient(M2MManager m2MManager) {
- var client = M2MClientFactory.getDbaasOkHttpClient(() -> m2MManager.getToken().getTokenValue(), k8sEnabled);
+ var client = M2MClientFactory.getDbaasOkHttpClient(() -> m2MManager.getToken().getTokenValue(), k8sM2mEnabled);
return new MicroserviceOkHttpRestClient(client);
}
diff --git a/maas-client-quarkus/maas-client-quarkus-common/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientCommonConfiguration.java b/maas-client-quarkus/maas-client-quarkus-common/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientCommonConfiguration.java
index cfb974403..4e4014676 100644
--- a/maas-client-quarkus/maas-client-quarkus-common/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientCommonConfiguration.java
+++ b/maas-client-quarkus/maas-client-quarkus-common/runtime/src/main/java/com/netcracker/cloud/maas/client/quarkus/MaaSClientCommonConfiguration.java
@@ -13,12 +13,12 @@
public class MaaSClientCommonConfiguration {
@ConfigProperty(name = "security.m2m.kubernetes.enabled", defaultValue = "false")
- boolean k8sEnabled;
+ boolean k8sM2mEnabled;
@Produces
@DefaultBean
@Singleton
public MaaSAPIClient getMaaSAPIClient() {
- return new MaaSAPIClientImpl(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sEnabled);
+ return new MaaSAPIClientImpl(() -> M2MManager.getInstance().getToken().getTokenValue(), k8sM2mEnabled);
}
}
diff --git a/maas-client-spring/maas-client-spring/src/main/java/com/netcracker/cloud/maas/spring/MaaSClientConfig.java b/maas-client-spring/maas-client-spring/src/main/java/com/netcracker/cloud/maas/spring/MaaSClientConfig.java
index de3a94d3b..78243760d 100644
--- a/maas-client-spring/maas-client-spring/src/main/java/com/netcracker/cloud/maas/spring/MaaSClientConfig.java
+++ b/maas-client-spring/maas-client-spring/src/main/java/com/netcracker/cloud/maas/spring/MaaSClientConfig.java
@@ -12,12 +12,12 @@
public class MaaSClientConfig {
@Value("${security.m2m.kubernetes.enabled:false}")
- private boolean k8sEnabled;
+ private boolean k8sM2mEnabled;
@Bean
@ConditionalOnMissingBean
public MaaSAPIClient getMaaSAPIClient(M2MManager m2MManager) {
- return new MaaSAPIClientImpl(() -> m2MManager.getToken().getTokenValue(), k8sEnabled);
+ return new MaaSAPIClientImpl(() -> m2MManager.getToken().getTokenValue(), k8sM2mEnabled);
}
}
diff --git a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/Env.java b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/Env.java
index e5d9cdf4f..405c52ff1 100644
--- a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/Env.java
+++ b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/Env.java
@@ -34,11 +34,11 @@ public class Env {
public static final String PROP_TENANT_MANAGER_RECONNECT_TIMEOUT = "maas.client.tenant-manager.reconnect-timeout";
public static final String PROP_HTTP_TIMEOUT = "maas.http.timeout";
- public static String apiUrl(boolean k8sEnabled) {
+ public static String apiUrl(boolean k8sM2mEnabled) {
String maasAgentUrl = stringProperty(PROP_MAAS_AGENT_URL)
.map(Env::normalizeUrl)
.orElse(addr2http("maas-agent"));
- if(!k8sEnabled) {
+ if(!k8sM2mEnabled) {
return maasAgentUrl;
}
return stringProperty(PROP_MAAS_URL)
diff --git a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java
index 74a3e6d67..ac97a0e6a 100644
--- a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java
+++ b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/MaaSAPIClientImpl.java
@@ -19,18 +19,18 @@ public class MaaSAPIClientImpl implements MaaSAPIClient {
private final ServerApiVersion serverApiVersion;
private final ApiUrlProvider apiProvider;
- public MaaSAPIClientImpl(Supplier tokenSupplier, boolean k8sEnabled) {
- this.restClient = HttpClient.getMaasClient(tokenSupplier, k8sEnabled);
- this.serverApiVersion = new ServerApiVersion(restClient, Env.apiUrl(k8sEnabled));
- this.tenantManagerConnector = new Lazy<>(() -> new TenantManagerConnectorImpl(HttpClient.getM2mClient(tokenSupplier, k8sEnabled)));
- this.apiProvider = new ApiUrlProvider(serverApiVersion, Env.apiUrl(k8sEnabled));
+ public MaaSAPIClientImpl(Supplier tokenSupplier, boolean k8sM2mEnabled) {
+ this.restClient = HttpClient.getMaasClient(tokenSupplier, k8sM2mEnabled);
+ this.serverApiVersion = new ServerApiVersion(restClient, Env.apiUrl(k8sM2mEnabled));
+ this.tenantManagerConnector = new Lazy<>(() -> new TenantManagerConnectorImpl(HttpClient.getM2mClient(tokenSupplier, k8sM2mEnabled)));
+ this.apiProvider = new ApiUrlProvider(serverApiVersion, Env.apiUrl(k8sM2mEnabled));
}
- public MaaSAPIClientImpl(Supplier tokenSupplier, boolean k8sEnabled, TenantManagerConnector tenantManagerConnector, BlueGreenStatePublisher statePublisher) {
- this.restClient = HttpClient.getMaasClient(tokenSupplier, k8sEnabled);
- this.serverApiVersion = new ServerApiVersion(restClient, Env.apiUrl(k8sEnabled));
+ public MaaSAPIClientImpl(Supplier tokenSupplier, boolean k8sM2mEnabled, TenantManagerConnector tenantManagerConnector, BlueGreenStatePublisher statePublisher) {
+ this.restClient = HttpClient.getMaasClient(tokenSupplier, k8sM2mEnabled);
+ this.serverApiVersion = new ServerApiVersion(restClient, Env.apiUrl(k8sM2mEnabled));
this.tenantManagerConnector = new Lazy<>(() -> tenantManagerConnector);
- this.apiProvider = new ApiUrlProvider(serverApiVersion, Env.apiUrl(k8sEnabled));
+ this.apiProvider = new ApiUrlProvider(serverApiVersion, Env.apiUrl(k8sM2mEnabled));
}
@Override
diff --git a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java
index 373b01992..a0d2f169a 100644
--- a/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java
+++ b/maas-client/client/src/main/java/com/netcracker/cloud/maas/client/impl/http/HttpClient.java
@@ -11,12 +11,12 @@
public class HttpClient {
private final OkHttpClient httpClient;
- public static HttpClient getM2mClient(Supplier tokenSupplier, boolean k8sEnabled) {
- return new HttpClient(M2MClientFactory.getM2mOkHttpClient(tokenSupplier, k8sEnabled));
+ public static HttpClient getM2mClient(Supplier tokenSupplier, boolean k8sM2mEnabled) {
+ return new HttpClient(M2MClientFactory.getM2mOkHttpClient(tokenSupplier, k8sM2mEnabled));
}
- public static HttpClient getMaasClient(Supplier tokenSupplier, boolean k8sEnabled) {
- return new HttpClient(M2MClientFactory.getMaasOkHttpClient(tokenSupplier, k8sEnabled));
+ public static HttpClient getMaasClient(Supplier tokenSupplier, boolean k8sM2mEnabled) {
+ return new HttpClient(M2MClientFactory.getMaasOkHttpClient(tokenSupplier, k8sM2mEnabled));
}
private HttpClient(OkHttpClient client) {
diff --git a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/EnvTest.java b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/EnvTest.java
index a3c3e5e7f..20d0f01c2 100644
--- a/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/EnvTest.java
+++ b/maas-client/client/src/test/java/com/netcracker/cloud/maas/client/impl/EnvTest.java
@@ -31,7 +31,7 @@ void testApiUrlWrongOverride() {
}
@Test
- void testApiUrlK8sEnabled() {
+ void testApiUrlK8sM2mEnabled() {
withProp(Env.PROP_MAAS_AGENT_URL, null, () ->
assertEquals("http://maas-agent:8080", Env.apiUrl(true))
);
diff --git a/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java b/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java
index 35a6b377c..12a91cf2c 100644
--- a/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java
+++ b/maas-declarative-client-quarkus/maas-kafka-quarkus-client/runtime/src/main/java/com/netcracker/maas/declarative/kafka/quarkus/client/config/MaasKafkaProdClientConfig.java
@@ -21,12 +21,12 @@
public class MaasKafkaProdClientConfig {
@ConfigProperty(name = "security.m2m.kubernetes.enabled", defaultValue = "false")
- boolean k8sEnabled;
+ boolean k8sM2mEnabled;
@Singleton
@Produces
KafkaMaaSClient kafkaMaaSClient(MaasKafkaProps props, M2MManager m2mManager) {
- HttpClient httpClient = HttpClient.getM2mClient(() -> m2mManager.getToken().getTokenValue(), k8sEnabled);
+ HttpClient httpClient = HttpClient.getM2mClient(() -> m2mManager.getToken().getTokenValue(), k8sM2mEnabled);
return new KafkaMaaSClientImpl(
httpClient,
() -> new TenantManagerConnectorImpl(httpClient),
@@ -46,7 +46,7 @@ MaasKafkaTopicServiceProvider maasKafkaTopicServiceProvider(KafkaMaaSClient kafk
@Produces
@DefaultBean
InternalTenantService internalTenantService(M2MManager m2mManager) {
- HttpClient httpClient = HttpClient.getM2mClient(() -> m2mManager.getToken().getTokenValue(), k8sEnabled);
+ HttpClient httpClient = HttpClient.getM2mClient(() -> m2mManager.getToken().getTokenValue(), k8sM2mEnabled);
TenantManagerConnectorImpl tenantManagerConnector = new TenantManagerConnectorImpl(httpClient);
return new InternalTenantServiceImpl(tenantManagerConnector);
}
diff --git a/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java b/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java
index d05aa0331..412c305cc 100644
--- a/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java
+++ b/maas-declarative-client-spring/maas-kafka-spring-client/src/main/java/com/netcracker/maas/declarative/kafka/spring/client/config/MaasKafkaProdClientConfig.java
@@ -29,16 +29,16 @@ public class MaasKafkaProdClientConfig {
MaasKafkaProps props;
@Value("${security.m2m.kubernetes.enabled:false}")
- private boolean k8sEnabled;
+ private boolean k8sM2mEnabled;
@Bean
HttpClient maasHttpClient(@Autowired M2MManager m2MManager) {
- return HttpClient.getMaasClient(() -> m2MManager.getToken().getTokenValue(), k8sEnabled);
+ return HttpClient.getMaasClient(() -> m2MManager.getToken().getTokenValue(), k8sM2mEnabled);
}
@Bean
TenantManagerConnector tenantManagerConnector(@Autowired M2MManager m2MManager) {
- return new TenantManagerConnectorImpl(HttpClient.getM2mClient(() -> m2MManager.getToken().getTokenValue(), k8sEnabled));
+ return new TenantManagerConnectorImpl(HttpClient.getM2mClient(() -> m2MManager.getToken().getTokenValue(), k8sM2mEnabled));
}
@Bean