This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch custos-integration
in repository https://gitbox.apache.org/repos/asf/airavata-data-catalog.git

commit b94e1577aec721b8de51cce3bd438d030e689696
Author: Marcus Christie <[email protected]>
AuthorDate: Wed Mar 29 10:52:28 2023 -0400

    Adding Custos sharing manager initialization: creating entity type and 
permission type
    
    For #12
---
 .../datacatalog/api/model/TenantEntity.java        | 82 ++++++++++++++++++++++
 .../api/repository/TenantRepository.java           | 10 +++
 .../datacatalog/api/sharing/SharingManager.java    | 11 +++
 .../api/sharing/SharingManagerImpl.java            | 64 +++++++++++++++++
 .../src/main/resources/application.properties      |  2 +-
 5 files changed, 168 insertions(+), 1 deletion(-)

diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/TenantEntity.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/TenantEntity.java
new file mode 100644
index 0000000..928b25f
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/model/TenantEntity.java
@@ -0,0 +1,82 @@
+package org.apache.airavata.datacatalog.api.model;
+
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "tenant")
+public class TenantEntity {
+
+    @Id
+    @SequenceGenerator(name = "tenant_tenant_id_seq", sequenceName = 
"tenant_tenant_id_seq", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
"tenant_tenant_id_seq")
+    @Column(name = "tenant_id")
+    private Long tenantId;
+
+    /**
+     * The identifier for the tenant. This external identifier comes from the 
tenant
+     * management service that data catalog is configured to use.
+     */
+    @Basic
+    @Column(name = "external_id", nullable = false)
+    private String externalId;
+
+    @Basic
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getExternalId() {
+        return externalId;
+    }
+
+    public void setExternalId(String externalId) {
+        this.externalId = externalId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((tenantId == null) ? 0 : 
tenantId.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        TenantEntity other = (TenantEntity) obj;
+        if (tenantId == null) {
+            if (other.tenantId != null)
+                return false;
+        } else if (!tenantId.equals(other.tenantId))
+            return false;
+        return true;
+    }
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/TenantRepository.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/TenantRepository.java
new file mode 100644
index 0000000..a90d0db
--- /dev/null
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/repository/TenantRepository.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.datacatalog.api.repository;
+
+import org.apache.airavata.datacatalog.api.model.TenantEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public interface TenantRepository extends JpaRepository<TenantEntity, Long> {
+
+}
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
index 1a5c3f7..e6db3c6 100644
--- 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManager.java
@@ -9,6 +9,17 @@ import org.apache.airavata.datacatalog.api.model.UserEntity;
 
 public interface SharingManager {
 
+    /**
+     * Initialize the sharing manager as necessary. In general this would be 
called
+     * once when a tenant is first created and also once for each tenant on 
startup
+     * (in case initialization needs to be redone or new steps have been added 
to
+     * initialization).
+     *
+     * @param tenantId
+     * @throws SharingException
+     */
+    void initialize(String tenantId) throws SharingException;
+
     /**
      * Get or create a {@link UserEntity}.
      *
diff --git 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManagerImpl.java
 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManagerImpl.java
index 4cf34ce..59cb17b 100644
--- 
a/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManagerImpl.java
+++ 
b/data-catalog-api/server/src/main/java/org/apache/airavata/datacatalog/api/sharing/SharingManagerImpl.java
@@ -2,27 +2,91 @@ package org.apache.airavata.datacatalog.api.sharing;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.airavata.datacatalog.api.DataProduct;
 import org.apache.airavata.datacatalog.api.GroupInfo;
 import org.apache.airavata.datacatalog.api.Permission;
 import org.apache.airavata.datacatalog.api.UserInfo;
 import org.apache.airavata.datacatalog.api.exception.SharingException;
+import org.apache.airavata.datacatalog.api.model.TenantEntity;
 import org.apache.airavata.datacatalog.api.model.UserEntity;
+import org.apache.airavata.datacatalog.api.repository.TenantRepository;
+import org.apache.custos.sharing.core.EntityType;
+import org.apache.custos.sharing.core.PermissionType;
 import org.apache.custos.sharing.core.exceptions.CustosSharingException;
 import org.apache.custos.sharing.core.impl.SharingImpl;
 import org.apache.custos.sharing.core.utils.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import jakarta.annotation.PostConstruct;
+
 @Component
 public class SharingManagerImpl implements SharingManager {
 
+    private static final Logger logger = 
LoggerFactory.getLogger(SharingManagerImpl.class);
+
+    private static final String DATA_PRODUCT_ENTITY_TYPE_ID = "DATA_PRODUCT";
+
     @Autowired
     SharingImpl custosSharingImpl;
 
+    @Autowired
+    TenantRepository tenantRepository;
+
     private static final String PUBLIC_ACCESS_GROUP = "public_access_group";
 
+    @PostConstruct
+    public void initializeTenants() throws SharingException {
+
+        logger.info("Initializing all tenants");
+        List<TenantEntity> tenants = tenantRepository.findAll();
+        for (TenantEntity tenant : tenants) {
+            this.initialize(tenant.getExternalId());
+        }
+    }
+
+    @Override
+    public void initialize(String tenantId) throws SharingException {
+
+        logger.info("Initializing tenant {}", tenantId);
+
+        // Create DataProduct entity type
+        EntityType entityType = EntityType.newBuilder()
+                .setId(DATA_PRODUCT_ENTITY_TYPE_ID)
+                .setName("Data Product")
+                .build();
+        try {
+            Optional<EntityType> existingEntityType = 
custosSharingImpl.getEntityType(tenantId, entityType.getId());
+            if (!existingEntityType.isPresent()) {
+                custosSharingImpl.createEntityType(tenantId, entityType);
+            }
+        } catch (CustosSharingException e) {
+            throw new SharingException(e);
+        }
+
+        // Create permission types for all permissions
+        for (Permission permission : Permission.values()) {
+
+            PermissionType permissionType = PermissionType.newBuilder()
+                    .setId(permission.name())
+                    .setName(permission.name())
+                    .build();
+            try {
+                Optional<PermissionType> existingPermissionType = 
custosSharingImpl.getPermissionType(tenantId,
+                        permissionType.getId());
+                if (!existingPermissionType.isPresent()) {
+                    custosSharingImpl.createPermissionType(permissionType, 
tenantId);
+                }
+            } catch (CustosSharingException e) {
+                throw new SharingException(e);
+            }
+        }
+    }
+
     @Override
     public UserEntity resolveUser(UserInfo userInfo) {
         return null;
diff --git a/data-catalog-api/server/src/main/resources/application.properties 
b/data-catalog-api/server/src/main/resources/application.properties
index a3d7d14..2064c00 100644
--- a/data-catalog-api/server/src/main/resources/application.properties
+++ b/data-catalog-api/server/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.datasource.url=jdbc:postgresql://localhost:5431/data_catalog
+spring.datasource.url=jdbc:postgresql://localhost:5432/data_catalog
 spring.datasource.username=postgres
 spring.datasource.password=example
 spring.jpa.hibernate.ddl-auto=update

Reply via email to