diff --git a/provider/storage-aws/src/main/resources/application.properties b/provider/storage-aws/src/main/resources/application.properties index d4dfdaabab5dd796c1c269350f0aee86f1a0398c..622f233db92cd837a4fc73854c1a9805e3f38ac1 100644 --- a/provider/storage-aws/src/main/resources/application.properties +++ b/provider/storage-aws/src/main/resources/application.properties @@ -61,7 +61,6 @@ POLICY_API=${POLICY_BASE_URL}/api/policy/v1 POLICY_ID=storage PARTITION_API=${PARTITION_BASE_URL}/api/partition/v1 opa.opa-endpoint=${OPA_URL} -opa.enabled=${OPA_ENABLED} spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration # https://community.opengroup.org/osdu/platform/system/storage/-/issues/122 @@ -83,4 +82,7 @@ server.tomcat.threads.max=${TOMCAT_THREADS_MAX:300} #Collaboration context feature flag name : properties specific collaborations-enabled=true +featureFlag.strategy=appProperty +featureFlag.opa.enabled=${OPA_ENABLED:false} + diff --git a/provider/storage-azure/src/main/resources/application.properties b/provider/storage-azure/src/main/resources/application.properties index ab10532779c003f690da4805ed9c9b7a6c7e0299..8ca281c130acf2306b58138ab3b1282e8f4b94b9 100644 --- a/provider/storage-azure/src/main/resources/application.properties +++ b/provider/storage-azure/src/main/resources/application.properties @@ -104,7 +104,6 @@ management.server.port=8081 service.policy.enabled=true POLICY_API=${policy_service_endpoint} opa.opa-endpoint=${opa_endpoint} -opa.enabled=${opa_enabled} #Temporary record id length restriction record-id.max.length=1024 @@ -125,6 +124,8 @@ azure.pubsub.publish=true #Collaboration context featureflag name:partition specific featureFlag.strategy=dataPartition +featureFlag.opa.enabled=${OPA_ENABLED:false} + collaborationFilter.excludedPaths=info,liveness_check,swagger,swagger-ui/swagger-ui.css,swagger-ui/swagger-ui-standalone-preset.js,api-docs,api-docs.yaml,api-docs/swagger-config # To enable the full server path url in OpenAPI Swagger diff --git a/provider/storage-gc/docs/anthos/README.md b/provider/storage-gc/docs/anthos/README.md index a861f51d1ad0a29af3d6eb926dd8beb67f0848dd..3afb8034045d1c987824692fe6e935448a7af7b7 100644 --- a/provider/storage-gc/docs/anthos/README.md +++ b/provider/storage-gc/docs/anthos/README.md @@ -53,6 +53,7 @@ Must have: | `POLICY_ID` | ex `search` | policeId from ex `http://localhost:8080/api/policy/v1/policies`. Look at `POLICY_API` | no | - | | `PARTITION_API` | ex `http://localhost:8081/api/partition/v1` | Partition service endpoint | no | - | | `PARTITION_PROPERTIES_STORAGE_BUCKET_NAME` | ex `storage.bucket.name` | Name of partition property for storage bucket name value | yes | - | +| `SYSTEM_PARTITION_ID` | ex `system` | System partition ID | These variables define service behavior, and are used to switch between `Reference` or `Google Cloud` environments, their overriding and usage in mixed mode was not tested. Usage of spring profiles is preferred. diff --git a/provider/storage-gc/docs/gc/README.md b/provider/storage-gc/docs/gc/README.md index 486f2677d3d828a0d15ef82fba206e3dfad3047c..95909d8d3091751162b9ff069f1aa8bc366e4ed9 100644 --- a/provider/storage-gc/docs/gc/README.md +++ b/provider/storage-gc/docs/gc/README.md @@ -46,6 +46,7 @@ Defined in default application property file but possible to override: | `PARTITION_API` | ex `http://localhost:8081/api/partition/v1` | Partition service endpoint | no | - | | `GOOGLE_APPLICATION_CREDENTIALS` | ex `/path/to/directory/service-key.json` | Service account credentials, you only need this if running locally | yes | <https://console.cloud.google.com/iam-admin/serviceaccounts> | | `PARTITION_PROPERTIES_STORAGE_BUCKET_NAME` | ex `storage.bucket.name` | Name of partition property for storage bucket name value | yes | - | +| `SYSTEM_PARTITION_ID` | ex `system` | System partition ID | These variables define service behavior, and are used to switch between `Reference` or `Google Cloud` environments, their overriding and usage in mixed mode was not tested. Usage of spring profiles is preferred. diff --git a/provider/storage-gc/pom.xml b/provider/storage-gc/pom.xml index 2f2e94f8311d5d365498a0a92abc14b2474120d0..0407e106ddd7221c3f0a035b63fa01745c07051b 100644 --- a/provider/storage-gc/pom.xml +++ b/provider/storage-gc/pom.xml @@ -59,7 +59,7 @@ <dependency> <groupId>org.opengroup.osdu</groupId> <artifactId>core-lib-gc-spring6</artifactId> - <version>0.26.0</version> + <version>0.27.0-rc3</version> </dependency> <!-- Mappers --> <dependency> @@ -130,6 +130,7 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> + </dependencies> <build> diff --git a/provider/storage-gc/src/main/appengine/app.yaml b/provider/storage-gc/src/main/appengine/app.yaml deleted file mode 100644 index f4c4d0f834d69ad569b8ba472432ad37c975d833..0000000000000000000000000000000000000000 --- a/provider/storage-gc/src/main/appengine/app.yaml +++ /dev/null @@ -1,17 +0,0 @@ -service: os-storage -runtime: java -env: flex - -resources: - cpu: 2 - memory_gb: 6 - -automatic_scaling: - min_num_instances: 2 - max_num_instances: 5 - cool_down_period_sec: 120 - cpu_utilization: - target_utilization: 0.7 - -env_variables: - SPRING_PROFILES_ACTIVE: 'ENVIRONMENT' diff --git a/provider/storage-gc/src/main/resources/application.properties b/provider/storage-gc/src/main/resources/application.properties index c8d6bc8efce3051424f2e16a2562d8f63a0c23de..bfac3eefea2a6b9a8ca162ef8acda8bb02a2841b 100644 --- a/provider/storage-gc/src/main/resources/application.properties +++ b/provider/storage-gc/src/main/resources/application.properties @@ -14,7 +14,6 @@ logging.level.org.springframework.web=${LOG_LEVEL:INFO} osdu.spring.config.enableEncodedSpecialCharacters=true # Security config -service.policy.enabled=true opa.opa-endpoint=${OPA_ENDPOINT:notused} opa.enabled=true @@ -58,3 +57,7 @@ management.server.port=${MANAGEMENT_SERVER_PORT:8081} management.endpoints.web.base-path=${MANAGEMENT_ENDPOINTS_WEB_BASE:/} management.endpoints.web.exposure.include=health management.health.probes.enabled=true + +featureFlag.strategy=systemPartition +featureFlag.opa.enabled=false +SYSTEM_PARTITION_ID=system diff --git a/provider/storage-ibm/src/main/resources/application.properties b/provider/storage-ibm/src/main/resources/application.properties index ac7c7528b0c3e433a2862d4db6ae2e872a5044ec..3df280e6d5be56c5d9eef1e6b07631ca79120e39 100644 --- a/provider/storage-ibm/src/main/resources/application.properties +++ b/provider/storage-ibm/src/main/resources/application.properties @@ -34,7 +34,9 @@ amqphub.amqp10jms.username=admin amqphub.amqp10jms.password=admin OPA_API=notused -opa.enabled=false #Collaboration context feature flag name : properties specific collaborations-enabled=false + +featureFlag.strategy=appProperty +featureFlag.opa.enabled=${OPA_ENABLED:false} \ No newline at end of file diff --git a/storage-core-plus/src/main/resources/application.properties b/storage-core-plus/src/main/resources/application.properties index 97cef4cab4756dd3aa5bc7a6abb23de188d75c87..6d10f2d9f1820886c64fdc587b20ecae2f5f6a85 100644 --- a/storage-core-plus/src/main/resources/application.properties +++ b/storage-core-plus/src/main/resources/application.properties @@ -61,3 +61,7 @@ management.server.port=${MANAGEMENT_SERVER_PORT:8081} management.endpoints.web.base-path=${MANAGEMENT_ENDPOINTS_WEB_BASE:/} management.endpoints.web.exposure.include=health management.health.probes.enabled=true + + +featureFlag.strategy=appProperty +featureFlag.opa.enabled=${OPA_ENABLED:false} diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java index 1ea3c3ae7318feb99c4839a3c3140f698be9f22f..fe4c594a00a17b376a4ecc92e0260a880f63e2fe 100644 --- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java +++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java @@ -18,6 +18,7 @@ import com.google.common.base.Strings; import com.google.gson.*; import org.apache.http.HttpStatus; import org.opengroup.osdu.core.common.crs.CrsConverterClientFactory; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.crs.RecordsAndStatuses; import org.opengroup.osdu.core.common.model.http.AppException; @@ -35,12 +36,13 @@ import org.opengroup.osdu.storage.provider.interfaces.ICloudStorage; import org.opengroup.osdu.storage.provider.interfaces.IRecordsMetadataRepository; import org.opengroup.osdu.storage.util.CollaborationUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; + public abstract class BatchServiceImpl implements BatchService { @@ -75,8 +77,8 @@ public abstract class BatchServiceImpl implements BatchService { @Autowired private IOPAService opaService; - @Value("${opa.enabled}") - private boolean isOpaEnabled; + @Autowired + private IFeatureFlag featureFlag; @Override public MultiRecordInfo getMultipleRecords(MultiRecordIds ids, Optional<CollaborationContext> collaborationContext) { @@ -268,7 +270,7 @@ public abstract class BatchServiceImpl implements BatchService { recordsMap.put(recordId, recordData); } } else { - if (isOpaEnabled) { + if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) { List<ValidationOutputRecord> dataAuthResult = this.opaService.validateUserAccessToRecords(recordMetadataList, OperationType.view); for (ValidationOutputRecord outputRecord : dataAuthResult) { if (outputRecord.getErrors().isEmpty()) { diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java index ba2980b514728d58d3e563667f63bf5957450b43..9cc45fd5023142c9ff1f3d621fe3b90722ca05e4 100644 --- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java +++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java @@ -14,6 +14,7 @@ package org.opengroup.osdu.storage.service; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.model.http.CollaborationContext; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.OperationType; @@ -30,7 +31,6 @@ import org.opengroup.osdu.storage.util.CollaborationUtil; import org.opengroup.osdu.storage.util.api.RecordUtil; import org.opengroup.osdu.storage.validation.api.PatchOperationValidator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.time.Clock; @@ -43,6 +43,7 @@ import java.util.stream.Stream; import static java.util.function.Function.identity; import static java.util.stream.Collectors.toList; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @Service public class BulkUpdateRecordServiceImpl implements BulkUpdateRecordService { @@ -74,8 +75,8 @@ public class BulkUpdateRecordServiceImpl implements BulkUpdateRecordService { @Autowired private IOPAService opaService; - @Value("${opa.enabled}") - private boolean isOpaEnabled; + @Autowired + private IFeatureFlag featureFlag; @Override public BulkUpdateRecordsResponse bulkUpdateRecords(RecordBulkUpdateParam recordBulkUpdateParam, String user, Optional<CollaborationContext> collaborationContext) { @@ -98,7 +99,7 @@ public class BulkUpdateRecordServiceImpl implements BulkUpdateRecordService { List<String> idsWithoutVersion = new ArrayList<>(idMap.keySet()); Map<String, RecordMetadata> existingRecords = recordRepository.get(idsWithoutVersion, collaborationContext); List<String> notFoundRecordIds = new ArrayList<>(); - List<String> unauthorizedRecordIds = isOpaEnabled + List<String> unauthorizedRecordIds = featureFlag.isFeatureEnabled(OPA_FEATURE_NAME) ? this.validateUserAccessAndCompliancePolicyConstraints(bulkUpdateOps, idMap, existingRecords, user) : this.validateUserAccessAndComplianceConstraints(bulkUpdateOps, idMap, existingRecords); diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java index b2cfab7ce35004d284981bfb4efa2aa5476107fc..8d8c26a530a5429a1c5a29a22a59c6284e3dd91f 100644 --- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java +++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java @@ -14,6 +14,7 @@ package org.opengroup.osdu.storage.service; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.OperationType; @@ -24,16 +25,15 @@ import org.opengroup.osdu.storage.opa.service.IOPAService; import org.opengroup.osdu.storage.policy.service.IPolicyService; import org.opengroup.osdu.storage.policy.service.PartitionPolicyStatusService; import org.opengroup.osdu.storage.provider.interfaces.ICloudStorage; -import org.opengroup.osdu.storage.util.api.RecordUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; -import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; + @Service public class DataAuthorizationService { @@ -55,8 +55,8 @@ public class DataAuthorizationService { @Autowired private IOPAService opaService; - @Value("${opa.enabled}") - private boolean isOpaEnabled; + @Autowired + private IFeatureFlag featureFlag; @Lazy @Autowired @@ -66,7 +66,7 @@ public class DataAuthorizationService { if (this.entitlementsService.isDataManager(this.headers)) { return true; } - if (isOpaEnabled) { + if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) { return doesUserHasAccessToData(Collections.singletonList(recordMetadata), operationType); } @@ -77,7 +77,7 @@ public class DataAuthorizationService { if (this.entitlementsService.isDataManager(this.headers)) { return true; } - if (isOpaEnabled) { + if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) { return doesUserHasAccessToData(Collections.singletonList(recordMetadata), operationType); } @@ -89,7 +89,7 @@ public class DataAuthorizationService { if (this.entitlementsService.isDataManager(this.headers)) { return true; } - if (isOpaEnabled) { + if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) { if (!recordMetadata.getStatus().equals(RecordState.active)) { return false; } diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java index 5cd9fdefbab052f2163cf8db42f671c66e422738..38ed6f81df797b9ab71574cb88b50512891e58ba 100644 --- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java +++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java @@ -18,22 +18,16 @@ import com.google.common.base.Strings; import io.jsonwebtoken.lang.Collections; import org.apache.http.HttpStatus; import org.opengroup.osdu.core.common.feature.IFeatureFlag; -import org.opengroup.osdu.core.common.model.http.CollaborationContext; import org.opengroup.osdu.core.common.legal.ILegalService; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.AppException; +import org.opengroup.osdu.core.common.model.http.CollaborationContext; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.OperationType; import org.opengroup.osdu.core.common.model.legal.Legal; import org.opengroup.osdu.core.common.model.legal.LegalCompliance; import org.opengroup.osdu.core.common.model.storage.Record; -import org.opengroup.osdu.core.common.model.storage.RecordData; -import org.opengroup.osdu.core.common.model.storage.RecordIdWithVersion; -import org.opengroup.osdu.core.common.model.storage.RecordMetadata; -import org.opengroup.osdu.core.common.model.storage.RecordProcessing; -import org.opengroup.osdu.core.common.model.storage.RecordState; -import org.opengroup.osdu.core.common.model.storage.TransferBatch; -import org.opengroup.osdu.core.common.model.storage.TransferInfo; +import org.opengroup.osdu.core.common.model.storage.*; import org.opengroup.osdu.core.common.model.storage.validation.ValidationDoc; import org.opengroup.osdu.core.common.model.tenant.TenantInfo; import org.opengroup.osdu.storage.di.GcsVersionPathLimitationConfig; @@ -47,17 +41,12 @@ import org.opengroup.osdu.storage.util.CollaborationUtil; import org.opengroup.osdu.storage.util.RecordBlocks; import org.opengroup.osdu.storage.util.api.RecordUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Optional; -import java.util.Set; + +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @Service public class IngestionServiceImpl implements IngestionService { @@ -95,14 +84,12 @@ public class IngestionServiceImpl implements IngestionService { @Autowired private RecordUtil recordUtil; - @Value("${opa.enabled}") - private boolean isOpaEnabled; + @Autowired + private IFeatureFlag featureFlag; @Autowired RecordBlocks recordBlocks; - @Autowired - IFeatureFlag featureFlag; @Autowired GcsVersionPathLimitationConfig gcsVersionPathLimitationConfig; @@ -195,7 +182,7 @@ public class IngestionServiceImpl implements IngestionService { Map<String, RecordMetadata> existingRecords = this.recordRepository.get(ids, collaborationContext); this.validateParentsExist(existingRecords, recordParentMap); - if(isOpaEnabled) { + if(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) { this.validateUserAccessAndCompliancePolicyConstraints(inputRecords, existingRecords, recordParentMap); } else { this.validateUserAccessAndComplianceConstraints(inputRecords, existingRecords, recordParentMap); diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java index 86eafbb397d7fc05cf37f5af6bbf4551fd087208..6884da6f8fb107075f589fc0a36f5b8116b1acdd 100644 --- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java +++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java @@ -17,16 +17,14 @@ package org.opengroup.osdu.storage.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.fge.jsonpatch.JsonPatch; import org.apache.http.HttpStatus; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.CollaborationContext; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.OperationType; -import org.opengroup.osdu.core.common.model.storage.MultiRecordIds; -import org.opengroup.osdu.core.common.model.storage.MultiRecordInfo; import org.opengroup.osdu.core.common.model.storage.Record; -import org.opengroup.osdu.core.common.model.storage.RecordMetadata; -import org.opengroup.osdu.core.common.model.storage.TransferInfo; +import org.opengroup.osdu.core.common.model.storage.*; import org.opengroup.osdu.storage.logging.StorageAuditLogger; import org.opengroup.osdu.storage.opa.model.OpaError; import org.opengroup.osdu.storage.opa.model.ValidationOutputRecord; @@ -38,19 +36,14 @@ import org.opengroup.osdu.storage.util.JsonPatchUtil; import org.opengroup.osdu.storage.util.api.RecordUtil; import org.opengroup.osdu.storage.validation.api.PatchInputValidator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @Service @@ -89,8 +82,8 @@ public class PatchRecordsServiceImpl implements PatchRecordsService { @Autowired private IOPAService opaService; - @Value("#{new Boolean('${opa.enabled}')}") - private boolean isOpaEnabled; + @Autowired + private IFeatureFlag featureFlag; private ObjectMapper objectMapper = new ObjectMapper(); @@ -141,7 +134,7 @@ public class PatchRecordsServiceImpl implements PatchRecordsService { } } else { Map<String, RecordMetadata> existingRecords = recordRepository.get(recordIds, collaborationContext); - if (isOpaEnabled) { + if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) { this.validateUserAccessAndCompliancePolicyConstraints(jsonPatch, existingRecords); } else { this.validateUserAccessAndComplianceConstraints(jsonPatch, recordIds, existingRecords); diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java b/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java index 64441cc21122d37d0adf241bbd3a4f45e7f058b7..a64933d34f380f0d56edd5600812fb7d86fdc475 100644 --- a/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java +++ b/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java @@ -33,4 +33,6 @@ public class RecordConstants { public static final String REGEX_VERSION_IDS = "[0-9]+(,[0-9]+)*"; public static final int MAX_VERSION_IDS_NUMBER = 50; + public static final String OPA_FEATURE_NAME = "featureFlag.opa.enabled"; + } diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java index 733a96149812caf8adfcc9e673e56dad44328fef..d79be6c04a68d033a59165df0515cb636293868c 100644 --- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java +++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java @@ -10,6 +10,7 @@ import org.mockito.InjectMocks; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.opengroup.osdu.core.common.crs.CrsConverterClientFactory; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.crs.ConvertStatus; import org.opengroup.osdu.core.common.model.crs.RecordsAndStatuses; @@ -46,6 +47,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @ExtendWith(MockitoExtension.class) class BatchServiceImplTest { @@ -76,6 +78,9 @@ class BatchServiceImplTest { @Mock private IOPAService opaService; + @Mock + private IFeatureFlag featureFlag; + @InjectMocks BatchServiceImpl sut = mock(BatchServiceImpl.class, Mockito.CALLS_REAL_METHODS); private static final String ACL_OWNER = "test_acl"; @@ -177,7 +182,8 @@ class BatchServiceImplTest { @Test void fetchMultipleRecords_returnsConvertedRecords_whenFrameOfReferenceIsPresentAndRecordsAreFound() { ReflectionTestUtils.setField(crsConverterClientFactory, "crsApi", "crs_endpoint"); - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); + Map<String, String> osduHeaders = new HashMap<>(); osduHeaders.put("frame-of-reference", "units=SI;crs=wgs84;elevation=msl;azimuth=true north;dates=utc;"); diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java index 6c2da03f34eb758c5066af025fdde2cc088f1982..c9adeac47761d44bac95f4f57f5a1dff36e274e7 100644 --- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java +++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java @@ -19,6 +19,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.entitlements.Acl; import org.opengroup.osdu.core.common.model.http.CollaborationContext; @@ -36,7 +37,6 @@ import org.opengroup.osdu.storage.provider.interfaces.IRecordsMetadataRepository import org.opengroup.osdu.storage.response.BulkUpdateRecordsResponse; import org.opengroup.osdu.storage.util.api.RecordUtil; import org.opengroup.osdu.storage.validation.api.PatchOperationValidator; -import org.springframework.test.util.ReflectionTestUtils; import java.time.Clock; import java.util.*; @@ -48,6 +48,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.*; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @ExtendWith(MockitoExtension.class) public class BulkUpdateRecordServiceImplTest { @@ -103,6 +104,9 @@ public class BulkUpdateRecordServiceImplTest { @InjectMocks private BulkUpdateRecordServiceImpl service; + @Mock + private IFeatureFlag featureFlag; + @Test public void should_bulkUpdateRecords_successfully() { RecordMetadata recordMetadata = buildRecordMetadata(); @@ -213,7 +217,7 @@ public class BulkUpdateRecordServiceImplTest { }}; RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(recordMetadataMap); when(persistenceService.updateMetadata(singletonList(recordMetadataMap.get(TEST_ID)), TEST_IDS, IDS_VERSION_MAP, Optional.empty())) .thenReturn(emptyList()); @@ -244,7 +248,7 @@ public class BulkUpdateRecordServiceImplTest { RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); Map<String, RecordMetadata> recordMetadataMap = new HashMap<>(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(clock.millis()).thenReturn(CURRENT_MILLIS); List<OpaError> errors = new ArrayList<>(); @@ -271,7 +275,7 @@ public class BulkUpdateRecordServiceImplTest { }}; RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(recordMetadataMap); when(clock.millis()).thenReturn(CURRENT_MILLIS); when(recordUtil.updateRecordMetaDataForPatchOperations(recordMetadataMap.get(TEST_ID), param.getOps(), TEST_USER, @@ -303,7 +307,7 @@ public class BulkUpdateRecordServiceImplTest { }}; RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(recordMetadataMap); when(persistenceService.updateMetadata(singletonList(recordMetadataMap.get(TEST_ID)), TEST_IDS, IDS_VERSION_MAP, Optional.empty())) .thenReturn(new ArrayList<>(singletonList(TEST_ID))); @@ -343,7 +347,7 @@ public class BulkUpdateRecordServiceImplTest { RecordMetadata newRecordMetadata = buildRecordMetadata(); RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(existingRecordMetadataMap); when(clock.millis()).thenReturn(CURRENT_MILLIS); when(recordUtil.updateRecordMetaDataForPatchOperations(existingRecordMetadataMap.get(TEST_ID), param.getOps(), TEST_USER, @@ -390,7 +394,7 @@ public class BulkUpdateRecordServiceImplTest { newRecordMetadata.setAcl(non_owner_acl); RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(existingRecordMetadataMap); when(clock.millis()).thenReturn(CURRENT_MILLIS); when(recordUtil.updateRecordMetaDataForPatchOperations(existingRecordMetadataMap.get(TEST_ID), param.getOps(), TEST_USER, @@ -434,7 +438,7 @@ public class BulkUpdateRecordServiceImplTest { RecordMetadata newRecordMetadata = buildRecordMetadata(); RecordBulkUpdateParam param = buildRecordBulkUpdateParam(); - ReflectionTestUtils.setField(service, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(existingRecordMetadataMap); when(persistenceService.updateMetadata(singletonList(newRecordMetadata), TEST_IDS, IDS_VERSION_MAP, Optional.empty())) .thenReturn(emptyList()); diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java index a3ac74017a4f4839554ec5979e0c1ec07f2482e6..a8a13e79c68b52b3670b0e5640869442662a5fc8 100644 --- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java +++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.entitlements.Acl; import org.opengroup.osdu.core.common.model.http.DpsHeaders; @@ -25,6 +26,7 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @ExtendWith(MockitoExtension.class) public class DataAuthorizationServiceTest { @@ -49,6 +51,9 @@ public class DataAuthorizationServiceTest { @InjectMocks private DataAuthorizationService sut; + @Mock + private IFeatureFlag featureFlag; + private static final Map<String, String> headerMap = new HashMap<>(); @BeforeEach @@ -64,7 +69,7 @@ public class DataAuthorizationServiceTest { @Test public void should_callOpaServiceInOwnerAccessValidation_when_opaIsEnabled() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); this.sut.validateOwnerAccess(this.getRecordMetadata(), OperationType.update); verify(this.opaService, times(1)).validateUserAccessToRecords(any(), any()); @@ -73,7 +78,7 @@ public class DataAuthorizationServiceTest { @Test public void should_callOpaServiceInViewerOrOwnerAccessValidation_when_OpaIsEnabled() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); this.sut.validateViewerOrOwnerAccess(this.getRecordMetadata(), OperationType.update); verify(this.opaService, times(1)).validateUserAccessToRecords(any(), any()); @@ -82,7 +87,7 @@ public class DataAuthorizationServiceTest { @Test public void should_callEntitlementService_when_policyServiceDisabled() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); this.sut.validateOwnerAccess(this.getRecordMetadata(), OperationType.update); verify(this.opaService, times(0)).validateUserAccessToRecords(any(), any()); @@ -91,7 +96,7 @@ public class DataAuthorizationServiceTest { @Test public void should_callEntitlementServiceInViewerOrOwnerAccessValidation_when_opaIsDisabled() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); this.sut.validateViewerOrOwnerAccess(this.getRecordMetadata(), OperationType.update); verify(this.opaService, times(0)).validateUserAccessToRecords(any(), any()); @@ -100,7 +105,6 @@ public class DataAuthorizationServiceTest { @Test public void should_returnTrue_validateOwnerAccess_when_dataManager() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); when(this.entitlementsService.isDataManager(any())).thenReturn(true); assertTrue(this.sut.validateOwnerAccess(this.getRecordMetadata(), OperationType.update)); @@ -110,7 +114,6 @@ public class DataAuthorizationServiceTest { @Test public void should_returnTrue_validateViewerOrOwnerAccess_when_dataManager() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); when(this.entitlementsService.isDataManager(any())).thenReturn(true); assertTrue(this.sut.validateViewerOrOwnerAccess(this.getRecordMetadata(), OperationType.update)); @@ -120,7 +123,7 @@ public class DataAuthorizationServiceTest { @Test public void should_returnTrue_hasAccess_when_dataManager_False() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.entitlementsService.isDataManager(any())).thenReturn(false); assertTrue(this.sut.hasAccess(this.getRecordMetadata(), OperationType.update)); @@ -130,7 +133,6 @@ public class DataAuthorizationServiceTest { @Test public void should_returnTrue_hasAccess_when_dataManager() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); when(this.entitlementsService.isDataManager(any())).thenReturn(true); assertTrue(this.sut.hasAccess(this.getRecordMetadata(), OperationType.update)); diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java index 14a54da6717732c9d57af894080e50388c5117b2..b6947c863ee24976fdcd197da22a6211c20dc48c 100644 --- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java +++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java @@ -65,6 +65,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @ExtendWith(MockitoExtension.class) public class IngestionServiceImplTest { @@ -184,6 +185,7 @@ public class IngestionServiceImplTest { lenient().when(this.authService.hasOwnerAccess(any(),any())).thenReturn(true); recordBlocks = new RecordBlocks(cloudStorage, crcHashGenerator); sut.recordBlocks = recordBlocks; + } @Test @@ -277,6 +279,7 @@ public class IngestionServiceImplTest { @Test public void should_return403_when_updatingARecordThatDoesNotHaveWritePermissionOnOriginalRecord() { when(this.authService.isValidAcl(any(), any())).thenReturn(true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); this.acl.setViewers(VALID_ACL); this.acl.setOwners(VALID_ACL); @@ -751,7 +754,7 @@ public class IngestionServiceImplTest { @Test public void should_return401_when_updatingARecordThatFailDataAuthorizationCheck_IntegrateOPA() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.authService.isValidAcl(any(), any())).thenReturn(true); this.record1.setId(RECORD_ID1); @@ -788,7 +791,7 @@ public class IngestionServiceImplTest { @Test @SuppressWarnings("unchecked") public void should_updateTwoRecords_when_twoRecordIDsAreAlreadyPresentInDataLake_integrateOPA() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.authService.isValidAcl(any(), any())).thenReturn(true); this.record1.setId(RECORD_ID1); @@ -843,7 +846,7 @@ public class IngestionServiceImplTest { @Test public void should_return403_when_updatingExistingRecordThatFailDataAuthorizationCheck_IntegrateOPA() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.authService.isValidAcl(any(), any())).thenReturn(true); this.record1.setId(RECORD_ID1); @@ -881,7 +884,7 @@ public class IngestionServiceImplTest { @Test public void should_return403_when_updatingWithNewRecordThatFailDataAuthorizationCheck_IntegrateOPA() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.authService.isValidAcl(any(), any())).thenReturn(true); this.record1.setId(RECORD_ID1); @@ -920,7 +923,7 @@ public class IngestionServiceImplTest { @Test public void should_success_when_updatingRecordThatPassDataAuthorizationCheck_IntegrateOPA() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.authService.isValidAcl(any(), any())).thenReturn(true); this.record1.setId(RECORD_ID1); @@ -962,7 +965,7 @@ public class IngestionServiceImplTest { @Test public void createUpdateRecords_shouldNotPerform_gcsArraySizeValidationIfFeatureFlagIsNotSet() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(this.authService.isValidAcl(any(), any())).thenReturn(true); this.record1.setId(RECORD_ID1); @@ -1009,7 +1012,7 @@ public class IngestionServiceImplTest { @Test public void createUpdateRecords_shouldNotRemoveRecordsFromProcessing_ifGcsVersionPathsSizeIsLesserThanSoftLimit() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(gcsVersionPathLimitationConfig.getMaxLimit()).thenReturn(2000); when(gcsVersionPathLimitationConfig.getFeatureName()).thenReturn("enforce_gcsVersionPathsLimit_enabled"); when(featureFlag.isFeatureEnabled(gcsVersionPathLimitationConfig.getFeatureName())).thenReturn(true); @@ -1059,7 +1062,7 @@ public class IngestionServiceImplTest { @Test public void createUpdateRecords_shouldRemoveRecordsFromProcessing_ifGcsSizeIsGreaterThanMaxLimit() { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); when(gcsVersionPathLimitationConfig.getMaxLimit()).thenReturn(2000); when(gcsVersionPathLimitationConfig.getFeatureName()).thenReturn("enforce_gcsVersionPathsLimit_enabled"); when(featureFlag.isFeatureEnabled(gcsVersionPathLimitationConfig.getFeatureName())).thenReturn(true); diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java index 87dfbaf1e94740ba42bf2632b56eda8df4e7a380..c93b25eaf4e79090cb56d495e6051ded0483944b 100644 --- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java +++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java @@ -11,6 +11,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.jupiter.MockitoExtension; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.entitlements.Acl; import org.opengroup.osdu.core.common.model.http.AppException; @@ -28,6 +29,7 @@ import org.opengroup.osdu.storage.provider.interfaces.IRecordsMetadataRepository import org.opengroup.osdu.storage.response.PatchRecordsResponse; import org.opengroup.osdu.storage.util.api.RecordUtil; import org.opengroup.osdu.storage.validation.api.PatchInputValidator; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.util.ReflectionTestUtils; import java.io.IOException; @@ -43,6 +45,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static java.util.Collections.singletonList; +import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME; @ExtendWith(MockitoExtension.class) public class PatchRecordsServiceImplTest { @@ -82,6 +85,9 @@ public class PatchRecordsServiceImplTest { @InjectMocks private PatchRecordsServiceImpl sut; + @Mock + private IFeatureFlag featureFlag; + private final ObjectMapper mapper = new ObjectMapper(); private final List<String> recordIds = new LinkedList<>(Arrays.asList(RECORD_ID1, RECORD_ID2)); @@ -139,7 +145,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldSuccessfullyPatchRecordMetaData_whenOpaIsEnabled() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"add\", \"path\":\"/acl/viewers/-\", \"value\":\"value\"}]")); Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata(); when(recordRepository.get(recordIds, COLLABORATION_CONTEXT)).thenReturn(existingRecords); @@ -165,7 +171,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldSuccessfullyPatchRecordMetaData_whenOpaIsDisabled() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"add\", \"path\":\"/acl/viewers/-\", \"value\":\"value\"}]")); Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata(); when(recordRepository.get(recordIds, COLLABORATION_CONTEXT)).thenReturn(existingRecords); @@ -197,7 +203,6 @@ public class PatchRecordsServiceImplTest { patchedRecord2.getAcl().setViewers(record2ViewersAcl); patchedRecord2.setData(Collections.singletonMap("Hello", "world")); - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/acl/viewers/0\"}, {\"op\":\"add\", \"path\":\"/data\", \"value\":{\"Hello\" : \"world\"}}]")); MultiRecordInfo multiRecordInfo = getMultiRecordInfo(); @@ -225,6 +230,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldSuccessfullyPatchMetadata_ifSomeRecordsNotFound() throws IOException { + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); /* Ensure that when one of the records is not found, the others are still updated. */ @@ -246,7 +252,6 @@ public class PatchRecordsServiceImplTest { @Test public void shouldNotPatchData_ifResultHasEmptyLegaltagsForAllRecords() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/legal/legaltags/0\"}, {\"op\":\"add\", \"path\":\"/data\", \"value\":{\"Hello\" : \"world\"}}]")); MultiRecordInfo multiRecordInfo = getMultiRecordInfo(); @@ -270,7 +275,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldPatchRecordMetadataPartially_ifResultHasEmptyAclForOneRecord() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/acl/viewers/0\"}]")); Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata(); String[] record1ViewersAcl = new String[]{"viewer1@company.com"}; @@ -300,7 +305,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldNotPatchMetadata_ifResultHasEmptyLegaltagsForAllRecords() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", false); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false); JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/legal/legaltags/0\"}]")); Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata(); @@ -368,7 +373,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldFailPatchExistingRecordMetaDataThatFailDataAuthorizationCheck_whenOpaIsEnabled() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); List<String> recordIds = singletonList(RECORD_ID1); RecordMetadata existingRecordMetadata = getRecordMetadata(RECORD_ID1); @@ -408,7 +413,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldFailPatchWithNewRecordMetaDataThatFailDataAuthorizationCheck_whenOpaIsEnabled() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); List<String> recordIds = singletonList(RECORD_ID1); RecordMetadata existingRecordMetadata = getRecordMetadata(RECORD_ID1); @@ -448,7 +453,7 @@ public class PatchRecordsServiceImplTest { @Test public void shouldSuccessPatchRecordMetaDataThatPassDataAuthorizationCheck_whenOpaIsEnabled() throws IOException { - ReflectionTestUtils.setField(sut, "isOpaEnabled", true); + when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true); List<String> recordIds = singletonList(RECORD_ID1); RecordMetadata existingRecordMetadata = getRecordMetadata(RECORD_ID1); diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java index 7c18e1d3ac160a66b57edede2ba6131c2fdad507..fa6dcef0be7561c8e8c5900d7cc9f6ba5c757b09 100644 --- a/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java +++ b/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.jupiter.MockitoExtension; +import org.opengroup.osdu.core.common.feature.IFeatureFlag; import org.opengroup.osdu.storage.model.RecordQueryPatch; import org.opengroup.osdu.storage.validation.impl.BulkQueryPatchValidator; @@ -41,6 +42,9 @@ public class BulkQueryPatchValidatorTest { @Mock private ConstraintValidatorContext context; + @Mock + private IFeatureFlag featureFlag; + private BulkQueryPatchValidator sut; @BeforeEach