From 03b980bc64d447548900bf8812c427079ff36966 Mon Sep 17 00:00:00 2001
From: Igor_Filippov <Igor_Filippov@epam.com>
Date: Fri, 28 May 2021 17:06:16 +0300
Subject: [PATCH] iamCredentials added

---
 provider/indexer-gcp/pom.xml                  |  2 +-
 .../util/ServiceAccountJwtGcpClientImpl.java  | 53 +++++++------------
 .../ServiceAccountJwtGcpClientImplTest.java   | 36 +++++++------
 3 files changed, 40 insertions(+), 51 deletions(-)

diff --git a/provider/indexer-gcp/pom.xml b/provider/indexer-gcp/pom.xml
index c1d847eae..c77d9f8e3 100644
--- a/provider/indexer-gcp/pom.xml
+++ b/provider/indexer-gcp/pom.xml
@@ -25,7 +25,7 @@
         <dependency>
             <groupId>org.opengroup.osdu</groupId>
             <artifactId>core-lib-gcp</artifactId>
-            <version>0.9.0-SNAPSHOT</version>
+            <version>0.15.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>
diff --git a/provider/indexer-gcp/src/main/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImpl.java b/provider/indexer-gcp/src/main/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImpl.java
index 2d0c77f76..31477a2a1 100644
--- a/provider/indexer-gcp/src/main/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImpl.java
+++ b/provider/indexer-gcp/src/main/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImpl.java
@@ -16,15 +16,12 @@ package org.opengroup.osdu.indexer.util;
 
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.exceptions.JWTDecodeException;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
-import com.google.api.client.http.HttpTransport;
 import com.google.api.client.json.JsonFactory;
 import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.iam.v1.Iam;
-import com.google.api.services.iam.v1.IamScopes;
-import com.google.api.services.iam.v1.model.SignJwtRequest;
-import com.google.api.services.iam.v1.model.SignJwtResponse;
+import com.google.cloud.iam.credentials.v1.IamCredentialsClient;
+import com.google.cloud.iam.credentials.v1.ServiceAccountName;
+import com.google.cloud.iam.credentials.v1.SignJwtRequest;
+import com.google.cloud.iam.credentials.v1.SignJwtResponse;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import org.apache.http.HttpHeaders;
@@ -63,11 +60,11 @@ import java.util.Map;
 public class ServiceAccountJwtGcpClientImpl implements IServiceAccountJwtClient {
 
     private static final String JWT_AUDIENCE = "https://www.googleapis.com/oauth2/v4/token";
-    private static final String SERVICE_ACCOUNT_NAME_FORMAT = "projects/%s/serviceAccounts/%s";
+    private static final String SERVICE_ACCOUNT_NAME_FORMAT = "projects/-/serviceAccounts/%s";
 
     private final JsonFactory jsonFactory = new JacksonFactory();
 
-    private Iam iam;
+    private IamCredentialsClient iam;
 
     @Inject
     private ITenantFactory tenantInfoServiceProvider;
@@ -100,13 +97,17 @@ public class ServiceAccountJwtGcpClientImpl implements IServiceAccountJwtClient
             // Getting signed JWT
             Map<String, Object> signJwtPayload = this.getJWTCreationPayload(tenant);
 
-            SignJwtRequest signJwtRequest = new SignJwtRequest();
-            signJwtRequest.setPayload(jsonFactory.toString(signJwtPayload));
-
-            String serviceAccountName = String.format(SERVICE_ACCOUNT_NAME_FORMAT, tenant.getProjectId(), tenant.getServiceAccount());
-
-            Iam.Projects.ServiceAccounts.SignJwt signJwt = this.getIam().projects().serviceAccounts().signJwt(serviceAccountName, signJwtRequest);
-            SignJwtResponse signJwtResponse = signJwt.execute();
+            ServiceAccountName name = ServiceAccountName.parse(String.format(SERVICE_ACCOUNT_NAME_FORMAT,
+                tenant.getServiceAccount()));
+            List<String> delegates = new ArrayList<>();
+            delegates.add(tenant.getServiceAccount());
+
+            SignJwtRequest request = SignJwtRequest.newBuilder()
+                .setName(name.toString())
+                .addAllDelegates(delegates)
+                .setPayload(jsonFactory.toString(signJwtPayload))
+                .build();
+            SignJwtResponse signJwtResponse = this.getIamCredentialsClient().signJwt(request);
             String signedJwt = signJwtResponse.getSignedJwt();
 
             // Getting id token
@@ -143,26 +144,10 @@ public class ServiceAccountJwtGcpClientImpl implements IServiceAccountJwtClient
         }
     }
 
-    public Iam getIam() throws Exception {
-
+    public IamCredentialsClient getIamCredentialsClient() throws Exception {
         if (this.iam == null) {
-            HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
-
-            // Authenticate using Google Application Default Credentials.
-            GoogleCredential credential = GoogleCredential.getApplicationDefault();
-            if (credential.createScopedRequired()) {
-                List<String> scopes = new ArrayList<>();
-                // Enable full Cloud Platform scope.
-                scopes.add(IamScopes.CLOUD_PLATFORM);
-                credential = credential.createScoped(scopes);
-            }
-
-            // Create IAM API object associated with the authenticated transport.
-            this.iam = new Iam.Builder(httpTransport, jsonFactory, credential)
-                    .setApplicationName(properties.getIndexerHost())
-                    .build();
+            this.iam = IamCredentialsClient.create();
         }
-
         return this.iam;
     }
 
diff --git a/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImplTest.java b/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImplTest.java
index 1089d7dba..5a5446e66 100644
--- a/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImplTest.java
+++ b/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/util/ServiceAccountJwtGcpClientImplTest.java
@@ -17,8 +17,11 @@ package org.opengroup.osdu.indexer.util;
 import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
 import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
 import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.services.iam.v1.Iam;
-import com.google.api.services.iam.v1.model.SignJwtResponse;
+import com.google.api.gax.rpc.UnaryCallable;
+import com.google.cloud.iam.credentials.v1.IamCredentialsClient;
+import com.google.cloud.iam.credentials.v1.SignJwtRequest;
+import com.google.cloud.iam.credentials.v1.SignJwtResponse;
+import com.google.cloud.iam.credentials.v1.stub.IamCredentialsStub;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.impl.client.CloseableHttpClient;
@@ -31,6 +34,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.Spy;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
 import org.opengroup.osdu.core.common.model.http.AppException;
@@ -40,6 +44,7 @@ import org.opengroup.osdu.core.common.model.search.IdToken;
 import org.opengroup.osdu.core.common.provider.interfaces.IJwtCache;
 import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties;
 import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.reflect.Whitebox;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import static org.junit.Assert.fail;
@@ -49,7 +54,7 @@ import static org.powermock.api.mockito.PowerMockito.when;
 
 @Ignore
 @RunWith(SpringRunner.class)
-@PrepareForTest({GoogleNetHttpTransport.class, GoogleCredential.class, NetHttpTransport.class, SignJwtResponse.class, Iam.Builder.class, HttpClients.class, EntityUtils.class, IndexerConfigurationProperties.class})
+@PrepareForTest({GoogleNetHttpTransport.class, GoogleCredential.class, NetHttpTransport.class, SignJwtResponse.class, HttpClients.class, EntityUtils.class, IndexerConfigurationProperties.class})
 public class ServiceAccountJwtGcpClientImplTest {
 
     private static final String JWT_TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik1UVXlPREE0TXpFd09BPT0ifQ.eyJzdWIiOiJtemh1OUBzbGIuY29tIiwiaXNzIjoic2F1dGgtcHJldmlldy5zbGIuY29tIiwiYXVkIjoidGVzdC1zbGJkZXYtZGV2cG9ydGFsLnNsYmFwcC5jb20iLCJpYXQiOjE1MjgxNDg5MTUsImV4cCI6MTUyODIzNTMxNSwicHJvdmlkZXIiOiJzbGIuY29tIiwiY2xpZW50IjoidGVzdC1zbGJkZXYtZGV2cG9ydGFsLnNsYmFwcC5jb20iLCJ1c2VyaWQiOiJtemh1OUBzbGIuY29tIiwiZW1haWwiOiJtemh1OUBzbGIuY29tIiwiYXV0aHoiOiJ7XCJhY2NvdW50Q291bnRyeVwiOntcImNvZGVcIjpcInVzXCIsXCJpZFwiOjU3MTU5OTkxMDE4MTI3MzYsXCJuYW1lXCI6XCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2FcIn0sXCJhY2NvdW50SWRcIjo1NjkxODc4ODMzOTEzODU2LFwiYWNjb3VudE5hbWVcIjpcIlNJUyBJbnRlcm5hbCBIUVwiLFwiY3JlYXRlZFwiOlwiMjAxOC0wNS0wM1QxNzoyNTo1NS40NDNaXCIsXCJkZXBhcnRtZW50TWFuYWdlclwiOm51bGwsXCJzdWJzY3JpcHRpb25zXCI6W3tcImFjY291bnRJZFwiOjU2OTE4Nzg4MzM5MTM4NTYsXCJjb250cmFjdElkXCI6NTc1MTcwMDIxMjE1NDM2OCxcImNyZWF0ZWRcIjpcIjIwMTgtMDUtMDNUMTc6MzM6MDkuNTczWlwiLFwiY3JtQ29udHJhY3RJZFwiOlwiU0lTLUlOVEVSTkFMLUhRLVFBXCIsXCJjcm1Db250cmFjdEl0ZW1JZFwiOlwiZGV2bGlcIixcImV4cGlyYXRpb25cIjpcIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwWlwiLFwiaWRcIjo1MDc5Mjg4NTA0MTIzMzkyLFwicHJvZHVjdFwiOntcImNvZGVcIjpcImRldmVsb3Blci1saWdodFwiLFwiY29tY2F0TmFtZVwiOlwiTm90IGluIENvbUNhdFwiLFwiZmVhdHVyZVNldHNcIjpbe1wiYXBwbGljYXRpb25cIjp7XCJjb2RlXCI6XCJhcGlkZXZlbG9wZXJwb3J0YWxcIixcImlkXCI6NTE2ODkzMDY5NTkzODA0OCxcIm5hbWVcIjpcIkFQSSBEZXZlbG9wZXIgUG9ydGFsXCIsXCJ0eXBlXCI6XCJXZWJBcHBcIn0sXCJjbGFpbXNcIjpudWxsLFwiaWRcIjo1MTkxNTcyMjg3MTI3NTUyLFwibmFtZVwiOlwiRGV2ZWxvcGVyXCIsXCJ0eXBlXCI6XCJCQVNFXCJ9XSxcImlkXCI6NTE1MDczMDE1MTI2NDI1NixcIm5hbWVcIjpcIkRldmVsb3BlciBQb3J0YWxcIixcInBhcnROdW1iZXJcIjpcIlNERUwtUEItU1VCVVwifX1dLFwidXNlckVtYWlsXCI6XCJtemh1OUBzbGIuY29tXCIsXCJ1c2VyTmFtZVwiOlwiTWluZ3lhbmcgWmh1XCJ9XG4iLCJsYXN0bmFtZSI6IlpodSIsImZpcnN0bmFtZSI6Ik1pbmd5YW5nIiwiY291bnRyeSI6IiIsImNvbXBhbnkiOiIiLCJqb2J0aXRsZSI6IiIsInN1YmlkIjoiNDE3YjczMjktYmMwNy00OTFmLWJiYzQtZTQ1YjRhMWFiYjVjLVd3U0c0dyIsImlkcCI6ImNvcnAyIiwiaGQiOiJzbGIuY29tIn0.WQfGr1Xu-6IdaXdoJ9Fwzx8O2el1UkFPWo1vk_ujiAfdOjAR46UG5SrBC7mzC7gYRyK3a4fimBmbv3uRVJjTNXdxXRLZDw0SvXUMIOqjUGLom491ESbrtka_Xz7vGO-tWyDcEQDTfFzQ91LaVN7XdzL18_EDTXZoPhKb-zquyk9WLQxP9Mw-3Yh-UrbvC9nl1-GRn1IVbzp568kqkpOVUFM9alYSGw-oMGDZNt1DIYOJnpGaw2RB5B3AKvNivZH_Xdac7ZTzQbsDOt8B8DL2BphuxcJ9jshCJkM2SHQ15uErv8sfnzMwdF08e_0QcC_30I8eX9l8yOu6TnwwqlXunw";
@@ -63,15 +68,11 @@ public class ServiceAccountJwtGcpClientImplTest {
     @Mock
     private NetHttpTransport httpTransport;
     @Mock
-    private SignJwtResponse signJwtResponse;
+    private IamCredentialsClient iam;
     @Mock
-    private Iam iam;
+    private IamCredentialsStub iamCredentialsStub;
     @Mock
-    private Iam.Projects iamProject;
-    @Mock
-    private Iam.Projects.ServiceAccounts iamProjectServiceAccounts;
-    @Mock
-    private Iam.Projects.ServiceAccounts.SignJwt signJwt;
+    private UnaryCallable<SignJwtRequest, SignJwtResponse> unaryCallable;
     @Mock
     private CloseableHttpClient httpClient;
     @Mock
@@ -109,12 +110,15 @@ public class ServiceAccountJwtGcpClientImplTest {
         tenantInfo.setServiceAccount("tenant");
 //        when(this.tenantInfoService.getTenantInfo()).thenReturn(tenantInfo);
 
-        when(this.sut.getIam()).thenReturn(iam);
-        when(this.iam.projects()).thenReturn(iamProject);
-        when(this.iamProject.serviceAccounts()).thenReturn(iamProjectServiceAccounts);
-        when(this.iamProjectServiceAccounts.signJwt(any(), any())).thenReturn(signJwt);
-        when(this.signJwt.execute()).thenReturn(signJwtResponse);
-        when(this.signJwtResponse.getSignedJwt()).thenReturn("testJwt");
+        when(this.sut.getIamCredentialsClient()).thenReturn(iam);
+        Whitebox.setInternalState(iam, "stub", iamCredentialsStub);
+
+        SignJwtResponse signJwtResponse = SignJwtResponse.getDefaultInstance();
+        SignJwtRequest signJwtRequest = SignJwtRequest.newBuilder().build();
+
+        when(iamCredentialsStub.signJwtCallable()).thenReturn(unaryCallable);
+        when(unaryCallable.call(any())).thenReturn(signJwtResponse);
+        when(iam.signJwt(signJwtRequest)).thenReturn(signJwtResponse);
 
     }
 
-- 
GitLab