From 9719ad7d3f095b9778d7554e7f8495e2f6492e0f Mon Sep 17 00:00:00 2001 From: helayoty <hebaelayoty@gmail.com> Date: Wed, 2 Oct 2019 00:24:36 -0700 Subject: [PATCH] - Implement CosmosDB for tenantInfo and ElasticSettings - Add unit test for JWT - modify security settings --- indexer-service-azure/pom.xml | 33 +++------ .../azure/IndexerAzureApplication.java | 6 +- .../indexer/azure/api/AADController.java | 4 +- .../org/opendes/indexer/azure/api/Hello.java | 10 +-- .../indexer/azure/di/TenantFactoryImpl.java | 2 + .../indexer/azure/di/TenantInfoDoc.java | 1 + .../indexer/azure/di/TenantInfoFactory.java | 29 ++++++++ .../indexer/azure/model/AADConfiguration.java | 1 - .../ElasticRepositoryCosmosDB.java | 9 +-- .../azure/persistence/ElasticSettingsDoc.java | 7 +- .../azure/persistence/ISchemaRepository.java | 6 +- .../persistence/SchemaRepositoryImpl.java | 7 +- .../indexer/azure/publish/PublisherImpl.java | 39 +++++++--- .../azure/security/AADSecurityConfig.java | 52 -------------- .../azure/security/WhoamiController.java | 39 ---------- .../azure/util/HeadersInfoAzureImpl.java | 2 + .../indexer/azure/util/RequestInfoImpl.java | 2 + .../util/ServiceAccountJwtClientImpl.java | 3 + .../persistence/SchemaRepositoryImplTest.java | 72 +++++++++++++++++++ 19 files changed, 174 insertions(+), 150 deletions(-) create mode 100644 indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoFactory.java delete mode 100644 indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/AADSecurityConfig.java delete mode 100644 indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/WhoamiController.java create mode 100644 indexer-service-azure/src/test/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImplTest.java diff --git a/indexer-service-azure/pom.xml b/indexer-service-azure/pom.xml index 9300259d9..96ffaea82 100644 --- a/indexer-service-azure/pom.xml +++ b/indexer-service-azure/pom.xml @@ -85,29 +85,16 @@ <artifactId>msal4j</artifactId> <version>0.5.0-preview</version> </dependency> - <!-- Key vault dependency--> - <dependency> - <groupId>com.microsoft.azure</groupId> - <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId> - <version>${azure.version}</version> - </dependency> - <dependency> - <groupId>com.microsoft.azure</groupId> - <artifactId>azure-keyvault</artifactId> - <version>1.2.2</version> - <exclusions> - <exclusion> - <groupId>com.microsoft.azure</groupId> - <artifactId>azure-client-runtime</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.microsoft.azure</groupId> - <artifactId>azure-client-authentication</artifactId> - <version>1.6.12</version> - </dependency> - <!-- end KeyVault dependencies--> +<!-- <dependency>--> +<!-- <groupId>org.json</groupId>--> +<!-- <artifactId>json</artifactId>--> +<!-- <version>20090211</version>--> +<!-- </dependency>--> + <!-- Spring 3 dependencies --> +<!-- <dependency>--> +<!-- <groupId>org.springframework.boot</groupId>--> +<!-- <artifactId>spring-boot-starter-thymeleaf</artifactId>--> +<!-- </dependency>--> </dependencies> <build> diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/IndexerAzureApplication.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/IndexerAzureApplication.java index a758ed0b8..c6ab6d191 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/IndexerAzureApplication.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/IndexerAzureApplication.java @@ -4,11 +4,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client; -//@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }) -@SpringBootApplication +@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }) @Configuration @ComponentScan({"org.opendes.core", "org.opendes.indexer"}) public class IndexerAzureApplication { diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/AADController.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/AADController.java index 68b66df35..7e380a6d0 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/AADController.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/AADController.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.client.RestTemplate; @@ -17,9 +18,10 @@ public class AADController { @RequestMapping("/obo_api") + @PostMapping public ResponseEntity<String> callOboApi(HttpServletRequest httpRequest) throws Throwable { - String token = service.getIdToken("tenant1"); + String token = service.getIdToken("common"); String oboApiCallRes = callOboService(token); diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/Hello.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/Hello.java index 8c3eeb39c..a76de3480 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/Hello.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/api/Hello.java @@ -15,18 +15,10 @@ import javax.annotation.security.PermitAll; @RequestMapping public class Hello { - @Autowired - IServiceAccountJwtClient jwtClient; - @GetMapping("/hello") + @PermitAll public String Default() { return "Hello Azure Indexer!!!"; } - @PostMapping("/gettoken") - @PermitAll - public ResponseEntity<String> getToken(){ - return new ResponseEntity(jwtClient.getIdToken("common"), HttpStatus.OK); - } - } diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantFactoryImpl.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantFactoryImpl.java index 2ce28f38e..d85e0d6f6 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantFactoryImpl.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantFactoryImpl.java @@ -5,10 +5,12 @@ import org.opengroup.osdu.client.multitenancy.ITenantFactory; import org.opengroup.osdu.client.multitenancy.TenantInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; import java.util.*; @Component +@RequestScope public class TenantFactoryImpl implements ITenantFactory { @Autowired diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoDoc.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoDoc.java index ebfff442c..d2756bdc2 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoDoc.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoDoc.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; +import org.springframework.stereotype.Component; @Data @AllArgsConstructor diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoFactory.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoFactory.java new file mode 100644 index 000000000..3e53588e7 --- /dev/null +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/di/TenantInfoFactory.java @@ -0,0 +1,29 @@ +package org.opendes.indexer.azure.di; + +import lombok.extern.java.Log; +import org.opengroup.osdu.client.api.DpsHeaders; +import org.opengroup.osdu.client.multitenancy.ITenantFactory; +import org.opengroup.osdu.client.multitenancy.TenantInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AbstractFactoryBean; +import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; + +@Log +@Component +@RequestScope +public class TenantInfoFactory extends AbstractFactoryBean<TenantInfo> { + @Autowired + private ITenantFactory tenantFactory; + @Autowired + private DpsHeaders headers; + @Override + protected TenantInfo createInstance() throws Exception { + String id = this.headers.getPartitionIdWithFallbackToAccountId(); + return this.tenantFactory.getTenantInfo(id); + } + @Override + public Class<?> getObjectType() { + return TenantInfo.class; + } +} diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/model/AADConfiguration.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/model/AADConfiguration.java index 1fe91c4b4..17d8d85ac 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/model/AADConfiguration.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/model/AADConfiguration.java @@ -13,7 +13,6 @@ import org.springframework.stereotype.Component; public class AADConfiguration { String clientId; String authority; - String redirectUri; String secretKey; String oboApi; diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticRepositoryCosmosDB.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticRepositoryCosmosDB.java index 555b6a5f8..cf0db563d 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticRepositoryCosmosDB.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticRepositoryCosmosDB.java @@ -13,9 +13,6 @@ import org.springframework.stereotype.Component; @Component public class ElasticRepositoryCosmosDB implements ElasticRepository { - static final String HOST = "host"; - static final String PORT = "port"; - static final String XPACK_RESTCLIENT_CONFIGURATION = "configuration"; @Autowired private CosmosDBElasticSettings cosmosDB; @@ -32,7 +29,11 @@ public class ElasticRepositoryCosmosDB implements ElasticRepository { @Override public ClusterSettings getElasticClusterSettings(TenantInfo tenantInfo) { - ElasticSettingSchema schema = this.schemaRepository.get(ELASTIC_DATASTORE_KIND); + if(tenantInfo == null) + throw new AppException(HttpStatus.SC_NOT_FOUND, "TenantInfo is null", ""); + + String settingId = tenantInfo.getName().concat("_").concat(ELASTIC_DATASTORE_ID); + ElasticSettingSchema schema = this.schemaRepository.get(settingId); if (schema == null) { throw new AppException(HttpStatus.SC_NOT_FOUND, "Cluster setting not found", "The requested cluster setting was not found in CosmosDB.", String.format("Cluster setting with key: '%s' does not exist in CosmostDB.", ELASTIC_DATASTORE_KIND)); diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticSettingsDoc.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticSettingsDoc.java index 6646448a9..9fd177aae 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticSettingsDoc.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ElasticSettingsDoc.java @@ -21,17 +21,18 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.opendes.indexer.azure.model.ElasticSettingSchema; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.annotation.Id; +import org.springframework.stereotype.Component; @Data @AllArgsConstructor @NoArgsConstructor -@Document(collection = "elasticSchema") //collection name +@Document(collection = "${ELASTIC_DATASTORE_KIND}") //collection name public class ElasticSettingsDoc { @PartitionKey @Id - private String kind; - private String id; + private String Id; private ElasticSettingSchema settingSchema; } diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ISchemaRepository.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ISchemaRepository.java index c52af9b31..bb33f1cbd 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ISchemaRepository.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/ISchemaRepository.java @@ -23,10 +23,10 @@ public interface ISchemaRepository { String SCHEMA_KIND = "IndexerSchema"; String SCHEMA = "schema"; - String Id = "id"; + String KIND = "KIND"; - void add(ElasticSettingSchema schema, String id, String kind); + void add(ElasticSettingSchema schema, String id); - ElasticSettingSchema get(String kind); + ElasticSettingSchema get(String id); } diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImpl.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImpl.java index 10310d9de..ab4e63496 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImpl.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImpl.java @@ -14,17 +14,16 @@ public class SchemaRepositoryImpl implements ISchemaRepository { private CosmosDBElasticSettings db; @Override - public void add(ElasticSettingSchema schema, String id, String kind) { + public void add(ElasticSettingSchema schema, String id) { ElasticSettingsDoc sd = new ElasticSettingsDoc(); sd.setId(id); - sd.setKind(kind); sd.setSettingSchema(schema); db.save(sd); } @Override - public ElasticSettingSchema get(String kind) { - Optional<ElasticSettingsDoc> sd = db.findById(kind); + public ElasticSettingSchema get(String id) { + Optional<ElasticSettingsDoc> sd = db.findById(id); if (!sd.isPresent()) return null; diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/publish/PublisherImpl.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/publish/PublisherImpl.java index 3e32414cb..d8d1191ad 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/publish/PublisherImpl.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/publish/PublisherImpl.java @@ -18,10 +18,13 @@ package org.opendes.indexer.azure.publish; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.microsoft.azure.servicebus.IMessage; +import com.microsoft.azure.servicebus.Message; import com.microsoft.azure.servicebus.TopicClient; import org.elasticsearch.common.Strings; +import org.opendes.core.logging.JaxRsDpsLog; import org.opendes.core.model.RecordChangedMessages; import org.opendes.indexer.model.RecordStatus; import org.opendes.indexer.publish.IPublisher; @@ -29,25 +32,25 @@ import org.opendes.indexer.util.JobStatus; import org.opengroup.osdu.client.api.DpsHeaders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; @Component +@RequestScope public class PublisherImpl implements IPublisher { -// private static final String TOPIC_ID = "indexing-progress"; -// private String TOPIC_NAME = "recordstopic"; -// private String CONNECTION_STRING = "Endpoint=sb://pliuopendes.servicebus.windows.net/;\" +\n" + -// " \"SharedAccessKeyName=RootManageSharedAccessKey;\" +\n" + -// " \"SharedAccessKey=km8Nscc0gf299Ck6npmM3D14VU5Tx1lJYRdlHcExIvY="; - @Autowired private TopicClient topicClient; + @Autowired + private JaxRsDpsLog logger; + @Override public void publishStatusChangedTagsToTopic(DpsHeaders headers, JobStatus indexerBatchStatus) throws Exception { @@ -55,26 +58,41 @@ public class PublisherImpl implements IPublisher { if (Strings.isNullOrEmpty(tenant)) tenant = headers.getAccountId(); + Message message = new Message(); + RecordChangedMessages recordChangedMessages = getRecordChangedMessage(headers, indexerBatchStatus); - topicClient.send((IMessage) recordChangedMessages); + message.setBody(recordChangedMessages.toString().getBytes(StandardCharsets.UTF_8)); + message.setContentType("application/json"); + + try { + logger.info("Indexer publishes message " + headers.getCorrelationId()); + topicClient.send(message); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } } private RecordChangedMessages getRecordChangedMessage(DpsHeaders headers, JobStatus indexerBatchStatus) { + Gson gson = new GsonBuilder().create(); Map<String, String> attributesMap = new HashMap<>(); Type listType = new TypeToken<List<RecordStatus>>() { }.getType(); + JsonElement statusChangedTagsJson = gson.toJsonTree(indexerBatchStatus.getStatusesList(), listType); String statusChangedTagsData = (statusChangedTagsJson.toString()); String tenant = headers.getPartitionId(); // This code it to provide backward compatibility to slb-account-id if (!Strings.isNullOrEmpty(tenant)) { - attributesMap.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId()); + attributesMap.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionIdWithFallbackToAccountId()); } else { - attributesMap.put(DpsHeaders.ACCOUNT_ID, headers.getAccountId()); + attributesMap.put(DpsHeaders.ACCOUNT_ID, headers.getPartitionIdWithFallbackToAccountId()); } + headers.addCorrelationIdIfMissing(); attributesMap.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId()); @@ -83,6 +101,9 @@ public class PublisherImpl implements IPublisher { recordChangedMessages.setData(statusChangedTagsData); recordChangedMessages.setAttributes(attributesMap); + + + return recordChangedMessages; } } diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/AADSecurityConfig.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/AADSecurityConfig.java deleted file mode 100644 index c2e5629d4..000000000 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/AADSecurityConfig.java +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © Microsoft Corporation -// -// 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.opendes.indexer.azure.security; - -import com.microsoft.azure.spring.autoconfigure.aad.AADAppRoleStatelessAuthenticationFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -@EnableWebSecurity -@EnableGlobalMethodSecurity(securedEnabled = true) -public class AADSecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private AADAppRoleStatelessAuthenticationFilter appRoleAuthFilter; - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .csrf().disable() - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER) - .and() - .authorizeRequests() - .antMatchers("/", "/index.html", - "/v2/api-docs", - "/configuration/ui", - "/swagger-resources/**", - "/configuration/security", - "/swagger", - "/swagger-ui.html", - "/webjars/**").permitAll() - .anyRequest().authenticated() - .and() - .addFilterBefore(appRoleAuthFilter, UsernamePasswordAuthenticationFilter.class); - } -} diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/WhoamiController.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/WhoamiController.java deleted file mode 100644 index 113546d30..000000000 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/security/WhoamiController.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © Microsoft Corporation -// -// 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.opendes.indexer.azure.security; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -public class WhoamiController { - @RequestMapping(value = "/whoami") - @ResponseBody - public String whoami() { - final Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - - String userName = auth.getName(); - String roles = String.valueOf(auth.getAuthorities()); - String details = String.valueOf(auth.getPrincipal()); - - return "user: " + userName + "<BR>" + - "roles: " + roles + "<BR>" + - "details: " + details + "<BR>"; - } - -} diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/HeadersInfoAzureImpl.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/HeadersInfoAzureImpl.java index 429168ad3..86b3f3276 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/HeadersInfoAzureImpl.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/HeadersInfoAzureImpl.java @@ -22,6 +22,7 @@ import org.opendes.core.util.Preconditions; import org.opengroup.osdu.client.api.DpsHeaders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; import java.util.HashSet; import java.util.Map; @@ -29,6 +30,7 @@ import java.util.stream.Collectors; @Log @Component +@RequestScope public class HeadersInfoAzureImpl implements IHeadersInfo { @Autowired diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/RequestInfoImpl.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/RequestInfoImpl.java index 70e8c4e5a..fc8d95928 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/RequestInfoImpl.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/RequestInfoImpl.java @@ -12,6 +12,7 @@ import org.opengroup.osdu.client.api.DpsHeaders; import org.opengroup.osdu.client.multitenancy.TenantInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; import java.util.Map; @@ -19,6 +20,7 @@ import static org.opengroup.osdu.client.api.DpsHeaders.AUTHORIZATION; @Component +@RequestScope public class RequestInfoImpl implements IRequestInfo { @Autowired diff --git a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/ServiceAccountJwtClientImpl.java b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/ServiceAccountJwtClientImpl.java index ea106e046..c3aad79a3 100644 --- a/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/ServiceAccountJwtClientImpl.java +++ b/indexer-service-azure/src/main/java/org/opendes/indexer/azure/util/ServiceAccountJwtClientImpl.java @@ -15,6 +15,7 @@ import org.opengroup.osdu.client.multitenancy.ITenantFactory; import org.opengroup.osdu.client.multitenancy.TenantInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; import javax.naming.ServiceUnavailableException; @@ -22,6 +23,7 @@ import java.util.*; import java.util.concurrent.*; @Component +@RequestScope public class ServiceAccountJwtClientImpl implements IServiceAccountJwtClient { @Autowired @@ -32,6 +34,7 @@ public class ServiceAccountJwtClientImpl implements IServiceAccountJwtClient { private JwtCache cacheService; @Autowired private JaxRsDpsLog log; + @Autowired private AADConfiguration configuration; // diff --git a/indexer-service-azure/src/test/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImplTest.java b/indexer-service-azure/src/test/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImplTest.java new file mode 100644 index 000000000..3d90bae3b --- /dev/null +++ b/indexer-service-azure/src/test/java/org/opendes/indexer/azure/persistence/SchemaRepositoryImplTest.java @@ -0,0 +1,72 @@ +package org.opendes.indexer.azure.persistence; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.opendes.indexer.azure.model.ElasticSettingSchema; +import org.opengroup.osdu.client.api.DpsHeaders; +import org.opengroup.osdu.client.multitenancy.ITenantFactory; +import org.opengroup.osdu.client.multitenancy.TenantInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.HashMap; + +import static com.microsoft.azure.telemetry.TelemetryData.TENANT_NAME; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(SpringRunner.class) +public class SchemaRepositoryImplTest { + + private static final String TENANT_NAME = "common"; + + @Mock + private ITenantFactory tenantFactory; + + @Mock + private TenantInfo tenant; + + @Mock + private DpsHeaders headers; + + @InjectMocks + private SchemaRepositoryImpl sut; + + @Mock + private CosmosDBElasticSettings cosmosDB; + + @Value("${ELASTIC_DATASTORE_KIND}") + private String ELASTIC_DATASTORE_KIND; + + @Value("${ELASTIC_DATASTORE_ID}") + private String ELASTIC_DATASTORE_ID; + + + @Before + public void setup() { + when(this.headers.getPartitionIdWithFallbackToAccountId()).thenReturn(TENANT_NAME); + when(this.tenant.getName()).thenReturn(TENANT_NAME); + when(this.tenantFactory.exists(TENANT_NAME)).thenReturn(true); + when(this.tenantFactory.getTenantInfo(TENANT_NAME)).thenReturn(this.tenant); + } + + @Test + public void should_getSearchSettingsSuccessfully_when_add() { + + ElasticSettingSchema schema = new ElasticSettingSchema(); + schema.setHost("HOST"); + schema.setPort("PORT"); + schema.setUsernameAndPassword("USERNAME_PASSWORD"); + + String settingId = tenant.getName().concat("_").concat(ELASTIC_DATASTORE_ID); + + this.sut.add(schema,settingId); + + verify(this.sut.get(settingId).equals(schema)); + } +} -- GitLab