jerryshao commented on code in PR #5682:
URL: https://github.com/apache/gravitino/pull/5682#discussion_r1897088531


##########
core/src/main/java/org/apache/gravitino/connector/BaseCatalog.java:
##########
@@ -272,6 +293,48 @@ public Capability capability() {
     return capability;
   }
 
+  public List<Credential> getCredentials(
+      NameIdentifier nameIdentifier, CredentialPrivilege privilege) {
+    Map<String, CredentialContext> contexts = 
getCredentialContexts(nameIdentifier, privilege);
+    return contexts.entrySet().stream()
+        .map(entry -> 
getCatalogCredentialManager().getCredential(entry.getKey(), entry.getValue()))
+        .filter(Objects::nonNull)
+        .collect(Collectors.toList());
+  }
+
+  private CatalogCredentialProvider getCatalogCredentialManager() {
+    if (catalogCredentialProvider == null) {
+      synchronized (this) {
+        if (catalogCredentialProvider == null) {
+          this.catalogCredentialProvider = new 
CatalogCredentialProvider(name(), properties());
+        }
+      }
+    }
+    return catalogCredentialProvider;
+  }
+
+  private Map<String, CredentialContext> getCredentialContexts(
+      NameIdentifier nameIdentifier, CredentialPrivilege privilege) {
+    if 
(nameIdentifier.equals(NameIdentifierUtil.getCatalogIdentifier(nameIdentifier)))
 {
+      return getCatalogCredentialContexts();
+    }
+
+    if (ops() instanceof SupportsPathBasedCredentials) {
+      List<PathWithCredentialType> pathWithCredentialTypes =
+          ((SupportsPathBasedCredentials) 
ops()).getPathWithCredentialTypes(nameIdentifier);
+      return CredentialUtils.getPathBasedCredentialContexts(privilege, 
pathWithCredentialTypes);
+    }
+    throw new NotSupportedException(
+        String.format("Catalog %s doesn't support generate credentials", 
name()));
+  }
+
+  private Map<String, CredentialContext> getCatalogCredentialContexts() {
+    CatalogCredentialContext context =
+        new CatalogCredentialContext(PrincipalUtils.getCurrentUserName());
+    Set<String> providers = CredentialUtils.getCredentialProviders(() -> 
properties());
+    return providers.stream().collect(Collectors.toMap(provider -> provider, 
provider -> context));
+  }

Review Comment:
   Can we move this logic to `CredentialManager`? So from my understanding, 
each catalog can provide the list of `PathWithCredentialType` to the 
`CredentialManager`, credential manager can get credentials base on the 
provided list. We don't have to 1) introduce so manage concepts in the catalog 
level; 2) The credential management mechanism can all be achieved in one place. 
In the meantime, we don't have to introduce a concept of 
`CatalogCredentialProvider` to manage the credentials per catalog.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@gravitino.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to