Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ea98fac
chore: refactoring
nurtai325 May 4, 2026
daabb7b
chore: refactoring
nurtai325 May 4, 2026
0a6025b
chore: refactoring
nurtai325 May 4, 2026
197d75c
chore: refactoring
nurtai325 May 5, 2026
383a252
chore: refactoring
nurtai325 May 5, 2026
a61f289
chore: refactoring
nurtai325 May 5, 2026
a270791
chore: refactoring
nurtai325 May 5, 2026
f41f7a6
chore: refactoring
nurtai325 May 5, 2026
a347249
chore: refactoring
nurtai325 May 5, 2026
22fc313
chore: refactoring
nurtai325 May 5, 2026
c87d188
chore: refactoring
nurtai325 May 5, 2026
4d4617c
chore: refactoring
nurtai325 May 6, 2026
6497c3c
chore: refactoring
nurtai325 May 6, 2026
5173dbe
chore: refactoring
nurtai325 May 8, 2026
5aba50b
chore: refactoring
nurtai325 May 8, 2026
132130b
chore: refactoring
nurtai325 May 8, 2026
380aeac
chore: refactoring
nurtai325 May 11, 2026
b874720
chore: refactoring
nurtai325 May 12, 2026
1ae531a
chore: refactoring
nurtai325 May 12, 2026
0dc896f
Merge branch 'main' into feature/m2m-rest-client
nurtai325 May 12, 2026
f6cd5b2
chore: refactoring
nurtai325 May 12, 2026
86bf004
chore: refactoring
nurtai325 May 12, 2026
a8897e8
chore: refactoring
nurtai325 May 12, 2026
f0897e7
chore: refactoring
nurtai325 May 12, 2026
77b3a61
chore: refactoring
nurtai325 May 12, 2026
f2a998c
chore: refactoring
nurtai325 May 13, 2026
8426ff5
chore: refactoring
nurtai325 May 13, 2026
f2d784c
chore: refactoring
nurtai325 May 13, 2026
4f42660
Revert "chore: refactoring"
nurtai325 May 14, 2026
5f2ea5a
Revert "chore: refactoring"
nurtai325 May 14, 2026
2b22e4d
Revert "chore: refactoring"
nurtai325 May 14, 2026
751d097
chore: refactoring
nurtai325 May 14, 2026
4c9bc06
chore: refactoring
nurtai325 May 14, 2026
e22b5a6
chore: refactoring
nurtai325 May 14, 2026
280adfc
chore: refactoring
nurtai325 May 14, 2026
0291c1f
chore: refactoring
nurtai325 May 18, 2026
7747c3b
chore: refactoring
nurtai325 May 18, 2026
19e3ef9
chore: refactoring
nurtai325 May 18, 2026
ac85885
chore: refactoring
nurtai325 May 19, 2026
9c559d6
chore: refactoring
nurtai325 May 19, 2026
d815786
chore: refactoring
nurtai325 May 19, 2026
b054c07
chore: refactoring
nurtai325 May 19, 2026
6442033
chore: refactoring
nurtai325 May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.netcracker.cloud.microserviceframework.application;

import com.netcracker.cloud.dbaas.client.DbaasClient;
import com.netcracker.cloud.restclient.MicroserviceRestClient;
import com.netcracker.cloud.restclient.resttemplate.MicroserviceRestTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -23,7 +24,7 @@ class BaseApplicationOnRestTemplateTest {
@Test
void testDbaasRestClientInitialized() {
assertThat("Bean 'dbaasRestClient' is missing in context",
context.getBean("dbaasRestClient") instanceof MicroserviceRestTemplate);
context.getBean("dbaasRestClient") instanceof MicroserviceRestClient);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@
import org.springframework.cloud.config.client.ConfigClientAutoConfiguration;
import org.springframework.context.annotation.Configuration;

import com.netcracker.cloud.security.common.DummyM2MManagerConfiguration;
import org.springframework.context.annotation.Import;

@Configuration
@EnableServiceDbaasPostgresql
@EnableAutoConfiguration(exclude = {DataElasticsearchAutoConfiguration.class, ConfigClientAutoConfiguration.class})
@Import(DummyM2MManagerConfiguration.class)
public class TestApplicationOnRestTemplate extends BaseApplicationOnRestTemplate {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.netcracker.cloud.microserviceframework.application;

import com.netcracker.cloud.dbaas.client.DbaasClient;
import com.netcracker.cloud.restclient.MicroserviceRestClient;
import com.netcracker.cloud.restclient.webclient.MicroserviceWebClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -23,7 +24,7 @@ class BaseApplicationOnWebClientTest {
@Test
void testDbaasRestClientInitialized() {
assertThat("Bean 'dbaasRestClient' is missing in context",
context.getBean("dbaasRestClient") instanceof MicroserviceWebClient);
context.getBean("dbaasRestClient") instanceof MicroserviceRestClient);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import com.netcracker.cloud.dbaas.client.config.EnableServiceDbaasPostgresql;
import com.netcracker.cloud.microserviceframework.BaseApplicationOnWebClient;
import com.netcracker.cloud.security.common.DummyM2MManagerConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.data.elasticsearch.autoconfigure.DataElasticsearchAutoConfiguration;
import org.springframework.cloud.config.client.ConfigClientAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@EnableServiceDbaasPostgresql
@EnableAutoConfiguration(exclude = {DataElasticsearchAutoConfiguration.class, ConfigClientAutoConfiguration.class})
@Import(DummyM2MManagerConfiguration.class)
public class TestApplicationOnWebClient extends BaseApplicationOnWebClient {
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,13 @@
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<!--TEst-->
<dependency>
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>k8s-utils</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>

<!--TEst-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -36,7 +36,8 @@ public class ConfigServerClientImpl implements ConfigServerClient {
private URL url;

public ConfigServerClientImpl(String csUrl) throws MalformedURLException {
client = new OkHttpClient.Builder()
client = M2MClientFactory.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue())
.newBuilder()
.connectionSpecs(Collections.singletonList(
csUrl.startsWith("https") ? ConnectionSpec.COMPATIBLE_TLS : ConnectionSpec.CLEARTEXT)
)
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>tls-utils</artifactId>
</dependency>
<dependency>
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>k8s-utils</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>
<!--Test-->
<dependency>
<groupId>io.quarkus</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ public class DbaasClientProducer {

@Produces
@DefaultBean
public DbaasClient dbaaSClient(DbaasClientConfig dbaasClientConfig) {
public DbaasClient dbaaSClient(SecurityConfig securityConfig, DbaasClientConfig dbaasClientConfig) {
if (dbaasClientConfig.dbaasUrl().isPresent() && dbaasClientConfig.dbaasUsername().isPresent() && dbaasClientConfig.dbaasPassword().isPresent()) {
log.debug("Create dbaas client with basic auth");
return new BasicDbaaSClient(dbaasClientConfig).build();
}

log.debug("Create dbaas client with m2m auth");
return new M2MDbaaSClient(dbaasClientConfig).build();
return new M2MDbaaSClient(securityConfig, dbaasClientConfig).build();

}
}
Original file line number Diff line number Diff line change
@@ -1,40 +1,53 @@
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.auth.Token;
import com.netcracker.cloud.security.core.utils.k8s.M2MClientFactory;
import com.netcracker.cloud.security.core.utils.tls.TlsUtils;
import jakarta.enterprise.context.ApplicationScoped;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;

import java.util.Optional;

import static com.netcracker.cloud.dbaas.common.config.DbaasClientConfig.DEFAULT_DBAAS_AGENT_ADDRESS;
import static com.netcracker.cloud.framework.contexts.tenant.BaseTenantProvider.TENANT_CONTEXT_NAME;

@Slf4j
@ApplicationScoped
public class M2MDbaaSClient {
private DbaasClientConfig config;
private static final int MAX_RETRIES = 3;
private static final long INITIAL_RETRY_DELAY = 500;

public M2MDbaaSClient(DbaasClientConfig config) {
this.config = config;
private final SecurityConfig securityConfig;
private final DbaasClientConfig dbaasConfig;

public M2MDbaaSClient(SecurityConfig securityConfig, DbaasClientConfig dbaasConfig) {
this.securityConfig = securityConfig;
this.dbaasConfig = dbaasConfig;
}

public DbaasClient build() {
String url = config.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);
OkHttpClient httpClient = new OkHttpClient.Builder()
String dbaasAgentUrl = dbaasConfig.dbaasAgentUrl().orElse(DEFAULT_DBAAS_AGENT_ADDRESS);

String dbaasUrl = dbaasAgentUrl;
if(securityConfig.k8sEnabled()) {
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());

httpClient = httpClient.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<TenantContextObject> tenantContextData = ContextManager.getSafe(TENANT_CONTEXT_NAME);
if (tenantContextData.isPresent() && tenantContextData.get().getTenant() != null) {
requestBuilder.addHeader("tenant", tenantContextData.get().getTenant());
Expand All @@ -44,6 +57,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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.netcracker.cloud.dbaas.common.config;

import io.smallrye.config.ConfigMapping;
import io.smallrye.config.WithDefault;
import io.smallrye.config.WithName;

@ConfigMapping(prefix = "security.m2m")
public interface SecurityConfig {
/**
* kubernetes tokens authentication enabled
*/
@WithName("kubernetes.enabled")
@WithDefault("false")
boolean k8sEnabled();
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,18 @@
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));
m2MDbaaSClient = new M2MDbaaSClient(config);
SecurityConfig securityConfig = mock(SecurityConfig.class);
when(securityConfig.k8sEnabled()).thenReturn(true);

DbaasClientConfig dbaasConfig = mock(DbaasClientConfig.class);
when(dbaasConfig.dbaasAgentUrl()).thenReturn(Optional.of(DB_AGENT_URL));
when(dbaasConfig.dbaasUrl()).thenReturn(Optional.of(DB_AGGREGATOR_URL));

m2MDbaaSClient = new M2MDbaaSClient(securityConfig, dbaasConfig);
}
@Test
void testBuild() throws NoSuchFieldException, IllegalAccessException {
Expand All @@ -29,8 +36,6 @@ 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());
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,12 @@
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>tls-utils</artifactId>
</dependency>
<!--Test-->
<dependency>
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>k8s-utils</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>
<!--Test-->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
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;
import io.reactivex.schedulers.Schedulers;
import jakarta.enterprise.context.ApplicationScoped;
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;

import java.util.Optional;

Expand Down Expand Up @@ -82,15 +82,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.getM2mOkHttpClient(() -> M2MManager.getInstance().getToken().getTokenValue())
.newBuilder()
.retryOnConnectionFailure(true)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,15 @@
<artifactId>rest-security-adapters</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.netcracker.cloud</groupId>
<artifactId>microservice-restclient-okhttp</artifactId>
<version>7.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>k8s-utils</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.netcracker.cloud.configserver.resttemplate;

import com.netcracker.cloud.restclient.okhttp.MicroserviceOkHttpRestClient;
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;
Expand All @@ -14,10 +16,9 @@
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;

public class RestTemplateConfigServerConfigDataLocationResolver extends AbstractCustomConfigServerConfigDataLocationResolver {

@Value("${connection.readTimeout:60000}")
Expand All @@ -32,10 +33,14 @@ public RestTemplateConfigServerConfigDataLocationResolver(DeferredLogFactory log

@Override
public MicroserviceRestClient getMicroserviceRestClient() {
return new MicroserviceRestTemplate(createM2MRestTemplate());
if (hasM2M(configurableBootstrapContext)) {
var client = M2MClientFactory.getM2mOkHttpClient(() -> getM2MToken(configurableBootstrapContext));
return new MicroserviceOkHttpRestClient(client);
}
return createM2MRestTemplate();
}

private RestTemplate createM2MRestTemplate() {
private MicroserviceRestClient createM2MRestTemplate() {
RestTemplate template = new RestTemplate();
SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(Timeout.ofMilliseconds(readTimeout)).build();

Expand All @@ -45,14 +50,7 @@ private RestTemplate createM2MRestTemplate() {
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);
}));
}

return template;
return new MicroserviceRestTemplate(template);
}

private String getM2MToken(ConfigurableBootstrapContext configurableBootstrapContext) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,15 @@
<artifactId>rest-security-adapters</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.netcracker.cloud</groupId>
<artifactId>microservice-restclient-okhttp</artifactId>
<version>7.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.netcracker.cloud.security.core.utils</groupId>
<artifactId>k8s-utils</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Loading
Loading