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
