diff --git a/pom.xml b/pom.xml index e495d6d5965f7d506a5fc16480a0337b0f7fc0f2..02c9367fb1be28adb3d999eb191c9196de688c55 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ <maven.compiler.source>17</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <openapi.version>2.6.0</openapi.version> - <os-core-common.version>3.1.1</os-core-common.version> + <os-core-common.version>3.2.0</os-core-common.version> <gson.version>2.8.9</gson.version> <json-smart.version>2.5.0</json-smart.version> <netty.version>4.1.97.Final</netty.version> diff --git a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/config/RegisterAccessGroups.java b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/config/RegisterAccessGroups.java new file mode 100644 index 0000000000000000000000000000000000000000..f0683a9086744affcc29403fd030ee7aa33da0ed --- /dev/null +++ b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/config/RegisterAccessGroups.java @@ -0,0 +1,35 @@ +/* + Copyright 2020-2024 Google LLC + Copyright 2020-2024 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package org.opengroup.osdu.register.provider.gcp.config; + +import org.opengroup.osdu.core.common.secret.AccessGroups; + +public class RegisterAccessGroups implements AccessGroups { + private static final String REGISTER_SECRET_OWNERS_GROUP = "register.secret.owners"; + private static final String REGISTER_SECRET_VIEWERS_GROUP = "register.secret.viewers"; + + @Override + public String accessOwnersGroup() { + return REGISTER_SECRET_OWNERS_GROUP; + } + + @Override + public String accessViewersGroup() { + return REGISTER_SECRET_VIEWERS_GROUP; + } +} diff --git a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClient.java b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/config/SecretApiConfiguration.java similarity index 54% rename from provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClient.java rename to provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/config/SecretApiConfiguration.java index f88799a131ffe0f28808c9cfed841aae99f05657..b7f68915fd756be7c7887a1e6ec245e331f8ae8c 100644 --- a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClient.java +++ b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/config/SecretApiConfiguration.java @@ -15,17 +15,20 @@ limitations under the License. */ -package org.opengroup.osdu.register.provider.gcp.secret; +package org.opengroup.osdu.register.provider.gcp.config; -import org.opengroup.osdu.core.common.model.secret.SecretModel; +import org.opengroup.osdu.core.common.secret.AccessGroups; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; -public interface SecretClient { +@Configuration +public class SecretApiConfiguration { - SecretModel retrieveSecret(String secretKey); + @Autowired public RegisterConfigurationProperties configurationProperties; - SecretModel createSecret(String secretKey, String secretValue); - - SecretModel updateSecret(String secretKey, String secretValue); - - void removeSecret(String secretKey); + @Bean + public AccessGroups accessGroups() { + return new RegisterAccessGroups(); + } } diff --git a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClientImpl.java b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClientImpl.java deleted file mode 100644 index 5478cbcb9763d5979b3bf510c7a98e031c901936..0000000000000000000000000000000000000000 --- a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClientImpl.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - Copyright 2020-2024 Google LLC - Copyright 2020-2024 EPAM Systems, Inc - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package org.opengroup.osdu.register.provider.gcp.secret; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import java.net.URI; -import java.time.OffsetDateTime; -import java.util.HashMap; -import java.util.Map; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.HttpStatus; -import org.opengroup.osdu.core.common.http.HttpRequest; -import org.opengroup.osdu.core.common.http.HttpResponse; -import org.opengroup.osdu.core.common.http.IHttpClient; -import org.opengroup.osdu.core.common.model.entitlements.Acl; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.core.common.model.secret.SecretModel; -import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; -import org.opengroup.osdu.register.provider.gcp.config.RegisterConfigurationProperties; -import org.opengroup.osdu.register.provider.gcp.constant.RegisterConstants; -import org.opengroup.osdu.register.provider.gcp.gson.OffsetDateTimeAdapter; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; - -// Todo: move it to core-common -@Slf4j -@Service -@RequiredArgsConstructor -public class SecretClientImpl implements SecretClient { - - private static final String HTTP_CODE_STRING = "HTTP code = %s."; - private static final String INTERNAL_SERVER_ERROR_STRING = "Internal Server Error."; - - private final RegisterConfigurationProperties configurationProperties; - private final IHttpClient httpClient; - private final DpsHeaders dpsHeaders; - private final IServiceAccountJwtClient serviceAccountJwtClient; - - private final Gson gson = - new GsonBuilder() - .registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeAdapter()) - .create(); - - @Override - public SecretModel retrieveSecret(String secretKey) { - String url = createUrl(secretKey); - Map<String, String> headers = buildHttpHeaders(); - HttpRequest request = HttpRequest.get().url(url).headers(headers).build(); - - HttpResponse response = httpClient.send(request); - - log.debug(HTTP_CODE_STRING.formatted(response.getResponseCode())); - - checkHttpResponse(response.getResponseCode()); - - return getSecretModel(response); - } - - @Override - public SecretModel createSecret(String secretKey, String secretValue) { - String url = createUrl(); - SecretModel secret = - SecretModel.builder() - .id(secretKey) - .value(secretValue) - .isEnabled(true) - .secretAcls(buildAcl()) - .build(); - Map<String, String> headers = buildHttpHeaders(); - HttpRequest request = HttpRequest.post(secret).url(url).headers(headers).build(); - - HttpResponse response = httpClient.send(request); - - log.debug(HTTP_CODE_STRING.formatted(response.getResponseCode())); - - return getSecretModel(response); - } - - private Acl buildAcl() { - String partitionId = dpsHeaders.getPartitionId(); - String domain = configurationProperties.getDomain(); - - String ownersAcl = - String.format( - "%s@%s.%s", RegisterConstants.REGISTER_SECRET_OWNERS_GROUP, partitionId, domain); - - String viewersAcl = - String.format( - "%s@%s.%s", RegisterConstants.REGISTER_SECRET_VIEWERS_GROUP, partitionId, domain); - - return new Acl(new String[] {viewersAcl}, new String[] {ownersAcl}); - } - - @Override - public SecretModel updateSecret(String secretKey, String secretValue) { - String url = createUrl(secretKey); - Map<String, String> headers = buildHttpHeaders(); - SecretModel secret = - SecretModel.builder() - .id(secretKey) - .value(secretValue) - .secretAcls(buildAcl()) - .isEnabled(true) - .build(); - HttpRequest request = HttpRequest.patch(secret).url(url).headers(headers).build(); - - HttpResponse response = httpClient.send(request); - - checkHttpResponse(response.getResponseCode()); - - log.debug(HTTP_CODE_STRING.formatted(response.getResponseCode())); - - return getSecretModel(response); - } - - private void checkHttpResponse(int responseCode) { - if (responseCode != HttpStatus.SC_OK && responseCode != HttpStatus.SC_NO_CONTENT) { - throw new AppException( - HttpStatus.SC_INTERNAL_SERVER_ERROR, - INTERNAL_SERVER_ERROR_STRING, - INTERNAL_SERVER_ERROR_STRING); - } - } - - @Override - public void removeSecret(String secretKey) { - String url = createUrl(secretKey); - Map<String, String> headers = buildHttpHeaders(); - HttpRequest request = HttpRequest.delete().url(url).headers(headers).build(); - - HttpResponse response = httpClient.send(request); - - log.debug(HTTP_CODE_STRING.formatted(response.getResponseCode())); - - checkHttpResponse(response.getResponseCode()); - } - - private String createUrl() { - return createUrl(null); - } - - private String createUrl(String secretName) { - String path = - (secretName == null || secretName.isEmpty()) - ? "/secrets" - : String.format("/secrets/%s", secretName); - return URI.create(configurationProperties.getSecretApi() + path).normalize().toString(); - } - - private Map<String, String> buildHttpHeaders() { - Map<String, String> headers = new HashMap<>(); - - headers.put(DpsHeaders.DATA_PARTITION_ID, dpsHeaders.getPartitionId()); - headers.put( - HttpHeaders.AUTHORIZATION, serviceAccountJwtClient.getIdToken(dpsHeaders.getPartitionId())); - headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); - return headers; - } - - private SecretModel getSecretModel(HttpResponse response) { - try { - return gson.fromJson(response.getBody(), SecretModel.class); - } catch (Exception e) { - throw new AppException( - HttpStatus.SC_INTERNAL_SERVER_ERROR, INTERNAL_SERVER_ERROR_STRING, e.getMessage(), e); - } - } -} diff --git a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccess.java b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccess.java index e5b41e764643fa0bbace3b9734cbbd585bfe4bb2..dbec9399f5202826c8b12d5fbb31100497e533eb 100644 --- a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccess.java +++ b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccess.java @@ -31,8 +31,13 @@ import java.util.concurrent.locks.ReentrantLock; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.model.secret.SecretModel; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.tenant.TenantInfo; +import org.opengroup.osdu.core.common.secret.AccessGroups; +import org.opengroup.osdu.core.common.secret.SecretClient; +import org.opengroup.osdu.core.common.secret.SecretClientFactory; +import org.opengroup.osdu.core.common.secret.SecretModel; +import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriverRuntimeException; import org.opengroup.osdu.core.gcp.oqm.model.OqmSubscription; import org.opengroup.osdu.core.gcp.oqm.model.OqmTopic; @@ -43,7 +48,6 @@ import org.opengroup.osdu.core.gcp.osm.model.query.GetQuery; import org.opengroup.osdu.core.gcp.osm.service.Context; import org.opengroup.osdu.core.gcp.osm.service.Transaction; import org.opengroup.osdu.core.gcp.osm.translate.ExceptionClassifier; -import org.opengroup.osdu.register.provider.gcp.secret.SecretClient; import org.opengroup.osdu.register.provider.gcp.subscriber.model.SubscriptionDto; import org.opengroup.osdu.register.subscriber.model.*; import org.opengroup.osdu.register.utils.Constants; @@ -63,8 +67,11 @@ public class OsmAccess implements IDatastoreAccess { private final Context context; private final TenantInfo tenantInfo; - private final SecretClient secretClient; private final SubscriptionEventPublisher publisher; + private final SecretClientFactory secretFactory; + private final IServiceAccountJwtClient tokenService; + private final DpsHeaders dpsHeaders; + private final AccessGroups accessGroups; ReentrantLock subscriptionDeleteLock = new ReentrantLock(); @@ -158,6 +165,7 @@ public class OsmAccess implements IDatastoreAccess { "A subscriber already exists with the same topic and endpoint combination"); subscriptionRequest.setCreatedOnEpoch(new Timestamp(System.currentTimeMillis())); + SecretClient secretClient = secretFactory.create(dpsHeaders, tokenService, accessGroups); secretClient.createSecret( generateID(subscriptionRequest.getId()), subscriptionRequest.getSecretValue()); Subscription createdSubscription = @@ -202,6 +210,7 @@ public class OsmAccess implements IDatastoreAccess { new GetQuery<>(SubscriptionDto.class, getDestination(), eq("id", id)); SubscriptionDto existingSubscription = context.getOne(q); if (existingSubscription != null) { + SecretClient secretClient = secretFactory.create(dpsHeaders, tokenService, accessGroups); secretClient.removeSecret(generateID(id)); context.deleteById(SubscriptionDto.class, getDestination(), id); publisher.sendSubscriptionLifecycleEvent( @@ -244,6 +253,7 @@ public class OsmAccess implements IDatastoreAccess { if (existingSubscription != null) { Subscription updatedSubscriptionRequest = getSubscriptionByDto(existingSubscription); updatedSubscriptionRequest.setSecret(secret); + SecretClient secretClient = secretFactory.create(dpsHeaders, tokenService, accessGroups); secretClient.updateSecret( generateID(updatedSubscriptionRequest.getId()), secret.toString()); context.upsert(getDtoBySubscription(updatedSubscriptionRequest), getDestination()); @@ -288,7 +298,7 @@ public class OsmAccess implements IDatastoreAccess { BeanUtils.copyProperties(subscriptionDto, subscription); if (!Strings.isNullOrEmpty(subscriptionDto.getSecretType())) { - + SecretClient secretClient = secretFactory.create(dpsHeaders, tokenService, accessGroups); SecretModel secretModel = secretClient.retrieveSecret(generateID(subscriptionDto.getId())); if (subscriptionDto.getSecretType().equals(Constants.GSASecret)) { GsaSecret gsaSecret = new GsaSecret(); diff --git a/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/util/SecretFactory.java b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/util/SecretFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..a081d2d5a87bd383984e41452560fab33a7f66af --- /dev/null +++ b/provider/register-gc/src/main/java/org/opengroup/osdu/register/provider/gcp/util/SecretFactory.java @@ -0,0 +1,47 @@ +/* + Copyright 2020-2024 Google LLC + Copyright 2020-2024 EPAM Systems, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package org.opengroup.osdu.register.provider.gcp.util; + +import org.opengroup.osdu.core.common.secret.SecretAPIConfig; +import org.opengroup.osdu.core.common.secret.SecretClientFactory; +import org.opengroup.osdu.core.common.secret.SecretClientFactoryImpl; +import org.opengroup.osdu.register.provider.gcp.config.RegisterConfigurationProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AbstractFactoryBean; +import org.springframework.stereotype.Component; + +@Component +public class SecretFactory extends AbstractFactoryBean<SecretClientFactory> { + + @Autowired private RegisterConfigurationProperties serviceConfig; + + @Override + public Class<?> getObjectType() { + return SecretClientFactory.class; + } + + @Override + protected SecretClientFactory createInstance() throws Exception { + SecretAPIConfig apiConfig = + SecretAPIConfig.builder() + .secretApi(serviceConfig.getSecretApi()) + .domain(serviceConfig.getDomain()) + .build(); + return new SecretClientFactoryImpl(apiConfig); + } +} diff --git a/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClientTest.java b/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClientTest.java deleted file mode 100644 index a9a3a4898a1066e77c8cde117b011c7a7e326914..0000000000000000000000000000000000000000 --- a/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/secret/SecretClientTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - Copyright 2020-2024 Google LLC - Copyright 2020-2024 EPAM Systems, Inc - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package org.opengroup.osdu.register.provider.gcp.secret; - -import static org.junit.Assert.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -import com.google.gson.Gson; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.opengroup.osdu.core.common.http.HttpRequest; -import org.opengroup.osdu.core.common.http.HttpResponse; -import org.opengroup.osdu.core.common.http.IHttpClient; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.core.common.model.secret.SecretModel; -import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; -import org.opengroup.osdu.register.provider.gcp.config.RegisterConfigurationProperties; - -@RunWith(MockitoJUnitRunner.class) -public class SecretClientTest { - - private static final String SECRET_KEY_1_VAL = "secret_key_1"; - private static final String SECRET_VALUE_1_VAL = "secret_value_1"; - private static final String SECRET_VALUE_2_VAL = "secret_value_2"; - private static final String TENANT_1_VAL = "tenant_1"; - private static final String TOKEN_1_VAL = "token_1"; - private static final String SECRET_API = "secret_host"; - - @Mock private RegisterConfigurationProperties configurationProperties; - - @Mock private DpsHeaders dpsHeaders; - - @Mock private IServiceAccountJwtClient tokenService; - - @Mock private IHttpClient httpClient; - - @InjectMocks private SecretClientImpl secretClient; - - @Before - public void setUp() { - when(dpsHeaders.getPartitionId()).thenReturn(TENANT_1_VAL); - when(tokenService.getIdToken(any())).thenReturn(TOKEN_1_VAL); - when(configurationProperties.getSecretApi()).thenReturn(SECRET_API); - } - - @Test - public void createSecretTest() { - SecretModel expectedResult = - SecretModel.builder() - .id(SECRET_KEY_1_VAL) - .value(SECRET_VALUE_1_VAL) - .isEnabled(true) - .build(); - HttpResponse httpResponse = createHttpResponse(expectedResult, 200); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - SecretModel actualResult = secretClient.createSecret(SECRET_KEY_1_VAL, SECRET_VALUE_1_VAL); - - assertEquals(expectedResult, actualResult); - } - - @Test - public void exceptionCreateSecretTest() { - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setBody("invalid_body"); - httpResponse.setResponseCode(404); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - assertThrows( - AppException.class, () -> secretClient.createSecret(SECRET_KEY_1_VAL, SECRET_VALUE_1_VAL)); - } - - @Test - public void retrieveSecretTest() { - SecretModel expectedResult = - SecretModel.builder() - .id(SECRET_KEY_1_VAL) - .value(SECRET_VALUE_1_VAL) - .isEnabled(true) - .build(); - HttpResponse httpResponse = createHttpResponse(expectedResult, 200); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - SecretModel actualResult = secretClient.retrieveSecret(SECRET_KEY_1_VAL); - - assertEquals(expectedResult, actualResult); - } - - @Test - public void exceptionRetrieveSecretTest() { - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(404); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - assertThrows(AppException.class, () -> secretClient.retrieveSecret(SECRET_KEY_1_VAL)); - } - - @Test - public void updateSecretTest() { - SecretModel expectedResult = - SecretModel.builder() - .id(SECRET_KEY_1_VAL) - .value(SECRET_VALUE_2_VAL) - .isEnabled(true) - .build(); - HttpResponse httpResponse = createHttpResponse(expectedResult, 200); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - SecretModel actualResult = secretClient.updateSecret(SECRET_KEY_1_VAL, SECRET_VALUE_2_VAL); - - assertEquals(expectedResult, actualResult); - } - - @Test - public void exceptionUpdateSecretTest() { - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(404); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - assertThrows( - AppException.class, () -> secretClient.updateSecret(SECRET_KEY_1_VAL, SECRET_VALUE_2_VAL)); - } - - @Test - public void removeSecretTest() { - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(200); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - secretClient.removeSecret(SECRET_KEY_1_VAL); - } - - @Test - public void exceptionRemoveSecretTest() { - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(404); - - when(httpClient.send(any(HttpRequest.class))).thenReturn(httpResponse); - - assertThrows(AppException.class, () -> secretClient.removeSecret(SECRET_KEY_1_VAL)); - } - - private HttpResponse createHttpResponse(SecretModel secretModel, int responseCode) { - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setBody((new Gson()).toJson(secretModel)); - httpResponse.setResponseCode(responseCode); - return httpResponse; - } -} diff --git a/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccessTest.java b/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccessTest.java index 44ffc570a12c11fc70dd1d13b9756dc8f5b7fb0b..655206ed5df54e1960d1090854317682bbc654cf 100644 --- a/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccessTest.java +++ b/provider/register-gc/src/test/java/org/opengroup/osdu/register/provider/gcp/subscriber/OsmAccessTest.java @@ -44,12 +44,14 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.tenant.TenantInfo; +import org.opengroup.osdu.core.common.secret.SecretClient; +import org.opengroup.osdu.core.common.secret.SecretClientFactory; import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriverRuntimeException; import org.opengroup.osdu.core.gcp.osm.model.query.GetQuery; import org.opengroup.osdu.core.gcp.osm.service.Transaction; import org.opengroup.osdu.core.gcp.osm.translate.ExceptionClassifier.ExceptionClassification; -import org.opengroup.osdu.register.provider.gcp.secret.SecretClient; import org.opengroup.osdu.register.provider.gcp.subscriber.model.SubscriptionDto; +import org.opengroup.osdu.register.provider.gcp.util.SecretFactory; import org.opengroup.osdu.register.subscriber.model.GsaSecret; import org.opengroup.osdu.register.subscriber.model.GsaSecretValue; import org.opengroup.osdu.register.subscriber.model.Secret; @@ -98,6 +100,9 @@ class OsmAccessTest { @Mock private Transaction transaction; + @Mock + private SecretClientFactory secretFactory; + @Mock private SubscriptionEventPublisher publisher; @@ -115,6 +120,7 @@ class OsmAccessTest { void getReturnsSubscriptionFroHmacSecret() { SubscriptionDto existingSubscription = buildSubscriptionDto(Constants.HMACSecret); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); when(context.getOne(any())).thenReturn(existingSubscription); when(secretClient.retrieveSecret(any()).getValue()).thenReturn(S_HMAC_SECRET); @@ -129,6 +135,7 @@ class OsmAccessTest { SubscriptionDto existingSubscription = buildSubscriptionDto(Constants.GSASecret); when(context.getOne(any())).thenReturn(existingSubscription); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); when(secretClient.retrieveSecret(any()).getValue()).thenReturn(S_GSA_SECRET); Subscription subscription = osmAccess.get(S_ID); @@ -142,6 +149,7 @@ class OsmAccessTest { SubscriptionDto existingSubscription = buildSubscriptionDto(Constants.HMACSecret); when(context.getResultsAsList(any())).thenReturn(List.of(existingSubscription)); when(secretClient.retrieveSecret(any()).getValue()).thenReturn(S_HMAC_SECRET); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); List<Subscription> subscriptionList = osmAccess.query(S_NOTIFICATION); @@ -166,6 +174,7 @@ class OsmAccessTest { void delete() { when(context.beginTransaction(any())).thenReturn(transaction); when(context.getOne(any())).thenReturn(buildSubscriptionDto(Constants.HMACSecret)); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); boolean result = osmAccess.delete(S_ID); @@ -182,6 +191,7 @@ class OsmAccessTest { when(context.beginTransaction(any())).thenReturn(transaction); when(context.getOne(any())).thenReturn(buildSubscriptionDto(Constants.HMACSecret)); when(context.classifyException(any())).thenReturn(exceptionClassification); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); doThrow(new RuntimeException()).when(context) .deleteById(eq(SubscriptionDto.class), any(), eq(S_ID)); @@ -217,6 +227,7 @@ class OsmAccessTest { void create() { when(context.beginTransaction(any())).thenReturn(transaction); when(context.createAndGet(any(), any())).thenReturn(buildSubscriptionDto(Constants.HMACSecret)); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); osmAccess.create(buildSubscription(Constants.HMACSecret)); @@ -228,6 +239,7 @@ class OsmAccessTest { @Test void createSetsNewTimestamp() { when(context.beginTransaction(any())).thenReturn(transaction); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); Subscription subscription = buildSubscription(Constants.HMACSecret); Timestamp timestamp = subscription.getCreatedOnEpoch(); @@ -247,6 +259,7 @@ class OsmAccessTest { void createWithException(ExceptionClassification exceptionClassification) { when(context.beginTransaction(any())).thenReturn(transaction); when(context.classifyException(any())).thenReturn(exceptionClassification); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); doThrow(new RuntimeException()).when(context).createAndGet(any(), any()); try { @@ -265,6 +278,7 @@ class OsmAccessTest { void patch() { when(context.beginTransaction(any())).thenReturn(transaction); when(context.getOne(any())).thenReturn(buildSubscriptionDto(Constants.HMACSecret)); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); Secret secret = new HmacSecret(S_NEW_SECRET_KEY); boolean result = osmAccess.patch(S_ID, secret); @@ -297,6 +311,7 @@ class OsmAccessTest { when(context.beginTransaction(any())).thenReturn(transaction); when(context.getOne(any())).thenReturn(buildSubscriptionDto(Constants.HMACSecret)); when(context.classifyException(any())).thenReturn(exceptionClassification); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); doThrow(new RuntimeException()).when(context).upsert(any(), any()); try { @@ -317,6 +332,7 @@ class OsmAccessTest { SubscriptionDto dto2 = buildSubscriptionDto(Constants.HMACSecret); dto2.setId(S_SECOND_ID); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); when(context.getResultsAsList(ArgumentMatchers.<GetQuery<SubscriptionDto>>any())) .thenReturn(List.of(dto1, dto2)); @@ -335,6 +351,7 @@ class OsmAccessTest { when(context.getResultsAsList(ArgumentMatchers.<GetQuery<SubscriptionDto>>any())) .thenReturn(List.of(dto1, dto2)); + when(secretFactory.create(any(), any(), any())).thenReturn(secretClient); when(secretClient.retrieveSecret(any()).getValue()) .thenReturn(S_HMAC_SECRET) diff --git a/testing/register-test-gc/pom.xml b/testing/register-test-gc/pom.xml index 1bc0867146bc2ec75a30d3e4ef86d4bf1a61e2f9..8c6404c88c3b2fbb93452e3247e1ec4c213cece1 100644 --- a/testing/register-test-gc/pom.xml +++ b/testing/register-test-gc/pom.xml @@ -41,7 +41,7 @@ <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> - <version>1.18.26</version> + <version>1.18.34</version> </dependency> <dependency> <groupId>jakarta.json</groupId>