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