diff --git a/NOTICE b/NOTICE index 79ee441461ce0fb66f7ae3466cac261c51ecb798..96b5625e41c571d9d9f64700a543f513c1d4a2c8 100644 --- a/NOTICE +++ b/NOTICE @@ -584,13 +584,13 @@ The following software have components provided under the terms of this license: - proto-google-common-protos (from https://github.com/googleapis/java-iam/proto-google-common-protos) - proto-google-iam-v1 (from https://github.com/googleapis/java-iam/proto-google-iam-v1) - resilience4j (from https://github.com/resilience4j/resilience4j) -- resilience4j (from https://resilience4j.readme.io) -- resilience4j (from https://resilience4j.readme.io) -- resilience4j (from https://resilience4j.readme.io) - resilience4j (from https://github.com/resilience4j/resilience4j) - resilience4j (from https://github.com/resilience4j/resilience4j) +- resilience4j (from https://resilience4j.readme.io) - resilience4j (from https://github.com/resilience4j/resilience4j) - resilience4j (from https://github.com/resilience4j/resilience4j) +- resilience4j (from https://resilience4j.readme.io) +- resilience4j (from https://resilience4j.readme.io) - rxjava (from https://github.com/ReactiveX/RxJava) - spring-boot-actuator-autoconfigure (from https://spring.io/projects/spring-boot) - spring-boot-dependencies (from https://spring.io/projects/spring-boot) diff --git a/legal-core/src/main/java/org/opengroup/osdu/legal/api/LegalTagStatusJobApi.java b/legal-core/src/main/java/org/opengroup/osdu/legal/api/LegalTagStatusJobApi.java index 33103d973d81ed354babd4f579acd62971d6e12c..90099678d67d15585a135490b1d220e072f03fb4 100644 --- a/legal-core/src/main/java/org/opengroup/osdu/legal/api/LegalTagStatusJobApi.java +++ b/legal-core/src/main/java/org/opengroup/osdu/legal/api/LegalTagStatusJobApi.java @@ -51,7 +51,7 @@ public class LegalTagStatusJobApi { boolean allPassed = true; for (TenantInfo tenantInfo : tenantsInfo) { convertedHeaders.put(DpsHeaders.ACCOUNT_ID, tenantInfo.getName()); - boolean result = runJob(convertedHeaders, legalTagStatusJob); + boolean result = runJob(convertedHeaders, tenantInfo, legalTagStatusJob); if (allPassed) allPassed = result; } @@ -60,11 +60,11 @@ public class LegalTagStatusJobApi { return new ResponseEntity<HttpStatus>(status); } - private boolean runJob(DpsHeaders convertedHeaders, LegalTagStatusJob legalTagStatusJob) { + private boolean runJob(DpsHeaders convertedHeaders, TenantInfo tenantInfo, LegalTagStatusJob legalTagStatusJob) { boolean success = true; try { String projectId = requestInfo.getTenantInfo().getProjectId(); - StatusChangedTags result = legalTagStatusJob.run(projectId, convertedHeaders, requestInfo.getTenantInfo().getName()); + StatusChangedTags result = legalTagStatusJob.run(projectId, convertedHeaders, tenantInfo.getName()); auditLogger.legalTagJobRanSuccess(singletonList(result.toString())); } catch (Exception e) { success = false; diff --git a/legal-core/src/test/java/org/opengroup/osdu/legal/logging/AuditLoggerTests.java b/legal-core/src/test/java/org/opengroup/osdu/legal/logging/AuditLoggerTests.java index 5d5220ea63cd65f4f5fb707d8ea5b30a886f70bd..038a57109462879ee557368edbafd0ccc787f411 100644 --- a/legal-core/src/test/java/org/opengroup/osdu/legal/logging/AuditLoggerTests.java +++ b/legal-core/src/test/java/org/opengroup/osdu/legal/logging/AuditLoggerTests.java @@ -11,6 +11,8 @@ import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import java.util.Collections; import java.util.List; + +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -67,13 +69,15 @@ public class AuditLoggerTests { @Test public void should_writeLegalTagReadPropertiesSuccessEvent(){ - sut.readLegalPropertiesSuccess(any()); + List<String> resource = Collections.singletonList("1"); + sut.readLegalPropertiesSuccess(resource); verify(log).audit(any()); } @Test public void should_writeLegalTagReadPropertiesFailEvent(){ - sut.readLegalPropertiesFail(any()); + List<String> resource = Collections.singletonList("1"); + sut.readLegalPropertiesFail(resource); verify(log).audit(any()); } diff --git a/provider/legal-aws/build-aws/buildspec.yaml b/provider/legal-aws/build-aws/buildspec.yaml index 731961d497f3c6f072a69579f85e8bf07467fd93..4c1fa849f727704fdc922f70aa52571980947ca9 100644 --- a/provider/legal-aws/build-aws/buildspec.yaml +++ b/provider/legal-aws/build-aws/buildspec.yaml @@ -65,9 +65,9 @@ phases: - printenv - echo "Building primary service assemblies..." - - mvn -ntp -B test install sonar:sonar -pl .,legal-core,provider/legal-aws -Ddeployment.environment=prod -Dsonar.login=${SONAR_USERNAME} -Dsonar.password=${SONAR_PASSWORD} -Dsonar.branch.name=${BRANCH_NAME} + - mvn -ntp -B test install sonar:sonar -pl .,legal-core,provider/legal-aws -Ddeployment.environment=prod -Dsonar.login=${SONAR_USERNAME} -Dsonar.password=${SONAR_PASSWORD} -Dsonar.branch.name=${BRANCH_NAME} -# Suspended until further notice + # Suspended until further notice # - echo "Copying assemblies to dist..." # - cp ./provider/legal-aws/target/*spring-boot.jar ${OUTPUT_DIR}/bin # copy aws jars # - cp ./legal-core/target/*.jar ${OUTPUT_DIR}/bin # copy core jar diff --git a/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/AwsStatusChangedTag.java b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/AwsStatusChangedTag.java new file mode 100644 index 0000000000000000000000000000000000000000..e6882f4d5d0571ef2da728e5a3c08b0ead07badb --- /dev/null +++ b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/AwsStatusChangedTag.java @@ -0,0 +1,30 @@ +// Copyright © Amazon +// +// 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.legal.aws.jobs; + +import lombok.Data; +import org.opengroup.osdu.core.common.model.legal.StatusChangedTag; + +@Data +public class AwsStatusChangedTag extends StatusChangedTag { + + private String dataPartitionId; + + public AwsStatusChangedTag(String changedTagName, Enum changedTagStatus, String dataPartitionId) { + super(changedTagName, changedTagStatus); + this.dataPartitionId = dataPartitionId; + } +} + diff --git a/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/LegalTagPublisherImpl.java b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/LegalTagPublisherImpl.java index a130bd8f47d05626b8fd41b56f344d9c72c3ca74..2ba9af9c750bf3ca9d65ffd194a3f183efcc2fcc 100644 --- a/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/LegalTagPublisherImpl.java +++ b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/jobs/LegalTagPublisherImpl.java @@ -30,9 +30,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; +import javax.inject.Inject; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service public class LegalTagPublisherImpl implements ILegalTagPublisher { @@ -43,7 +45,8 @@ public class LegalTagPublisherImpl implements ILegalTagPublisher { private AmazonSNS snsClient; - + @Inject + private DpsHeaders headers; @PostConstruct public void init() throws K8sParameterNotFoundException { @@ -75,9 +78,13 @@ public class LegalTagPublisherImpl implements ILegalTagPublisher { for (int i = 0; i < tags.getStatusChangedTags().size(); i += BATCH_SIZE){ List<StatusChangedTag> batch = tags.getStatusChangedTags().subList(i, Math.min(tags.getStatusChangedTags().size(), i + BATCH_SIZE)); - PublishRequestBuilder<StatusChangedTag> publishRequestBuilder = new PublishRequestBuilder<>(); + List<AwsStatusChangedTag> awsBatch = batch.stream() + .map(t -> new AwsStatusChangedTag(t.getChangedTagName(), t.getChangedTagStatus(), headers.getPartitionId())) + .collect(Collectors.toList()); + + PublishRequestBuilder<AwsStatusChangedTag> publishRequestBuilder = new PublishRequestBuilder<>(); PublishRequest publishRequest = publishRequestBuilder.generatePublishRequest("statusChangedTags", - batch, messageAttributes, amazonSNSTopic); + awsBatch, messageAttributes, amazonSNSTopic); snsClient.publish(publishRequest); } } diff --git a/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryFactoryAwsImpl.java b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryFactoryAwsImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..48e66dc459d54231991004ec4bad30f61f2ae521 --- /dev/null +++ b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryFactoryAwsImpl.java @@ -0,0 +1,50 @@ +package org.opengroup.osdu.legal.aws.tags.dataaccess; + + +import org.apache.commons.lang3.StringUtils; +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.tenant.TenantInfo; +import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory; +import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository; +import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepositoryFactory; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; +import org.springframework.web.context.annotation.RequestScope; + +import javax.inject.Inject; + +@Service +@Primary +@RequestScope +public class LegalTagRepositoryFactoryAwsImpl implements ILegalTagRepositoryFactory { + + + private TenantInfo tenantInfo; + private ITenantFactory tenantFactory; + + @Inject + LegalTagRepositoryImpl repoImpl; + + public LegalTagRepositoryFactoryAwsImpl(TenantInfo tenantInfo, ITenantFactory tenantFactory) { + this.tenantInfo = tenantInfo; + this.tenantFactory = tenantFactory; + } + + @Override + public ILegalTagRepository get(String tenantName) { + if (StringUtils.isBlank(tenantName)) { + throw invalidTenantGivenException(tenantName); + } + TenantInfo tenantInfo = tenantFactory.getTenantInfo(tenantName); + repoImpl.setTenantInfo(tenantInfo); + + return repoImpl; + } + + AppException invalidTenantGivenException(String tenantName) { + return new AppException(403, "Forbidden", + String.format("You do not have access to the %s value given %s", + DpsHeaders.ACCOUNT_ID, tenantName)); + } +} diff --git a/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryImpl.java b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryImpl.java index 8bebf9171b396f42a6e3f5fe3d892d9ead0d3ed3..691a0e76c08f9a8154c91ba819119ec64811a4f5 100644 --- a/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryImpl.java +++ b/provider/legal-aws/src/main/java/org/opengroup/osdu/legal/aws/tags/dataaccess/LegalTagRepositoryImpl.java @@ -21,14 +21,19 @@ import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelper; import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelperFactory; import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelperV2; import org.opengroup.osdu.core.aws.dynamodb.QueryPageResult; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.legal.ListLegalTagArgs; import org.opengroup.osdu.core.common.model.legal.LegalTag; import org.opengroup.osdu.core.common.model.http.AppException; +import org.opengroup.osdu.core.common.model.tenant.TenantInfo; +import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory; import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Repository; +import org.springframework.web.context.annotation.RequestScope; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -36,19 +41,38 @@ import java.io.UnsupportedEncodingException; import java.util.*; @Repository // why use repository over component over service +@RequestScope public class LegalTagRepositoryImpl implements ILegalTagRepository { @Inject private DpsHeaders headers; + @Inject + private JaxRsDpsLog log; + + private TenantInfo tenantInfo; + @Inject private DynamoDBQueryHelperFactory dynamoDBQueryHelperFactory; @Value("${aws.dynamodb.legalTable.ssm.relativePath}") String legalRepositoryTableParameterRelativePath; + public void setTenantInfo(TenantInfo tenantInfo) { + this.tenantInfo = tenantInfo; + } + + private String getDataPartitionId(){ + if(this.tenantInfo == null){ + log.warning("TenantInfo found to be null, defaulting to partition in headers"); + return headers.getPartitionId(); + } + return tenantInfo.getDataPartitionId(); + } + private DynamoDBQueryHelperV2 getLegalRepositoryQueryHelper() { - return dynamoDBQueryHelperFactory.getQueryHelperForPartition(headers, legalRepositoryTableParameterRelativePath); + String dataPartitionId = getDataPartitionId(); + return dynamoDBQueryHelperFactory.getQueryHelperForPartition(dataPartitionId, legalRepositoryTableParameterRelativePath); } @@ -72,7 +96,7 @@ public class LegalTagRepositoryImpl implements ILegalTagRepository { List<LegalTag> tags = new ArrayList<>(); for(long id: ids) { - LegalDoc ld = queryHelper.loadByPrimaryKey(LegalDoc.class, String.valueOf(id), headers.getPartitionId()); //dynamoDBLegal.findById(String.valueOf(id)); + LegalDoc ld = queryHelper.loadByPrimaryKey(LegalDoc.class, String.valueOf(id), getDataPartitionId()); //dynamoDBLegal.findById(String.valueOf(id)); if(ld != null) { tags.add(CreateLegalTagFromDoc(ld)); } @@ -87,7 +111,7 @@ public class LegalTagRepositoryImpl implements ILegalTagRepository { Boolean result = true; try { - queryHelper.deleteByPrimaryKey(LegalDoc.class, String.valueOf(legalTag.getId()), headers.getPartitionId()); + queryHelper.deleteByPrimaryKey(LegalDoc.class, String.valueOf(legalTag.getId()), getDataPartitionId()); } catch (Exception e){ // should be dynamodb specific exception result = false; // might need to throw app exception @@ -108,7 +132,7 @@ public class LegalTagRepositoryImpl implements ILegalTagRepository { String filterExpression = "dataPartitionId = :partitionId"; - AttributeValue dataPartitionAttributeValue = new AttributeValue(headers.getPartitionId()); + AttributeValue dataPartitionAttributeValue = new AttributeValue(getDataPartitionId()); Map<String, AttributeValue> eav = new HashMap<>(); eav.put(":partitionId", dataPartitionAttributeValue); @@ -162,7 +186,7 @@ public class LegalTagRepositoryImpl implements ILegalTagRepository { private LegalDoc CreateLegalDocFromTag(LegalTag legalTag){ LegalDoc legalDoc = new LegalDoc(); legalDoc.setId(String.valueOf(legalTag.getId())); - legalDoc.setDataPartitionId(headers.getPartitionId()); + legalDoc.setDataPartitionId(getDataPartitionId()); legalDoc.setDescription(legalTag.getDescription()); legalDoc.setName(legalTag.getName()); legalDoc.setProperties(legalTag.getProperties()); diff --git a/provider/legal-aws/src/test/java/org/opengroup/osdu/legal/aws/api/LegalTagRepositoryImplTest.java b/provider/legal-aws/src/test/java/org/opengroup/osdu/legal/aws/api/LegalTagRepositoryImplTest.java index 03abdf8a4fc174d53cb97277702cdfe958ca5694..3e6ed3ddbeca985535a074bed207b3ca700ee3ae 100644 --- a/provider/legal-aws/src/test/java/org/opengroup/osdu/legal/aws/api/LegalTagRepositoryImplTest.java +++ b/provider/legal-aws/src/test/java/org/opengroup/osdu/legal/aws/api/LegalTagRepositoryImplTest.java @@ -24,6 +24,7 @@ import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelper; import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelperFactory; import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelperV2; import org.opengroup.osdu.core.aws.dynamodb.QueryPageResult; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.legal.aws.tags.dataaccess.LegalDoc; import org.opengroup.osdu.legal.aws.tags.dataaccess.LegalTagRepositoryImpl; @@ -50,14 +51,20 @@ public class LegalTagRepositoryImplTest { @Mock private DpsHeaders headers; + @Mock + private JaxRsDpsLog log; + @Mock private DynamoDBQueryHelperFactory dynamoDBQueryHelperFactory; @Before public void setUp() { initMocks(this); - Mockito.when(dynamoDBQueryHelperFactory.getQueryHelperForPartition(Mockito.any(DpsHeaders.class), Mockito.any())) + String testPartition = "test-partition"; + Mockito.when(dynamoDBQueryHelperFactory.getQueryHelperForPartition(Mockito.eq(testPartition), Mockito.any())) .thenReturn(queryHelper); + Mockito.when(headers.getPartitionId()) + .thenReturn(testPartition); } @Test diff --git a/testing/legal-test-aws/build-aws/prepare-dist.sh b/testing/legal-test-aws/build-aws/prepare-dist.sh index baa16e0c8f465655d25f1dfd39bd6789ce553f85..367e34d3f5a089808d207d80311de3265ba7f413 100755 --- a/testing/legal-test-aws/build-aws/prepare-dist.sh +++ b/testing/legal-test-aws/build-aws/prepare-dist.sh @@ -21,7 +21,8 @@ echo $INTEGRATION_TEST_OUTPUT_BIN_DIR rm -rf "$INTEGRATION_TEST_OUTPUT_DIR" mkdir -p "$INTEGRATION_TEST_OUTPUT_DIR" && mkdir -p "$INTEGRATION_TEST_OUTPUT_BIN_DIR" echo "Building integration testing assemblies and gathering artifacts..." -mvn -ntp install -f "$INTEGRATION_TEST_SOURCE_DIR_CORE"/pom.xml +mvn -ntp clean install -DskipTests -f "$INTEGRATION_TEST_SOURCE_DIR/pom.xml" -pl legal-test-core,legal-test-aws -am +# mvn -ntp install -f "$INTEGRATION_TEST_SOURCE_DIR_CORE"/pom.xml mvn -ntp install dependency:copy-dependencies -DskipTests -f "$INTEGRATION_TEST_SOURCE_DIR_AWS"/pom.xml -DincludeGroupIds=org.opengroup.osdu -Dmdep.copyPom cp "$INTEGRATION_TEST_SOURCE_DIR_AWS"/target/dependency/* "${INTEGRATION_TEST_OUTPUT_BIN_DIR}" (cd "${INTEGRATION_TEST_OUTPUT_BIN_DIR}" && ls *.jar | sed -e 's/\.jar$//' | xargs -I {} echo mvn -ntp install:install-file -Dfile={}.jar -DpomFile={}.pom >> install-deps.sh) diff --git a/testing/legal-test-aws/src/test/java/org/opengroup/osdu/legal/util/AwsSqsHelper.java b/testing/legal-test-aws/src/test/java/org/opengroup/osdu/legal/util/AwsSqsHelper.java index fef96a52ca439098a9034702b901fe4d81d46c36..0a1c0b31ac68c86d0f5bcaf04f13759301e21259 100644 --- a/testing/legal-test-aws/src/test/java/org/opengroup/osdu/legal/util/AwsSqsHelper.java +++ b/testing/legal-test-aws/src/test/java/org/opengroup/osdu/legal/util/AwsSqsHelper.java @@ -49,7 +49,7 @@ public class AwsSqsHelper { // comes wrapped in non-escaped double quotes data = data.substring(1); data = data.substring(0, data.length() - 1); - String dataCheck = "{\"statusChangedTags\":[{\"changedTagName\":\"" + name + "\",\"changedTagStatus\":\"incompliant\"}]}"; + String dataCheck = "{\"statusChangedTags\":[{\"dataPartitionId\":\"" + TestUtils.getMyDataPartition() + "\",\"changedTagName\":\"" + name + "\",\"changedTagStatus\":\"incompliant\"}]}"; dataCheck = dataCheck.replaceAll("\"", "\\\\\""); return data.equals(dataCheck); }