mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-11-03 20:19:31 +00:00 
			
		
		
		
	
							parent
							
								
									806dcea0de
								
							
						
					
					
						commit
						f4acc4af1f
					
				@ -136,7 +136,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
 | 
			
		||||
    // start event hub before registering publishers
 | 
			
		||||
    EventPubSub.start();
 | 
			
		||||
 | 
			
		||||
    registerResources(catalogConfig, environment, jdbi, secretsManager);
 | 
			
		||||
    registerResources(catalogConfig, environment, jdbi);
 | 
			
		||||
 | 
			
		||||
    // Register Event Handler
 | 
			
		||||
    registerEventFilter(catalogConfig, environment, jdbi);
 | 
			
		||||
@ -270,9 +270,8 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void registerResources(
 | 
			
		||||
      OpenMetadataApplicationConfig config, Environment environment, Jdbi jdbi, SecretsManager secretsManager) {
 | 
			
		||||
    CollectionRegistry.getInstance().registerResources(jdbi, environment, config, authorizer, secretsManager);
 | 
			
		||||
  private void registerResources(OpenMetadataApplicationConfig config, Environment environment, Jdbi jdbi) {
 | 
			
		||||
    CollectionRegistry.getInstance().registerResources(jdbi, environment, config, authorizer);
 | 
			
		||||
    environment.jersey().register(new JsonPatchProvider());
 | 
			
		||||
    ErrorPageErrorHandler eph = new ErrorPageErrorHandler();
 | 
			
		||||
    eph.addErrorPage(Response.Status.NOT_FOUND.getStatusCode(), "/");
 | 
			
		||||
 | 
			
		||||
@ -23,17 +23,15 @@ import org.openmetadata.schema.type.Relationship;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.bots.BotResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil.Fields;
 | 
			
		||||
 | 
			
		||||
public class BotRepository extends EntityRepository<Bot> {
 | 
			
		||||
 | 
			
		||||
  static final String BOT_UPDATE_FIELDS = "botUser";
 | 
			
		||||
 | 
			
		||||
  final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  public BotRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public BotRepository(CollectionDAO dao) {
 | 
			
		||||
    super(BotResource.COLLECTION_PATH, Entity.BOT, Bot.class, dao.botDAO(), dao, "", BOT_UPDATE_FIELDS);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
@ -54,6 +52,7 @@ public class BotRepository extends EntityRepository<Bot> {
 | 
			
		||||
    entity.withBotUser(null);
 | 
			
		||||
    store(entity.getId(), entity, update);
 | 
			
		||||
    if (!BotType.BOT.equals(entity.getBotType())) {
 | 
			
		||||
      SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
      secretsManager.encryptOrDecryptBotCredentials(entity.getBotType().value(), botUser.getName(), true);
 | 
			
		||||
    }
 | 
			
		||||
    entity.withBotUser(botUser);
 | 
			
		||||
 | 
			
		||||
@ -18,17 +18,15 @@ import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.type.DashboardConnection;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.services.dashboard.DashboardServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class DashboardServiceRepository extends ServiceEntityRepository<DashboardService, DashboardConnection> {
 | 
			
		||||
 | 
			
		||||
  public DashboardServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public DashboardServiceRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        DashboardServiceResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.DASHBOARD_SERVICE,
 | 
			
		||||
        dao,
 | 
			
		||||
        dao.dashboardServiceDAO(),
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        DashboardConnection.class,
 | 
			
		||||
        ServiceType.DASHBOARD);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -18,16 +18,14 @@ import org.openmetadata.schema.entity.services.DatabaseService;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.services.database.DatabaseServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class DatabaseServiceRepository extends ServiceEntityRepository<DatabaseService, DatabaseConnection> {
 | 
			
		||||
  public DatabaseServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public DatabaseServiceRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        DatabaseServiceResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.DATABASE_SERVICE,
 | 
			
		||||
        dao,
 | 
			
		||||
        dao.dbServiceDAO(),
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        DatabaseConnection.class,
 | 
			
		||||
        ServiceType.DATABASE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,7 @@ import org.openmetadata.schema.type.Relationship;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil.Fields;
 | 
			
		||||
import org.openmetadata.service.util.FullyQualifiedName;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
@ -39,9 +40,7 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
 | 
			
		||||
  private static final String PATCH_FIELDS = "owner,sourceConfig,airflowConfig,loggerLevel,enabled";
 | 
			
		||||
  private static PipelineServiceClient pipelineServiceClient;
 | 
			
		||||
 | 
			
		||||
  private final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  public IngestionPipelineRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public IngestionPipelineRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        IngestionPipelineResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.INGESTION_PIPELINE,
 | 
			
		||||
@ -50,7 +49,6 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
 | 
			
		||||
        dao,
 | 
			
		||||
        PATCH_FIELDS,
 | 
			
		||||
        UPDATE_FIELDS);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
@ -83,6 +81,7 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
 | 
			
		||||
    ingestionPipeline.withOwner(null).withService(null).withHref(null);
 | 
			
		||||
 | 
			
		||||
    // encrypt config in case of local secret manager
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (secretsManager.isLocal()) {
 | 
			
		||||
      secretsManager.encryptOrDecryptDbtConfigSource(ingestionPipeline, service, true);
 | 
			
		||||
      store(ingestionPipeline.getId(), ingestionPipeline, update);
 | 
			
		||||
@ -152,6 +151,7 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateSourceConfig() throws JsonProcessingException {
 | 
			
		||||
      SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
      secretsManager.encryptOrDecryptDbtConfigSource(original, false);
 | 
			
		||||
 | 
			
		||||
      JSONObject origSourceConfig = new JSONObject(JsonUtils.pojoToJson(original.getSourceConfig().getConfig()));
 | 
			
		||||
 | 
			
		||||
@ -18,18 +18,16 @@ import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.type.MessagingConnection;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.services.messaging.MessagingServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class MessagingServiceRepository extends ServiceEntityRepository<MessagingService, MessagingConnection> {
 | 
			
		||||
  private static final String UPDATE_FIELDS = "owner, connection";
 | 
			
		||||
 | 
			
		||||
  public MessagingServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public MessagingServiceRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        MessagingServiceResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.MESSAGING_SERVICE,
 | 
			
		||||
        dao,
 | 
			
		||||
        dao.messagingServiceDAO(),
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        MessagingConnection.class,
 | 
			
		||||
        UPDATE_FIELDS,
 | 
			
		||||
        ServiceType.MESSAGING);
 | 
			
		||||
 | 
			
		||||
@ -18,18 +18,16 @@ import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.type.MlModelConnection;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.services.mlmodel.MlModelServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class MlModelServiceRepository extends ServiceEntityRepository<MlModelService, MlModelConnection> {
 | 
			
		||||
  private static final String UPDATE_FIELDS = "owner,connection";
 | 
			
		||||
 | 
			
		||||
  public MlModelServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public MlModelServiceRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        MlModelServiceResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.MLMODEL_SERVICE,
 | 
			
		||||
        dao,
 | 
			
		||||
        dao.mlModelServiceDAO(),
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        MlModelConnection.class,
 | 
			
		||||
        UPDATE_FIELDS,
 | 
			
		||||
        ServiceType.ML_MODEL);
 | 
			
		||||
 | 
			
		||||
@ -18,17 +18,15 @@ import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.type.PipelineConnection;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.resources.services.pipeline.PipelineServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class PipelineServiceRepository extends ServiceEntityRepository<PipelineService, PipelineConnection> {
 | 
			
		||||
 | 
			
		||||
  public PipelineServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public PipelineServiceRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        PipelineServiceResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.PIPELINE_SERVICE,
 | 
			
		||||
        dao,
 | 
			
		||||
        dao.pipelineServiceDAO(),
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        PipelineConnection.class,
 | 
			
		||||
        ServiceType.PIPELINE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@ import org.openmetadata.schema.ServiceEntityInterface;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.type.EntityReference;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
 | 
			
		||||
@ -32,8 +33,6 @@ public abstract class ServiceEntityRepository<
 | 
			
		||||
 | 
			
		||||
  @Getter private final Class<S> serviceConnectionClass;
 | 
			
		||||
 | 
			
		||||
  protected final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  @Getter private final ServiceType serviceType;
 | 
			
		||||
 | 
			
		||||
  protected ServiceEntityRepository(
 | 
			
		||||
@ -41,10 +40,9 @@ public abstract class ServiceEntityRepository<
 | 
			
		||||
      String service,
 | 
			
		||||
      CollectionDAO dao,
 | 
			
		||||
      EntityDAO<T> entityDAO,
 | 
			
		||||
      SecretsManager secretsManager,
 | 
			
		||||
      Class<S> serviceConnectionClass,
 | 
			
		||||
      ServiceType serviceType) {
 | 
			
		||||
    this(collectionPath, service, dao, entityDAO, secretsManager, serviceConnectionClass, UPDATE_FIELDS, serviceType);
 | 
			
		||||
    this(collectionPath, service, dao, entityDAO, serviceConnectionClass, UPDATE_FIELDS, serviceType);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected ServiceEntityRepository(
 | 
			
		||||
@ -52,12 +50,10 @@ public abstract class ServiceEntityRepository<
 | 
			
		||||
      String service,
 | 
			
		||||
      CollectionDAO dao,
 | 
			
		||||
      EntityDAO<T> entityDAO,
 | 
			
		||||
      SecretsManager secretsManager,
 | 
			
		||||
      Class<S> serviceConnectionClass,
 | 
			
		||||
      String updatedFields,
 | 
			
		||||
      ServiceType serviceType) {
 | 
			
		||||
    super(collectionPath, service, entityDAO.getEntityClass(), entityDAO, dao, "", updatedFields);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
    this.serviceConnectionClass = serviceConnectionClass;
 | 
			
		||||
    this.serviceType = serviceType;
 | 
			
		||||
  }
 | 
			
		||||
@ -83,6 +79,7 @@ public abstract class ServiceEntityRepository<
 | 
			
		||||
    service.withOwner(null).withHref(null);
 | 
			
		||||
 | 
			
		||||
    // encrypt connection config in case of local secret manager
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (secretsManager.isLocal()) {
 | 
			
		||||
      service
 | 
			
		||||
          .getConnection()
 | 
			
		||||
@ -135,6 +132,7 @@ public abstract class ServiceEntityRepository<
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateConnection() throws IOException {
 | 
			
		||||
      SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
      if (secretsManager.isLocal()) {
 | 
			
		||||
        ServiceConnectionEntityInterface origConn = original.getConnection();
 | 
			
		||||
        ServiceConnectionEntityInterface updatedConn = updated.getConnection();
 | 
			
		||||
 | 
			
		||||
@ -40,6 +40,7 @@ import org.openmetadata.service.exception.CatalogExceptionMessage;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord;
 | 
			
		||||
import org.openmetadata.service.resources.teams.UserResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.policyevaluator.SubjectCache;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil.Fields;
 | 
			
		||||
@ -50,9 +51,8 @@ public class UserRepository extends EntityRepository<User> {
 | 
			
		||||
  static final String USER_PATCH_FIELDS = "profile,roles,teams,authenticationMechanism,isEmailVerified";
 | 
			
		||||
  static final String USER_UPDATE_FIELDS = "profile,roles,teams,authenticationMechanism,isEmailVerified";
 | 
			
		||||
  private final EntityReference organization;
 | 
			
		||||
  private final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  public UserRepository(CollectionDAO dao, SecretsManager secretsManager) {
 | 
			
		||||
  public UserRepository(CollectionDAO dao) {
 | 
			
		||||
    super(
 | 
			
		||||
        UserResource.COLLECTION_PATH,
 | 
			
		||||
        Entity.USER,
 | 
			
		||||
@ -62,7 +62,6 @@ public class UserRepository extends EntityRepository<User> {
 | 
			
		||||
        USER_PATCH_FIELDS,
 | 
			
		||||
        USER_UPDATE_FIELDS);
 | 
			
		||||
    organization = dao.teamDAO().findEntityReferenceByName(Entity.ORGANIZATION_NAME, Include.ALL);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public final Fields getFieldsWithUserAuth(String fields) {
 | 
			
		||||
@ -112,6 +111,7 @@ public class UserRepository extends EntityRepository<User> {
 | 
			
		||||
    // Don't store roles, teams and href as JSON. Build it on the fly based on relationships
 | 
			
		||||
    user.withRoles(null).withTeams(null).withHref(null).withInheritedRoles(null);
 | 
			
		||||
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (secretsManager != null && Boolean.TRUE.equals(user.getIsBot()) && user.getAuthenticationMechanism() != null) {
 | 
			
		||||
      user.getAuthenticationMechanism()
 | 
			
		||||
          .setConfig(
 | 
			
		||||
@ -226,10 +226,11 @@ public class UserRepository extends EntityRepository<User> {
 | 
			
		||||
  @Transaction
 | 
			
		||||
  public User getByNameWithSecretManager(String fqn, Fields fields) throws IOException {
 | 
			
		||||
    User user = getByName(null, fqn, fields, NON_DELETED);
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (user.getAuthenticationMechanism() != null) {
 | 
			
		||||
      user.getAuthenticationMechanism()
 | 
			
		||||
          .withConfig(
 | 
			
		||||
              this.secretsManager.encryptOrDecryptBotUserCredentials(
 | 
			
		||||
              secretsManager.encryptOrDecryptBotUserCredentials(
 | 
			
		||||
                  user.getName(), user.getAuthenticationMechanism().getConfig(), false));
 | 
			
		||||
    }
 | 
			
		||||
    return user;
 | 
			
		||||
 | 
			
		||||
@ -21,17 +21,8 @@ import java.lang.annotation.Target;
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR})
 | 
			
		||||
public @interface Collection {
 | 
			
		||||
  enum ConstructorType {
 | 
			
		||||
    CONFIG,
 | 
			
		||||
    DAO_AUTH,
 | 
			
		||||
    DAO_AUTH_SM,
 | 
			
		||||
    DAO_AUTH_CONFIG,
 | 
			
		||||
    DAO_AUTH_SM_CONFIG,
 | 
			
		||||
  }
 | 
			
		||||
  String name();
 | 
			
		||||
 | 
			
		||||
  String name() default "";
 | 
			
		||||
  /** Only order from 0 to 9 (inclusive) are allowed */
 | 
			
		||||
  int order() default 9;
 | 
			
		||||
 | 
			
		||||
  ConstructorType constructorType() default ConstructorType.DAO_AUTH;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,6 @@ import io.dropwizard.setup.Environment;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.lang.annotation.Annotation;
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
@ -42,7 +41,6 @@ import org.openmetadata.schema.type.CollectionDescriptor;
 | 
			
		||||
import org.openmetadata.schema.type.CollectionInfo;
 | 
			
		||||
import org.openmetadata.service.OpenMetadataApplicationConfig;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.RestUtil;
 | 
			
		||||
import org.reflections.Reflections;
 | 
			
		||||
@ -181,11 +179,7 @@ public final class CollectionRegistry {
 | 
			
		||||
 | 
			
		||||
  /** Register resources from CollectionRegistry */
 | 
			
		||||
  public void registerResources(
 | 
			
		||||
      Jdbi jdbi,
 | 
			
		||||
      Environment environment,
 | 
			
		||||
      OpenMetadataApplicationConfig config,
 | 
			
		||||
      Authorizer authorizer,
 | 
			
		||||
      SecretsManager secretsManager) {
 | 
			
		||||
      Jdbi jdbi, Environment environment, OpenMetadataApplicationConfig config, Authorizer authorizer) {
 | 
			
		||||
    // Build list of ResourceDescriptors
 | 
			
		||||
    for (Map.Entry<String, CollectionDetails> e : collectionMap.entrySet()) {
 | 
			
		||||
      CollectionDetails details = e.getValue();
 | 
			
		||||
@ -193,7 +187,7 @@ public final class CollectionRegistry {
 | 
			
		||||
      try {
 | 
			
		||||
        CollectionDAO daoObject = jdbi.onDemand(CollectionDAO.class);
 | 
			
		||||
        Objects.requireNonNull(daoObject, "CollectionDAO must not be null");
 | 
			
		||||
        Object resource = createResource(daoObject, resourceClass, config, authorizer, secretsManager);
 | 
			
		||||
        Object resource = createResource(daoObject, resourceClass, config, authorizer);
 | 
			
		||||
        details.setResource(resource);
 | 
			
		||||
        environment.jersey().register(resource);
 | 
			
		||||
        LOG.info("Registering {} with order {}", resourceClass, details.order);
 | 
			
		||||
@ -212,28 +206,24 @@ public final class CollectionRegistry {
 | 
			
		||||
 | 
			
		||||
  /** Get collection details based on annotations in Resource classes */
 | 
			
		||||
  private static CollectionDetails getCollection(Class<?> cl) {
 | 
			
		||||
    String href;
 | 
			
		||||
    String doc;
 | 
			
		||||
    String name;
 | 
			
		||||
    int order = 0;
 | 
			
		||||
    href = null;
 | 
			
		||||
    doc = null;
 | 
			
		||||
    name = null;
 | 
			
		||||
    CollectionInfo collectionInfo = new CollectionInfo();
 | 
			
		||||
    for (Annotation a : cl.getAnnotations()) {
 | 
			
		||||
      if (a instanceof Path) {
 | 
			
		||||
        // Use @Path annotation to compile href
 | 
			
		||||
        href = ((Path) a).value();
 | 
			
		||||
        collectionInfo.withHref(URI.create(((Path) a).value()));
 | 
			
		||||
      } else if (a instanceof Api) {
 | 
			
		||||
        // Use @Api annotation to get documentation about the collection
 | 
			
		||||
        doc = ((Api) a).value();
 | 
			
		||||
        collectionInfo.withDocumentation(((Api) a).value());
 | 
			
		||||
      } else if (a instanceof Collection) {
 | 
			
		||||
        // Use @Collection annotation to get initialization information for the class
 | 
			
		||||
        name = ((Collection) a).name();
 | 
			
		||||
        order = ((Collection) a).order();
 | 
			
		||||
        Collection collection = (Collection) a;
 | 
			
		||||
        collectionInfo.withName(collection.name());
 | 
			
		||||
        order = collection.order();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    CollectionDescriptor cd = new CollectionDescriptor();
 | 
			
		||||
    cd.setCollection(new CollectionInfo().withName(name).withDocumentation(doc).withHref(URI.create(href)));
 | 
			
		||||
    cd.setCollection(collectionInfo);
 | 
			
		||||
    return new CollectionDetails(cd, cl.getCanonicalName(), order);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -253,58 +243,22 @@ public final class CollectionRegistry {
 | 
			
		||||
 | 
			
		||||
  /** Create a resource class based on dependencies declared in @Collection annotation */
 | 
			
		||||
  private static Object createResource(
 | 
			
		||||
      CollectionDAO daoObject,
 | 
			
		||||
      String resourceClass,
 | 
			
		||||
      OpenMetadataApplicationConfig config,
 | 
			
		||||
      Authorizer authorizer,
 | 
			
		||||
      SecretsManager secretsManager)
 | 
			
		||||
      CollectionDAO daoObject, String resourceClass, OpenMetadataApplicationConfig config, Authorizer authorizer)
 | 
			
		||||
      throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException,
 | 
			
		||||
          InstantiationException {
 | 
			
		||||
    Object resource = null;
 | 
			
		||||
    Object resource;
 | 
			
		||||
    Class<?> clz = Class.forName(resourceClass);
 | 
			
		||||
 | 
			
		||||
    // NOTE: Currently this will work fine for One Constructor scenario since per resource only one constructor is
 | 
			
		||||
    // present,
 | 
			
		||||
    // for multiple constructor we can use order as the priority to qualify amongst multiple constructors
 | 
			
		||||
    for (Constructor<?> constructor : clz.getConstructors()) {
 | 
			
		||||
      Collection c = constructor.getAnnotation(Collection.class);
 | 
			
		||||
      if (c != null) {
 | 
			
		||||
        switch (c.constructorType()) {
 | 
			
		||||
          case DAO_AUTH:
 | 
			
		||||
            resource =
 | 
			
		||||
                clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class).newInstance(daoObject, authorizer);
 | 
			
		||||
            break;
 | 
			
		||||
          case DAO_AUTH_SM:
 | 
			
		||||
            resource =
 | 
			
		||||
                clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class, SecretsManager.class)
 | 
			
		||||
                    .newInstance(daoObject, authorizer, secretsManager);
 | 
			
		||||
            break;
 | 
			
		||||
          case CONFIG:
 | 
			
		||||
            resource = clz.getDeclaredConstructor(OpenMetadataApplicationConfig.class).newInstance(config);
 | 
			
		||||
            break;
 | 
			
		||||
          case DAO_AUTH_CONFIG:
 | 
			
		||||
            resource =
 | 
			
		||||
                clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class, OpenMetadataApplicationConfig.class)
 | 
			
		||||
                    .newInstance(daoObject, authorizer, config);
 | 
			
		||||
            break;
 | 
			
		||||
          case DAO_AUTH_SM_CONFIG:
 | 
			
		||||
            resource =
 | 
			
		||||
                clz.getDeclaredConstructor(
 | 
			
		||||
                        CollectionDAO.class,
 | 
			
		||||
                        Authorizer.class,
 | 
			
		||||
                        SecretsManager.class,
 | 
			
		||||
                        OpenMetadataApplicationConfig.class)
 | 
			
		||||
                    .newInstance(daoObject, authorizer, secretsManager, config);
 | 
			
		||||
            break;
 | 
			
		||||
          default:
 | 
			
		||||
    // Create the resource identified by resourceClass
 | 
			
		||||
    try {
 | 
			
		||||
      resource = clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class).newInstance(daoObject, authorizer);
 | 
			
		||||
    } catch (NoSuchMethodException e) {
 | 
			
		||||
      try {
 | 
			
		||||
        resource = clz.getDeclaredConstructor().newInstance();
 | 
			
		||||
      } catch (NoSuchMethodException exc) {
 | 
			
		||||
        resource = Class.forName(resourceClass).getConstructor().newInstance();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (resource == null) {
 | 
			
		||||
      resource = Class.forName(resourceClass).getConstructor().newInstance();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Call initialize method, if it exists
 | 
			
		||||
    try {
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,7 @@ import javax.json.JsonPatch;
 | 
			
		||||
import javax.ws.rs.core.Response;
 | 
			
		||||
import javax.ws.rs.core.SecurityContext;
 | 
			
		||||
import javax.ws.rs.core.UriInfo;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.openmetadata.schema.CreateEntity;
 | 
			
		||||
import org.openmetadata.schema.EntityInterface;
 | 
			
		||||
@ -35,7 +36,7 @@ public abstract class EntityResource<T extends EntityInterface, K extends Entity
 | 
			
		||||
  protected final Class<T> entityClass;
 | 
			
		||||
  protected final String entityType;
 | 
			
		||||
  protected final List<String> allowedFields;
 | 
			
		||||
  protected final K dao;
 | 
			
		||||
  @Getter protected final K dao;
 | 
			
		||||
  protected final Authorizer authorizer;
 | 
			
		||||
 | 
			
		||||
  protected EntityResource(Class<T> entityClass, K repository, Authorizer authorizer) {
 | 
			
		||||
 | 
			
		||||
@ -60,6 +60,7 @@ import org.openmetadata.service.jdbi3.UserRepository;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.EntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil;
 | 
			
		||||
import org.openmetadata.service.util.ResultList;
 | 
			
		||||
@ -72,12 +73,8 @@ import org.openmetadata.service.util.ResultList;
 | 
			
		||||
public class BotResource extends EntityResource<Bot, BotRepository> {
 | 
			
		||||
  public static final String COLLECTION_PATH = "/v1/bots/";
 | 
			
		||||
 | 
			
		||||
  final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public BotResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(Bot.class, new BotRepository(dao, secretsManager), authorizer);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
  public BotResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Bot.class, new BotRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
@ -269,6 +266,7 @@ public class BotResource extends EntityResource<Bot, BotRepository> {
 | 
			
		||||
    Response response = createOrUpdate(uriInfo, securityContext, bot, false);
 | 
			
		||||
    // ensures the secrets' manager store the credentials even when the botUser does not change
 | 
			
		||||
    bot = (Bot) response.getEntity();
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (!BotType.BOT.equals(bot.getBotType())) {
 | 
			
		||||
      secretsManager.encryptOrDecryptBotCredentials(bot.getBotType().value(), bot.getBotUser().getName(), true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -76,7 +76,6 @@ public class ChartResource extends EntityResource<Chart, ChartRepository> {
 | 
			
		||||
    return chart;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public ChartResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Chart.class, new ChartRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ import io.swagger.v3.oas.annotations.Operation;
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Content;
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import javax.ws.rs.GET;
 | 
			
		||||
import javax.ws.rs.Path;
 | 
			
		||||
import javax.ws.rs.Produces;
 | 
			
		||||
@ -37,15 +38,17 @@ import org.openmetadata.service.security.jwt.JWTTokenGenerator;
 | 
			
		||||
@Produces(MediaType.APPLICATION_JSON)
 | 
			
		||||
@Collection(name = "config")
 | 
			
		||||
public class ConfigResource {
 | 
			
		||||
  private final OpenMetadataApplicationConfig openMetadataApplicationConfig;
 | 
			
		||||
  private OpenMetadataApplicationConfig openMetadataApplicationConfig;
 | 
			
		||||
  private final JWTTokenGenerator jwtTokenGenerator;
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.CONFIG)
 | 
			
		||||
  public ConfigResource(OpenMetadataApplicationConfig openMetadataApplicationConfig) {
 | 
			
		||||
    this.openMetadataApplicationConfig = openMetadataApplicationConfig;
 | 
			
		||||
  public ConfigResource() {
 | 
			
		||||
    this.jwtTokenGenerator = JWTTokenGenerator.getInstance();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void initialize(OpenMetadataApplicationConfig config) throws IOException {
 | 
			
		||||
    this.openMetadataApplicationConfig = config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @GET
 | 
			
		||||
  @Path(("/auth"))
 | 
			
		||||
  @Operation(
 | 
			
		||||
 | 
			
		||||
@ -75,7 +75,6 @@ public class DashboardResource extends EntityResource<Dashboard, DashboardReposi
 | 
			
		||||
    return dashboard;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public DashboardResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Dashboard.class, new DashboardRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -76,7 +76,6 @@ public class DatabaseResource extends EntityResource<Database, DatabaseRepositor
 | 
			
		||||
    return db;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public DatabaseResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Database.class, new DatabaseRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -75,7 +75,6 @@ public class DatabaseSchemaResource extends EntityResource<DatabaseSchema, Datab
 | 
			
		||||
    return schema;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public DatabaseSchemaResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(DatabaseSchema.class, new DatabaseSchemaRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,6 @@ public class TableResource extends EntityResource<Table, TableRepository> {
 | 
			
		||||
    return operations.toArray(new MetadataOperation[0]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TableResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Table.class, new TableRepository(dao), authorizer);
 | 
			
		||||
    allowedFields.add("tests");
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,6 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TestCaseResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(TestCase.class, new TestCaseRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,6 @@ public class TestDefinitionResource extends EntityResource<TestDefinition, TestD
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TestDefinitionResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(TestDefinition.class, new TestDefinitionRepository(dao), authorizer);
 | 
			
		||||
    this.daoTestDefinition = new TestDefinitionRepository(dao);
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,6 @@ public class TestSuiteResource extends EntityResource<TestSuite, TestSuiteReposi
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TestSuiteResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(TestSuite.class, new TestSuiteRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -60,7 +60,6 @@ import org.openmetadata.service.jdbi3.EntityRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.jdbi3.UserRepository;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.ElasticSearchClientUtils;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil;
 | 
			
		||||
@ -84,21 +83,22 @@ public class BuildSearchIndexResource {
 | 
			
		||||
  private final ExecutorService threadScheduler;
 | 
			
		||||
  private final UserRepository userRepository;
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM_CONFIG)
 | 
			
		||||
  public BuildSearchIndexResource(
 | 
			
		||||
      CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager, OpenMetadataApplicationConfig config) {
 | 
			
		||||
    if (config.getElasticSearchConfiguration() != null) {
 | 
			
		||||
      this.client = ElasticSearchClientUtils.createElasticSearchClient(config.getElasticSearchConfiguration());
 | 
			
		||||
      this.elasticSearchIndexDefinition = new ElasticSearchIndexDefinition(client, dao);
 | 
			
		||||
    }
 | 
			
		||||
  public BuildSearchIndexResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    this.dao = dao;
 | 
			
		||||
    this.userRepository = new UserRepository(dao, secretsManager);
 | 
			
		||||
    this.userRepository = new UserRepository(dao);
 | 
			
		||||
    this.authorizer = authorizer;
 | 
			
		||||
    this.threadScheduler =
 | 
			
		||||
        new ThreadPoolExecutor(
 | 
			
		||||
            2, 2, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(5), new ThreadPoolExecutor.CallerRunsPolicy());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void initialize(OpenMetadataApplicationConfig config) throws IOException {
 | 
			
		||||
    if (config.getElasticSearchConfiguration() != null) {
 | 
			
		||||
      this.client = ElasticSearchClientUtils.createElasticSearchClient(config.getElasticSearchConfiguration());
 | 
			
		||||
      this.elasticSearchIndexDefinition = new ElasticSearchIndexDefinition(client, dao);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private BulkProcessor getBulkProcessor(BulkProcessorListener listener, int bulkSize, int flushIntervalInSeconds) {
 | 
			
		||||
    BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer =
 | 
			
		||||
        (request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener);
 | 
			
		||||
 | 
			
		||||
@ -61,7 +61,6 @@ public class EventResource {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public EventResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    Objects.requireNonNull(dao, "ChangeEventRepository must not be null");
 | 
			
		||||
    this.dao = new ChangeEventRepository(dao);
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,6 @@ public class WebhookResource extends EntityResource<Webhook, WebhookRepository>
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public WebhookResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Webhook.class, new WebhookRepository(dao), authorizer);
 | 
			
		||||
    webhookDAO = dao.webhookDAO();
 | 
			
		||||
 | 
			
		||||
@ -100,7 +100,6 @@ public class FeedResource {
 | 
			
		||||
    return thread;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public FeedResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    Objects.requireNonNull(dao, "FeedRepository must not be null");
 | 
			
		||||
    this.dao = new FeedRepository(dao);
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,6 @@ public class GlossaryResource extends EntityResource<Glossary, GlossaryRepositor
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public GlossaryResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Glossary.class, new GlossaryRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -84,7 +84,6 @@ public class GlossaryTermResource extends EntityResource<GlossaryTerm, GlossaryT
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public GlossaryTermResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(GlossaryTerm.class, new GlossaryTermRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,6 @@ public class LineageResource {
 | 
			
		||||
  private final LineageRepository dao;
 | 
			
		||||
  private final Authorizer authorizer;
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public LineageResource(@NonNull CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    this.dao = new LineageRepository(dao);
 | 
			
		||||
    this.authorizer = authorizer;
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,6 @@ public class LocationResource extends EntityResource<Location, LocationRepositor
 | 
			
		||||
    return location;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public LocationResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Location.class, new LocationRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,6 @@ import org.openmetadata.service.util.ResultList;
 | 
			
		||||
public class MetricsResource extends EntityResource<Metrics, MetricsRepository> {
 | 
			
		||||
  public static final String COLLECTION_PATH = "/v1/metrics/";
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public MetricsResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Metrics.class, new MetricsRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,6 @@ public class MlModelResource extends EntityResource<MlModel, MlModelRepository>
 | 
			
		||||
    return mlmodel;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public MlModelResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(MlModel.class, new MlModelRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,6 @@ public class PermissionsResource {
 | 
			
		||||
  private final Authorizer authorizer;
 | 
			
		||||
 | 
			
		||||
  @SuppressWarnings("unused")
 | 
			
		||||
  @Collection
 | 
			
		||||
  public PermissionsResource(CollectionDAO dao, @NonNull Authorizer authorizer) {
 | 
			
		||||
    this.authorizer = authorizer;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -80,7 +80,6 @@ public class PipelineResource extends EntityResource<Pipeline, PipelineRepositor
 | 
			
		||||
    return pipeline;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public PipelineResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Pipeline.class, new PipelineRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -91,7 +91,6 @@ public class PolicyResource extends EntityResource<Policy, PolicyRepository> {
 | 
			
		||||
    return policy;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public PolicyResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Policy.class, new PolicyRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,6 @@ import org.openmetadata.service.util.ResultList;
 | 
			
		||||
public class ReportResource extends EntityResource<Report, ReportRepository> {
 | 
			
		||||
  public static final String COLLECTION_PATH = "/v1/bots/";
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public ReportResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Report.class, new ReportRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -73,8 +73,9 @@ public class SearchResource {
 | 
			
		||||
  private static final String DESCRIPTION = "description";
 | 
			
		||||
  private static final String UNIFIED = "unified";
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.CONFIG)
 | 
			
		||||
  public SearchResource(OpenMetadataApplicationConfig config) {
 | 
			
		||||
  public SearchResource() {}
 | 
			
		||||
 | 
			
		||||
  public void initialize(OpenMetadataApplicationConfig config) throws IOException {
 | 
			
		||||
    if (config.getElasticSearchConfiguration() != null) {
 | 
			
		||||
      this.client = ElasticSearchClientUtils.createElasticSearchClient(config.getElasticSearchConfiguration());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ import org.openmetadata.service.exception.UnhandledServerException;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
 | 
			
		||||
import org.openmetadata.service.resources.EntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.AuthorizationException;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
@ -37,25 +38,19 @@ public abstract class ServiceEntityResource<
 | 
			
		||||
        S extends ServiceConnectionEntityInterface>
 | 
			
		||||
    extends EntityResource<T, R> {
 | 
			
		||||
 | 
			
		||||
  private final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  @Getter private final ServiceEntityRepository<T, S> serviceEntityRepository;
 | 
			
		||||
 | 
			
		||||
  private final ServiceType serviceType;
 | 
			
		||||
 | 
			
		||||
  protected ServiceEntityResource(
 | 
			
		||||
      Class<T> entityClass,
 | 
			
		||||
      R serviceRepository,
 | 
			
		||||
      Authorizer authorizer,
 | 
			
		||||
      SecretsManager secretsManager,
 | 
			
		||||
      ServiceType serviceType) {
 | 
			
		||||
      Class<T> entityClass, R serviceRepository, Authorizer authorizer, ServiceType serviceType) {
 | 
			
		||||
    super(entityClass, serviceRepository, authorizer);
 | 
			
		||||
    this.serviceEntityRepository = serviceRepository;
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
    this.serviceType = serviceType;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected T decryptOrNullify(SecurityContext securityContext, T service) {
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    try {
 | 
			
		||||
      authorizer.authorizeAdmin(securityContext, secretsManager.isLocal());
 | 
			
		||||
    } catch (AuthorizationException e) {
 | 
			
		||||
@ -66,6 +61,7 @@ public abstract class ServiceEntityResource<
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Object retrieveServiceConnectionConfig(T service) {
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    return secretsManager.encryptOrDecryptServiceConnectionConfig(
 | 
			
		||||
        service.getConnection().getConfig(), extractServiceType(service), service.getName(), serviceType, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,6 @@ import org.openmetadata.service.jdbi3.DashboardServiceRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.services.ServiceEntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
import org.openmetadata.service.util.RestUtil;
 | 
			
		||||
@ -78,14 +77,9 @@ public class DashboardServiceResource
 | 
			
		||||
    return service;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public DashboardServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(
 | 
			
		||||
        DashboardService.class,
 | 
			
		||||
        new DashboardServiceRepository(dao, secretsManager),
 | 
			
		||||
        authorizer,
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        ServiceType.DASHBOARD);
 | 
			
		||||
  public DashboardServiceResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
 | 
			
		||||
    super(DashboardService.class, new DashboardServiceRepository(dao), authorizer, ServiceType.DASHBOARD);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class DashboardServiceList extends ResultList<DashboardService> {
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,6 @@ import org.openmetadata.service.jdbi3.DatabaseServiceRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.services.ServiceEntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
@ -80,14 +79,8 @@ public class DatabaseServiceResource
 | 
			
		||||
    return service;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public DatabaseServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(
 | 
			
		||||
        DatabaseService.class,
 | 
			
		||||
        new DatabaseServiceRepository(dao, secretsManager),
 | 
			
		||||
        authorizer,
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        ServiceType.DATABASE);
 | 
			
		||||
  public DatabaseServiceResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(DatabaseService.class, new DatabaseServiceRepository(dao), authorizer, ServiceType.DATABASE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class DatabaseServiceList extends ResultList<DatabaseService> {
 | 
			
		||||
 | 
			
		||||
@ -51,7 +51,6 @@ import javax.ws.rs.core.MediaType;
 | 
			
		||||
import javax.ws.rs.core.Response;
 | 
			
		||||
import javax.ws.rs.core.SecurityContext;
 | 
			
		||||
import javax.ws.rs.core.UriInfo;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.openmetadata.schema.api.services.ingestionPipelines.CreateIngestionPipeline;
 | 
			
		||||
import org.openmetadata.schema.api.services.ingestionPipelines.TestServiceConnection;
 | 
			
		||||
@ -69,6 +68,7 @@ import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.EntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.AuthorizationException;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.security.policyevaluator.OperationContext;
 | 
			
		||||
@ -87,9 +87,6 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
 | 
			
		||||
  public static final String COLLECTION_PATH = "v1/services/ingestionPipelines/";
 | 
			
		||||
  private PipelineServiceClient pipelineServiceClient;
 | 
			
		||||
  private OpenMetadataApplicationConfig openMetadataApplicationConfig;
 | 
			
		||||
  private final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  @Getter private final IngestionPipelineRepository ingestionPipelineRepository;
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public IngestionPipeline addHref(UriInfo uriInfo, IngestionPipeline ingestionPipeline) {
 | 
			
		||||
@ -98,11 +95,8 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
 | 
			
		||||
    return ingestionPipeline;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public IngestionPipelineResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(IngestionPipeline.class, new IngestionPipelineRepository(dao, secretsManager), authorizer);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
    this.ingestionPipelineRepository = new IngestionPipelineRepository(dao, secretsManager);
 | 
			
		||||
  public IngestionPipelineResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(IngestionPipeline.class, new IngestionPipelineRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void initialize(OpenMetadataApplicationConfig config) {
 | 
			
		||||
@ -404,7 +398,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
 | 
			
		||||
    Fields fields = getFields(FIELD_OWNER);
 | 
			
		||||
    IngestionPipeline ingestionPipeline = dao.get(uriInfo, id, fields);
 | 
			
		||||
    ingestionPipeline.setOpenMetadataServerConnection(
 | 
			
		||||
        new OpenMetadataServerConnectionBuilder(secretsManager, openMetadataApplicationConfig).build());
 | 
			
		||||
        new OpenMetadataServerConnectionBuilder(openMetadataApplicationConfig).build());
 | 
			
		||||
    pipelineServiceClient.deployPipeline(ingestionPipeline);
 | 
			
		||||
    decryptOrNullify(securityContext, ingestionPipeline);
 | 
			
		||||
    return addHref(uriInfo, ingestionPipeline);
 | 
			
		||||
@ -498,6 +492,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
 | 
			
		||||
      @Context UriInfo uriInfo,
 | 
			
		||||
      @Context SecurityContext securityContext,
 | 
			
		||||
      @Valid TestServiceConnection testServiceConnection) {
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    testServiceConnection =
 | 
			
		||||
        testServiceConnection
 | 
			
		||||
            .withConnection(secretsManager.storeTestConnectionObject(testServiceConnection))
 | 
			
		||||
@ -590,7 +585,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
 | 
			
		||||
 | 
			
		||||
  private IngestionPipeline getIngestionPipeline(CreateIngestionPipeline create, String user) throws IOException {
 | 
			
		||||
    OpenMetadataServerConnection openMetadataServerConnection =
 | 
			
		||||
        new OpenMetadataServerConnectionBuilder(secretsManager, openMetadataApplicationConfig).build();
 | 
			
		||||
        new OpenMetadataServerConnectionBuilder(openMetadataApplicationConfig).build();
 | 
			
		||||
    return copy(new IngestionPipeline(), create, user)
 | 
			
		||||
        .withPipelineType(create.getPipelineType())
 | 
			
		||||
        .withAirflowConfig(create.getAirflowConfig())
 | 
			
		||||
@ -614,6 +609,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private IngestionPipeline decryptOrNullify(SecurityContext securityContext, IngestionPipeline ingestionPipeline) {
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    try {
 | 
			
		||||
      authorizer.authorize(
 | 
			
		||||
          securityContext,
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,6 @@ import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.jdbi3.MessagingServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.services.ServiceEntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
import org.openmetadata.service.util.RestUtil;
 | 
			
		||||
@ -79,14 +78,8 @@ public class MessagingServiceResource
 | 
			
		||||
    return service;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public MessagingServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(
 | 
			
		||||
        MessagingService.class,
 | 
			
		||||
        new MessagingServiceRepository(dao, secretsManager),
 | 
			
		||||
        authorizer,
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        ServiceType.MESSAGING);
 | 
			
		||||
  public MessagingServiceResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(MessagingService.class, new MessagingServiceRepository(dao), authorizer, ServiceType.MESSAGING);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class MessagingServiceList extends ResultList<MessagingService> {
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,6 @@ import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.jdbi3.MlModelServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.services.ServiceEntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
import org.openmetadata.service.util.RestUtil;
 | 
			
		||||
@ -78,14 +77,8 @@ public class MlModelServiceResource
 | 
			
		||||
    return service;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public MlModelServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(
 | 
			
		||||
        MlModelService.class,
 | 
			
		||||
        new MlModelServiceRepository(dao, secretsManager),
 | 
			
		||||
        authorizer,
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        ServiceType.ML_MODEL);
 | 
			
		||||
  public MlModelServiceResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(MlModelService.class, new MlModelServiceRepository(dao), authorizer, ServiceType.ML_MODEL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class MlModelServiceList extends ResultList<MlModelService> {
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,6 @@ import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.jdbi3.PipelineServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.services.ServiceEntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.JsonUtils;
 | 
			
		||||
import org.openmetadata.service.util.RestUtil;
 | 
			
		||||
@ -77,14 +76,8 @@ public class PipelineServiceResource
 | 
			
		||||
    return service;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
 | 
			
		||||
  public PipelineServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    super(
 | 
			
		||||
        PipelineService.class,
 | 
			
		||||
        new PipelineServiceRepository(dao, secretsManager),
 | 
			
		||||
        authorizer,
 | 
			
		||||
        secretsManager,
 | 
			
		||||
        ServiceType.PIPELINE);
 | 
			
		||||
  public PipelineServiceResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(PipelineService.class, new PipelineServiceRepository(dao), authorizer, ServiceType.PIPELINE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class PipelineServiceList extends ResultList<PipelineService> {
 | 
			
		||||
 | 
			
		||||
@ -73,7 +73,6 @@ public class StorageServiceResource extends EntityResource<StorageService, Stora
 | 
			
		||||
    return service;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public StorageServiceResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(StorageService.class, new StorageServiceRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -120,7 +120,6 @@ public class SettingsResource {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public SettingsResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    Objects.requireNonNull(dao, "SettingsRepository must not be null");
 | 
			
		||||
    this.settingsRepository = new SettingsRepository(dao);
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,6 @@ public class TagResource {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TagResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    Objects.requireNonNull(collectionDAO, "TagRepository must not be null");
 | 
			
		||||
    this.dao = new TagRepository(collectionDAO);
 | 
			
		||||
@ -94,7 +93,7 @@ public class TagResource {
 | 
			
		||||
    this.authorizer = authorizer;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @SuppressWarnings("unused") // Method used for reflection
 | 
			
		||||
  @SuppressWarnings("unused") // Method used by reflection
 | 
			
		||||
  public void initialize(OpenMetadataApplicationConfig config) throws IOException {
 | 
			
		||||
    // Find tag definitions and load tag categories from the json file, if necessary
 | 
			
		||||
    List<String> tagFiles = EntityUtil.getJsonDataResources(".*json/data/tags/.*\\.json$");
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,6 @@ public class RoleResource extends EntityResource<Role, RoleRepository> {
 | 
			
		||||
    return role;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public RoleResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    super(Role.class, new RoleRepository(collectionDAO), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -87,7 +87,6 @@ public class TeamResource extends EntityResource<Team, TeamRepository> {
 | 
			
		||||
    return team;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TeamResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Team.class, new TeamRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,6 @@ import java.io.IOException;
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.time.ZoneId;
 | 
			
		||||
import java.time.temporal.ChronoUnit;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
@ -77,7 +76,6 @@ import javax.ws.rs.core.MediaType;
 | 
			
		||||
import javax.ws.rs.core.Response;
 | 
			
		||||
import javax.ws.rs.core.SecurityContext;
 | 
			
		||||
import javax.ws.rs.core.UriInfo;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
@ -120,6 +118,7 @@ import org.openmetadata.service.jdbi3.UserRepository;
 | 
			
		||||
import org.openmetadata.service.resources.Collection;
 | 
			
		||||
import org.openmetadata.service.resources.EntityResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.AuthorizationException;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.security.auth.LoginAttemptCache;
 | 
			
		||||
@ -147,14 +146,12 @@ public class UserResource extends EntityResource<User, UserRepository> {
 | 
			
		||||
  public static final String USER_PROTECTED_FIELDS = "authenticationMechanism";
 | 
			
		||||
  private final JWTTokenGenerator jwtTokenGenerator;
 | 
			
		||||
  private final TokenRepository tokenRepository;
 | 
			
		||||
  @Getter private final UserRepository userRepository;
 | 
			
		||||
  private final SecretsManager secretsManager;
 | 
			
		||||
  private final boolean isEmailServiceEnabled;
 | 
			
		||||
  private final LoginAttemptCache loginAttemptCache;
 | 
			
		||||
  private boolean isEmailServiceEnabled;
 | 
			
		||||
  private LoginAttemptCache loginAttemptCache;
 | 
			
		||||
 | 
			
		||||
  private final AuthenticationConfiguration authenticationConfiguration;
 | 
			
		||||
  private AuthenticationConfiguration authenticationConfiguration;
 | 
			
		||||
 | 
			
		||||
  private final AuthorizerConfiguration authorizerConfiguration;
 | 
			
		||||
  private AuthorizerConfiguration authorizerConfiguration;
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public User addHref(UriInfo uriInfo, User user) {
 | 
			
		||||
@ -166,15 +163,14 @@ public class UserResource extends EntityResource<User, UserRepository> {
 | 
			
		||||
    return user;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM_CONFIG)
 | 
			
		||||
  public UserResource(
 | 
			
		||||
      CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager, OpenMetadataApplicationConfig config) {
 | 
			
		||||
    super(User.class, new UserRepository(dao, secretsManager), authorizer);
 | 
			
		||||
  public UserResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(User.class, new UserRepository(dao), authorizer);
 | 
			
		||||
    jwtTokenGenerator = JWTTokenGenerator.getInstance();
 | 
			
		||||
    allowedFields.remove(USER_PROTECTED_FIELDS);
 | 
			
		||||
    tokenRepository = new TokenRepository(dao);
 | 
			
		||||
    userRepository = new UserRepository(dao, secretsManager);
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void initialize(OpenMetadataApplicationConfig config) throws IOException {
 | 
			
		||||
    this.authenticationConfiguration = config.getAuthenticationConfiguration();
 | 
			
		||||
    this.authorizerConfiguration = config.getAuthorizerConfiguration();
 | 
			
		||||
    SmtpSettings smtpSettings = config.getSmtpSettings();
 | 
			
		||||
@ -1220,8 +1216,7 @@ public class UserResource extends EntityResource<User, UserRepository> {
 | 
			
		||||
    if (emailVerificationToken == null) {
 | 
			
		||||
      throw new EntityNotFoundException("Invalid Token. Please issue a new Request");
 | 
			
		||||
    }
 | 
			
		||||
    User registeredUser =
 | 
			
		||||
        dao.get(uriInfo, emailVerificationToken.getUserId(), userRepository.getFieldsWithUserAuth("*"));
 | 
			
		||||
    User registeredUser = dao.get(uriInfo, emailVerificationToken.getUserId(), dao.getFieldsWithUserAuth("*"));
 | 
			
		||||
    if (Boolean.TRUE.equals(registeredUser.getIsEmailVerified())) {
 | 
			
		||||
      LOG.info("User [{}] already registered.", emailToken);
 | 
			
		||||
      return;
 | 
			
		||||
@ -1243,22 +1238,6 @@ public class UserResource extends EntityResource<User, UserRepository> {
 | 
			
		||||
    tokenRepository.deleteTokenByUserAndType(registeredUser.getId().toString(), EMAIL_VERIFICATION.toString());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public User extendRegistrationToken(UriInfo uriInfo, String existingToken) throws IOException {
 | 
			
		||||
    EmailVerificationToken emailVerificationToken = (EmailVerificationToken) tokenRepository.findByToken(existingToken);
 | 
			
		||||
    User registeredUser = dao.get(uriInfo, emailVerificationToken.getUserId(), getFields("isEmailVerified"));
 | 
			
		||||
    if (Boolean.TRUE.equals(registeredUser.getIsEmailVerified())) {
 | 
			
		||||
      // no need to do anything
 | 
			
		||||
      return registeredUser;
 | 
			
		||||
    }
 | 
			
		||||
    // Update token with new Expiry and Status
 | 
			
		||||
    emailVerificationToken.setTokenStatus(EmailVerificationToken.TokenStatus.STATUS_PENDING);
 | 
			
		||||
    emailVerificationToken.setExpiryDate(Instant.now().plus(24, ChronoUnit.HOURS).toEpochMilli());
 | 
			
		||||
 | 
			
		||||
    // Update the token details in Database
 | 
			
		||||
    tokenRepository.updateToken(emailVerificationToken);
 | 
			
		||||
    return registeredUser;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void sendEmailVerification(UriInfo uriInfo, User user) throws IOException, TemplateException {
 | 
			
		||||
    UUID mailVerificationToken = UUID.randomUUID();
 | 
			
		||||
    EmailVerificationToken emailVerificationToken =
 | 
			
		||||
@ -1500,6 +1479,7 @@ public class UserResource extends EntityResource<User, UserRepository> {
 | 
			
		||||
    if (isValidAuthenticationMechanism(create)) {
 | 
			
		||||
      AuthenticationMechanism authMechanism = create.getAuthenticationMechanism();
 | 
			
		||||
      AuthenticationMechanism.AuthType authType = authMechanism.getAuthType();
 | 
			
		||||
      SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
      switch (authType) {
 | 
			
		||||
        case JWT:
 | 
			
		||||
          User original = retrieveBotUser(user, uriInfo);
 | 
			
		||||
@ -1578,6 +1558,7 @@ public class UserResource extends EntityResource<User, UserRepository> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private User decryptOrNullify(SecurityContext securityContext, User user) {
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (Boolean.TRUE.equals(user.getIsBot()) && user.getAuthenticationMechanism() != null) {
 | 
			
		||||
      try {
 | 
			
		||||
        authorizer.authorize(
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,6 @@ public class TopicResource extends EntityResource<Topic, TopicRepository> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TopicResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Topic.class, new TopicRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,6 @@ public class TypeResource extends EntityResource<Type, TypeRepository> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public TypeResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    super(Type.class, new TypeRepository(dao), authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,6 @@ public class UsageResource {
 | 
			
		||||
  private final UsageRepository dao;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  @Collection
 | 
			
		||||
  public UsageResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    Objects.requireNonNull(dao, "UsageRepository must not be null");
 | 
			
		||||
    this.dao = new UsageRepository(dao);
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,6 @@ public class UtilResource {
 | 
			
		||||
  private final UtilRepository utilRepository;
 | 
			
		||||
  private final Authorizer authorizer;
 | 
			
		||||
 | 
			
		||||
  @Collection
 | 
			
		||||
  public UtilResource(CollectionDAO dao, Authorizer authorizer) {
 | 
			
		||||
    Objects.requireNonNull(dao, "UtilRepository must not be null");
 | 
			
		||||
    this.utilRepository = new UtilRepository(dao.utilDAO());
 | 
			
		||||
 | 
			
		||||
@ -24,11 +24,10 @@ public class InMemorySecretsManager extends ThirdPartySecretsManager {
 | 
			
		||||
 | 
			
		||||
  private static InMemorySecretsManager INSTANCE;
 | 
			
		||||
 | 
			
		||||
  @Getter private final Map<String, String> secretsMap;
 | 
			
		||||
  @Getter private final Map<String, String> secretsMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
  protected InMemorySecretsManager(SecretsManagerProvider secretsManagerProvider, String clusterPrefix) {
 | 
			
		||||
    super(secretsManagerProvider, clusterPrefix);
 | 
			
		||||
    secretsMap = new HashMap<>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static InMemorySecretsManager getInstance(String clusterPrefix) {
 | 
			
		||||
 | 
			
		||||
@ -13,28 +13,45 @@
 | 
			
		||||
 | 
			
		||||
package org.openmetadata.service.secrets;
 | 
			
		||||
 | 
			
		||||
import com.google.common.annotations.VisibleForTesting;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import org.openmetadata.schema.services.connections.metadata.SecretsManagerProvider;
 | 
			
		||||
 | 
			
		||||
public class SecretsManagerFactory {
 | 
			
		||||
  @Getter private static SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  private SecretsManagerFactory() {}
 | 
			
		||||
 | 
			
		||||
  /** Expected to be called only once when the Application starts */
 | 
			
		||||
  public static SecretsManager createSecretsManager(SecretsManagerConfiguration config, String clusterName) {
 | 
			
		||||
    SecretsManagerProvider secretManager =
 | 
			
		||||
    if (secretsManager != null) {
 | 
			
		||||
      return secretsManager;
 | 
			
		||||
    }
 | 
			
		||||
    SecretsManagerProvider secretsManagerProvider =
 | 
			
		||||
        config != null && config.getSecretsManager() != null
 | 
			
		||||
            ? config.getSecretsManager()
 | 
			
		||||
            : SecretsManagerConfiguration.DEFAULT_SECRET_MANAGER;
 | 
			
		||||
    switch (secretManager) {
 | 
			
		||||
    switch (secretsManagerProvider) {
 | 
			
		||||
      case NOOP:
 | 
			
		||||
        return NoopSecretsManager.getInstance(clusterName);
 | 
			
		||||
        secretsManager = NoopSecretsManager.getInstance(clusterName);
 | 
			
		||||
        break;
 | 
			
		||||
      case AWS:
 | 
			
		||||
        return AWSSecretsManager.getInstance(config, clusterName);
 | 
			
		||||
        secretsManager = AWSSecretsManager.getInstance(config, clusterName);
 | 
			
		||||
        break;
 | 
			
		||||
      case AWS_SSM:
 | 
			
		||||
        return AWSSSMSecretsManager.getInstance(config, clusterName);
 | 
			
		||||
        secretsManager = AWSSSMSecretsManager.getInstance(config, clusterName);
 | 
			
		||||
        break;
 | 
			
		||||
      case IN_MEMORY:
 | 
			
		||||
        return InMemorySecretsManager.getInstance(clusterName);
 | 
			
		||||
        secretsManager = InMemorySecretsManager.getInstance(clusterName);
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        throw new IllegalArgumentException("Not implemented secret manager store: " + secretManager);
 | 
			
		||||
    }
 | 
			
		||||
        throw new IllegalArgumentException("Not implemented secret manager store: " + secretsManagerProvider);
 | 
			
		||||
    }
 | 
			
		||||
    return secretsManager;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @VisibleForTesting
 | 
			
		||||
  public static void setSecretsManager(SecretsManager secretsManager) {
 | 
			
		||||
    SecretsManagerFactory.secretsManager = secretsManager;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -30,15 +30,13 @@ import org.openmetadata.schema.entity.teams.User;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.exception.SecretsManagerMigrationException;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ChangeEventRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.IngestionPipelineRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.EntityRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ListFilter;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.UserRepository;
 | 
			
		||||
import org.openmetadata.service.resources.CollectionRegistry;
 | 
			
		||||
import org.openmetadata.service.resources.CollectionRegistry.CollectionDetails;
 | 
			
		||||
import org.openmetadata.service.resources.events.EventResource;
 | 
			
		||||
import org.openmetadata.service.resources.services.ServiceEntityResource;
 | 
			
		||||
import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResource;
 | 
			
		||||
import org.openmetadata.service.resources.teams.UserResource;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -64,16 +62,16 @@ public class SecretsManagerMigrationService {
 | 
			
		||||
 | 
			
		||||
  private final ChangeEventRepository changeEventRepository;
 | 
			
		||||
 | 
			
		||||
  private final IngestionPipelineRepository ingestionPipelineRepository;
 | 
			
		||||
  private final EntityRepository<IngestionPipeline> ingestionPipelineRepository;
 | 
			
		||||
 | 
			
		||||
  private final UserRepository userRepository;
 | 
			
		||||
  private final EntityRepository<User> userRepository;
 | 
			
		||||
 | 
			
		||||
  public SecretsManagerMigrationService(SecretsManager secretsManager, String clusterName) {
 | 
			
		||||
    this.newSecretManager = secretsManager;
 | 
			
		||||
    this.connectionTypeRepositoriesMap = retrieveConnectionTypeRepositoriesMap();
 | 
			
		||||
    this.changeEventRepository = retrieveChangeEventRepository();
 | 
			
		||||
    this.ingestionPipelineRepository = retrieveIngestionPipelineRepository();
 | 
			
		||||
    this.userRepository = retrieveUserRepository();
 | 
			
		||||
    this.ingestionPipelineRepository = Entity.getEntityRepository(Entity.INGESTION_PIPELINE);
 | 
			
		||||
    this.userRepository = Entity.getEntityRepository(Entity.USER);
 | 
			
		||||
    // by default, it is going to be LOCAL
 | 
			
		||||
    this.oldSecretManager = SecretsManagerFactory.createSecretsManager(null, clusterName);
 | 
			
		||||
  }
 | 
			
		||||
@ -332,27 +330,7 @@ public class SecretsManagerMigrationService {
 | 
			
		||||
        .orElseThrow(() -> new SecretsManagerMigrationException("Unexpected error: ChangeEventRepository not found."));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private UserRepository retrieveUserRepository() {
 | 
			
		||||
    return CollectionRegistry.getInstance().getCollectionMap().values().stream()
 | 
			
		||||
        .map(collectionDetails -> retrieveResource(collectionDetails, UserResource.class))
 | 
			
		||||
        .filter(Optional::isPresent)
 | 
			
		||||
        .map(res -> res.get().getUserRepository())
 | 
			
		||||
        .findFirst()
 | 
			
		||||
        .orElseThrow(
 | 
			
		||||
            () -> new SecretsManagerMigrationException("Unexpected error: IngestionPipelineRepository not found."));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private IngestionPipelineRepository retrieveIngestionPipelineRepository() {
 | 
			
		||||
    return CollectionRegistry.getInstance().getCollectionMap().values().stream()
 | 
			
		||||
        .map(collectionDetails -> retrieveResource(collectionDetails, IngestionPipelineResource.class))
 | 
			
		||||
        .filter(Optional::isPresent)
 | 
			
		||||
        .map(res -> res.get().getIngestionPipelineRepository())
 | 
			
		||||
        .findFirst()
 | 
			
		||||
        .orElseThrow(
 | 
			
		||||
            () -> new SecretsManagerMigrationException("Unexpected error: IngestionPipelineRepository not found."));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private <T> Optional<T> retrieveResource(CollectionRegistry.CollectionDetails collectionDetails, Class<T> clazz) {
 | 
			
		||||
  private <T> Optional<T> retrieveResource(CollectionDetails collectionDetails, Class<T> clazz) {
 | 
			
		||||
    Class<?> collectionDetailsClass = extractCollectionDetailsClass(collectionDetails);
 | 
			
		||||
    if (clazz.equals(collectionDetailsClass)) {
 | 
			
		||||
      return Optional.of(clazz.cast(collectionDetails.getResource()));
 | 
			
		||||
@ -360,8 +338,7 @@ public class SecretsManagerMigrationService {
 | 
			
		||||
    return Optional.empty();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Optional<ServiceEntityRepository<?, ?>> retrieveServiceRepository(
 | 
			
		||||
      CollectionRegistry.CollectionDetails collectionDetails) {
 | 
			
		||||
  private Optional<ServiceEntityRepository<?, ?>> retrieveServiceRepository(CollectionDetails collectionDetails) {
 | 
			
		||||
    Class<?> collectionDetailsClass = extractCollectionDetailsClass(collectionDetails);
 | 
			
		||||
    if (ServiceEntityResource.class.isAssignableFrom(collectionDetailsClass)) {
 | 
			
		||||
      return Optional.of(
 | 
			
		||||
@ -370,7 +347,7 @@ public class SecretsManagerMigrationService {
 | 
			
		||||
    return Optional.empty();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Class<?> extractCollectionDetailsClass(CollectionRegistry.CollectionDetails collectionDetails) {
 | 
			
		||||
  private Class<?> extractCollectionDetailsClass(CollectionDetails collectionDetails) {
 | 
			
		||||
    Class<?> collectionDetailsClass;
 | 
			
		||||
    try {
 | 
			
		||||
      collectionDetailsClass = Class.forName(collectionDetails.getResourceClass());
 | 
			
		||||
 | 
			
		||||
@ -82,7 +82,6 @@ public class DefaultAuthorizer implements Authorizer {
 | 
			
		||||
  private Set<String> botPrincipalUsers;
 | 
			
		||||
  private Set<String> testUsers;
 | 
			
		||||
  private String principalDomain;
 | 
			
		||||
  private SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  private String providerType;
 | 
			
		||||
 | 
			
		||||
@ -95,10 +94,6 @@ public class DefaultAuthorizer implements Authorizer {
 | 
			
		||||
        new HashSet<>(openMetadataApplicationConfig.getAuthorizerConfiguration().getBotPrincipals());
 | 
			
		||||
    this.testUsers = new HashSet<>(openMetadataApplicationConfig.getAuthorizerConfiguration().getTestPrincipals());
 | 
			
		||||
    this.principalDomain = openMetadataApplicationConfig.getAuthorizerConfiguration().getPrincipalDomain();
 | 
			
		||||
    this.secretsManager =
 | 
			
		||||
        SecretsManagerFactory.createSecretsManager(
 | 
			
		||||
            openMetadataApplicationConfig.getSecretsManagerConfiguration(),
 | 
			
		||||
            openMetadataApplicationConfig.getClusterName());
 | 
			
		||||
    this.providerType = openMetadataApplicationConfig.getAuthenticationConfiguration().getProvider();
 | 
			
		||||
    SubjectCache.initialize();
 | 
			
		||||
    PolicyCache.initialize();
 | 
			
		||||
@ -413,6 +408,7 @@ public class DefaultAuthorizer implements Authorizer {
 | 
			
		||||
      User originalUser =
 | 
			
		||||
          userRepository.getByName(null, user.getName(), new EntityUtil.Fields(List.of("authenticationMechanism")));
 | 
			
		||||
      AuthenticationMechanism authMechanism = originalUser.getAuthenticationMechanism();
 | 
			
		||||
      SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
      if (authMechanism != null) {
 | 
			
		||||
        Object config =
 | 
			
		||||
            secretsManager.encryptOrDecryptBotUserCredentials(user.getName(), authMechanism.getConfig(), false);
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ import org.openmetadata.service.exception.EntityNotFoundException;
 | 
			
		||||
import org.openmetadata.service.jdbi3.BotRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.UserRepository;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.util.EntityUtil.Fields;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@ -35,11 +36,8 @@ public class OpenMetadataServerConnectionBuilder {
 | 
			
		||||
  private final Object airflowSSLConfig;
 | 
			
		||||
  BotRepository botRepository;
 | 
			
		||||
  UserRepository userRepository;
 | 
			
		||||
  private final SecretsManager secretsManager;
 | 
			
		||||
 | 
			
		||||
  public OpenMetadataServerConnectionBuilder(
 | 
			
		||||
      SecretsManager secretsManager, OpenMetadataApplicationConfig openMetadataApplicationConfig) {
 | 
			
		||||
    this.secretsManager = secretsManager;
 | 
			
		||||
  public OpenMetadataServerConnectionBuilder(OpenMetadataApplicationConfig openMetadataApplicationConfig) {
 | 
			
		||||
    // TODO: https://github.com/open-metadata/OpenMetadata/issues/7712
 | 
			
		||||
    authProvider =
 | 
			
		||||
        "basic".equals(openMetadataApplicationConfig.getAuthenticationConfiguration().getProvider())
 | 
			
		||||
@ -47,6 +45,7 @@ public class OpenMetadataServerConnectionBuilder {
 | 
			
		||||
            : OpenMetadataServerConnection.AuthProvider.fromValue(
 | 
			
		||||
                openMetadataApplicationConfig.getAuthenticationConfiguration().getProvider());
 | 
			
		||||
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    if (!OpenMetadataServerConnection.AuthProvider.NO_AUTH.equals(authProvider)) {
 | 
			
		||||
      botRepository = BotRepository.class.cast(Entity.getEntityRepository(Entity.BOT));
 | 
			
		||||
      userRepository = UserRepository.class.cast(Entity.getEntityRepository(Entity.USER));
 | 
			
		||||
@ -118,6 +117,7 @@ public class OpenMetadataServerConnectionBuilder {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private User retrieveIngestionBotUser(String botName) {
 | 
			
		||||
    SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
 | 
			
		||||
    try {
 | 
			
		||||
      Bot bot1 = botRepository.getByName(null, botName, Fields.EMPTY_FIELDS);
 | 
			
		||||
      if (bot1.getBotUser() == null) {
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,6 @@ import org.openmetadata.service.fernet.Fernet;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.UserRepository;
 | 
			
		||||
import org.openmetadata.service.jdbi3.locator.ConnectionAwareAnnotationSqlLocator;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.jwt.JWTTokenGenerator;
 | 
			
		||||
 | 
			
		||||
@ -246,6 +245,10 @@ public final class TablesInitializer {
 | 
			
		||||
    jdbi.getConfig(SqlObjects.class)
 | 
			
		||||
        .setSqlLocator(new ConnectionAwareAnnotationSqlLocator(config.getDataSourceFactory().getDriverClass()));
 | 
			
		||||
    ElasticSearchIndexDefinition esIndexDefinition;
 | 
			
		||||
 | 
			
		||||
    // Initialize secrets manager
 | 
			
		||||
    SecretsManagerFactory.createSecretsManager(config.getSecretsManagerConfiguration(), config.getClusterName());
 | 
			
		||||
 | 
			
		||||
    switch (schemaMigrationOption) {
 | 
			
		||||
      case CREATE:
 | 
			
		||||
        try (Connection connection = flyway.getConfiguration().getDataSource().getConnection()) {
 | 
			
		||||
@ -356,7 +359,7 @@ public final class TablesInitializer {
 | 
			
		||||
      user.setAuthenticationMechanism(authenticationMechanism);
 | 
			
		||||
    }
 | 
			
		||||
    try {
 | 
			
		||||
      addOrUpdateUser(user, jdbi, config);
 | 
			
		||||
      addOrUpdateUser(user, jdbi);
 | 
			
		||||
      if (jwtAuthMechanism != null) {
 | 
			
		||||
        printToConsoleMandatory(JsonUtils.pojoToJson(user));
 | 
			
		||||
      }
 | 
			
		||||
@ -394,9 +397,7 @@ public final class TablesInitializer {
 | 
			
		||||
    }
 | 
			
		||||
    try {
 | 
			
		||||
      CollectionDAO daoObject = jdbi.onDemand(CollectionDAO.class);
 | 
			
		||||
      SecretsManager secretsManager =
 | 
			
		||||
          SecretsManagerFactory.createSecretsManager(config.getSecretsManagerConfiguration(), config.getClusterName());
 | 
			
		||||
      UserRepository userRepository = new UserRepository(daoObject, secretsManager);
 | 
			
		||||
      UserRepository userRepository = new UserRepository(daoObject);
 | 
			
		||||
      RestUtil.PutResponse<User> addedUser = userRepository.createOrUpdate(null, user);
 | 
			
		||||
      printToConsoleInDebug("Updated user entry: " + addedUser.getEntity());
 | 
			
		||||
      if (jwtAuthMechanism != null) {
 | 
			
		||||
@ -407,11 +408,9 @@ public final class TablesInitializer {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static void addOrUpdateUser(User user, Jdbi jdbi, OpenMetadataApplicationConfig config) throws Exception {
 | 
			
		||||
  private static void addOrUpdateUser(User user, Jdbi jdbi) throws Exception {
 | 
			
		||||
    CollectionDAO daoObject = jdbi.onDemand(CollectionDAO.class);
 | 
			
		||||
    SecretsManager secretsManager =
 | 
			
		||||
        SecretsManagerFactory.createSecretsManager(config.getSecretsManagerConfiguration(), config.getClusterName());
 | 
			
		||||
    UserRepository userRepository = new UserRepository(daoObject, secretsManager);
 | 
			
		||||
    UserRepository userRepository = new UserRepository(daoObject);
 | 
			
		||||
    User addedUser = userRepository.create(null, user);
 | 
			
		||||
    printToConsoleInDebug("Added user entry: " + addedUser.getName());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.DashboardService;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.services.connections.database.MysqlConnection;
 | 
			
		||||
import org.openmetadata.schema.type.DashboardConnection;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class DashboardServiceRepositoryUnitTest
 | 
			
		||||
    extends ServiceEntityRepositoryTest<DashboardServiceRepository, DashboardService, DashboardConnection> {
 | 
			
		||||
@ -32,9 +31,8 @@ public class DashboardServiceRepositoryUnitTest
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected DashboardServiceRepository newServiceRepository(
 | 
			
		||||
      CollectionDAO collectionDAO, SecretsManager secretsManager) {
 | 
			
		||||
    return new DashboardServiceRepository(collectionDAO, secretsManager);
 | 
			
		||||
  protected DashboardServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
 | 
			
		||||
    return new DashboardServiceRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,6 @@ import org.openmetadata.schema.api.services.DatabaseConnection;
 | 
			
		||||
import org.openmetadata.schema.entity.services.DatabaseService;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.services.connections.database.MysqlConnection;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class DatabaseServiceRepositoryUnitTest
 | 
			
		||||
    extends ServiceEntityRepositoryTest<DatabaseServiceRepository, DatabaseService, DatabaseConnection> {
 | 
			
		||||
@ -32,8 +31,8 @@ public class DatabaseServiceRepositoryUnitTest
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected DatabaseServiceRepository newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager) {
 | 
			
		||||
    return new DatabaseServiceRepository(collectionDAO, secretsManager);
 | 
			
		||||
  protected DatabaseServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
 | 
			
		||||
    return new DatabaseServiceRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.isNull;
 | 
			
		||||
import static org.mockito.Mockito.reset;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
@ -37,6 +36,7 @@ import org.openmetadata.schema.metadataIngestion.SourceConfig;
 | 
			
		||||
import org.openmetadata.schema.type.EntityReference;
 | 
			
		||||
import org.openmetadata.service.Entity;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
 | 
			
		||||
@ExtendWith(MockitoExtension.class)
 | 
			
		||||
public class IngestionPipelineRepositoryUnitTest {
 | 
			
		||||
@ -50,14 +50,15 @@ public class IngestionPipelineRepositoryUnitTest {
 | 
			
		||||
  protected IngestionPipelineRepository ingestionPipelineRepository;
 | 
			
		||||
 | 
			
		||||
  @BeforeEach
 | 
			
		||||
  void beforeEach() {
 | 
			
		||||
  void before() {
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(secretsManager);
 | 
			
		||||
    when(collectionDAO.ingestionPipelineDAO()).thenReturn(dao);
 | 
			
		||||
    ingestionPipelineRepository = new IngestionPipelineRepository(collectionDAO, secretsManager);
 | 
			
		||||
    ingestionPipelineRepository = new IngestionPipelineRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @AfterEach
 | 
			
		||||
  void afterEach() {
 | 
			
		||||
    reset(secretsManager);
 | 
			
		||||
  void after() {
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.MessagingService;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.services.connections.database.MysqlConnection;
 | 
			
		||||
import org.openmetadata.schema.type.MessagingConnection;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class MessagingServiceRepositoryUnitTest
 | 
			
		||||
    extends ServiceEntityRepositoryTest<MessagingServiceRepository, MessagingService, MessagingConnection> {
 | 
			
		||||
@ -32,9 +31,8 @@ public class MessagingServiceRepositoryUnitTest
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected MessagingServiceRepository newServiceRepository(
 | 
			
		||||
      CollectionDAO collectionDAO, SecretsManager secretsManager) {
 | 
			
		||||
    return new MessagingServiceRepository(collectionDAO, secretsManager);
 | 
			
		||||
  protected MessagingServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
 | 
			
		||||
    return new MessagingServiceRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.MlModelService;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.services.connections.database.MysqlConnection;
 | 
			
		||||
import org.openmetadata.schema.type.MlModelConnection;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class MlModelServiceRepositoryUnitTest
 | 
			
		||||
    extends ServiceEntityRepositoryTest<MlModelServiceRepository, MlModelService, MlModelConnection> {
 | 
			
		||||
@ -32,8 +31,8 @@ public class MlModelServiceRepositoryUnitTest
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected MlModelServiceRepository newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager) {
 | 
			
		||||
    return new MlModelServiceRepository(collectionDAO, secretsManager);
 | 
			
		||||
  protected MlModelServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
 | 
			
		||||
    return new MlModelServiceRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.PipelineService;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.schema.services.connections.database.MysqlConnection;
 | 
			
		||||
import org.openmetadata.schema.type.PipelineConnection;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
 | 
			
		||||
public class PipelineServiceRepositoryUnitTest
 | 
			
		||||
    extends ServiceEntityRepositoryTest<PipelineServiceRepository, PipelineService, PipelineConnection> {
 | 
			
		||||
@ -32,8 +31,8 @@ public class PipelineServiceRepositoryUnitTest
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected PipelineServiceRepository newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager) {
 | 
			
		||||
    return new PipelineServiceRepository(collectionDAO, secretsManager);
 | 
			
		||||
  protected PipelineServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
 | 
			
		||||
    return new PipelineServiceRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,7 @@ import org.openmetadata.schema.ServiceConnectionEntityInterface;
 | 
			
		||||
import org.openmetadata.schema.ServiceEntityInterface;
 | 
			
		||||
import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
 | 
			
		||||
@ExtendWith(MockitoExtension.class)
 | 
			
		||||
public abstract class ServiceEntityRepositoryTest<
 | 
			
		||||
@ -59,16 +60,18 @@ public abstract class ServiceEntityRepositoryTest<
 | 
			
		||||
 | 
			
		||||
  @BeforeEach
 | 
			
		||||
  void beforeEach() {
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(secretsManager);
 | 
			
		||||
    mockServiceResourceSpecific();
 | 
			
		||||
    serviceRepository = newServiceRepository(collectionDAO, secretsManager);
 | 
			
		||||
    serviceRepository = newServiceRepository(collectionDAO);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @AfterEach
 | 
			
		||||
  void afterEach() {
 | 
			
		||||
    reset(secretsManager, service);
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected abstract T newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager);
 | 
			
		||||
  protected abstract T newServiceRepository(CollectionDAO collectionDAO);
 | 
			
		||||
 | 
			
		||||
  protected abstract void mockServiceResourceSpecific();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,6 @@ import org.openmetadata.schema.type.Include;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.DashboardServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.services.dashboard.DashboardServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
 | 
			
		||||
public class DashboardServiceResourceUnitTest
 | 
			
		||||
@ -42,9 +41,8 @@ public class DashboardServiceResourceUnitTest
 | 
			
		||||
        DashboardServiceResource, DashboardService, DashboardServiceRepository, DashboardConnection> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected DashboardServiceResource newServiceResource(
 | 
			
		||||
      CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    return new DashboardServiceResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
  protected DashboardServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    return new DashboardServiceResource(collectionDAO, authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,6 @@ import org.openmetadata.schema.type.Include;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.DatabaseServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.services.database.DatabaseServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
 | 
			
		||||
public class DatabaseServiceResourceUnitTest
 | 
			
		||||
@ -42,9 +41,8 @@ public class DatabaseServiceResourceUnitTest
 | 
			
		||||
        DatabaseServiceResource, DatabaseService, DatabaseServiceRepository, DatabaseConnection> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected DatabaseServiceResource newServiceResource(
 | 
			
		||||
      CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    return new DatabaseServiceResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
  protected DatabaseServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    return new DatabaseServiceResource(collectionDAO, authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,6 @@ import org.openmetadata.schema.type.MessagingConnection;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.MessagingServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.services.messaging.MessagingServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
 | 
			
		||||
public class MessagingServiceResourceUnitTest
 | 
			
		||||
@ -42,9 +41,8 @@ public class MessagingServiceResourceUnitTest
 | 
			
		||||
        MessagingServiceResource, MessagingService, MessagingServiceRepository, MessagingConnection> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected MessagingServiceResource newServiceResource(
 | 
			
		||||
      CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    return new MessagingServiceResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
  protected MessagingServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    return new MessagingServiceResource(collectionDAO, authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,6 @@ import org.openmetadata.schema.type.MlModelConnection;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.MlModelServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.services.mlmodel.MlModelServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
 | 
			
		||||
@ExtendWith(MockitoExtension.class)
 | 
			
		||||
@ -44,9 +43,8 @@ public class MlModelServiceResourceUnitTest
 | 
			
		||||
    extends ServiceResourceTest<MlModelServiceResource, MlModelService, MlModelServiceRepository, MlModelConnection> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected MlModelServiceResource newServiceResource(
 | 
			
		||||
      CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    return new MlModelServiceResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
  protected MlModelServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    return new MlModelServiceResource(collectionDAO, authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,6 @@ import org.openmetadata.schema.type.PipelineConnection;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.PipelineServiceRepository;
 | 
			
		||||
import org.openmetadata.service.resources.services.pipeline.PipelineServiceResource;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
 | 
			
		||||
@ExtendWith(MockitoExtension.class)
 | 
			
		||||
@ -45,9 +44,8 @@ public class PipelineServiceResourceUnitTest
 | 
			
		||||
        PipelineServiceResource, PipelineService, PipelineServiceRepository, PipelineConnection> {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected PipelineServiceResource newServiceResource(
 | 
			
		||||
      CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
 | 
			
		||||
    return new PipelineServiceResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
  protected PipelineServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
 | 
			
		||||
    return new PipelineServiceResource(collectionDAO, authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,7 @@ import static org.mockito.Mockito.when;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import javax.ws.rs.core.SecurityContext;
 | 
			
		||||
import org.junit.jupiter.api.AfterEach;
 | 
			
		||||
import org.junit.jupiter.api.BeforeEach;
 | 
			
		||||
import org.junit.jupiter.api.extension.ExtendWith;
 | 
			
		||||
import org.junit.jupiter.params.ParameterizedTest;
 | 
			
		||||
@ -40,6 +41,7 @@ import org.openmetadata.schema.entity.services.ServiceType;
 | 
			
		||||
import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.AuthorizationException;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
 | 
			
		||||
@ -66,6 +68,7 @@ public abstract class ServiceResourceTest<
 | 
			
		||||
 | 
			
		||||
  @BeforeEach
 | 
			
		||||
  void beforeEach() throws IOException {
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(secretsManager);
 | 
			
		||||
    mockServiceResourceSpecific();
 | 
			
		||||
    when(collectionDAO.relationshipDAO()).thenReturn(mock(CollectionDAO.EntityRelationshipDAO.class));
 | 
			
		||||
    when(service.getId()).thenReturn(UUID.randomUUID());
 | 
			
		||||
@ -75,13 +78,17 @@ public abstract class ServiceResourceTest<
 | 
			
		||||
            secretsManager.encryptOrDecryptServiceConnectionConfig(
 | 
			
		||||
                any(), anyString(), any(), any(ServiceType.class), anyBoolean()))
 | 
			
		||||
        .thenReturn(serviceConnectionConfig);
 | 
			
		||||
    serviceResource = newServiceResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
    serviceResource = newServiceResource(collectionDAO, authorizer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @AfterEach
 | 
			
		||||
  void afterEach() {
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected abstract void mockServiceResourceSpecific() throws IOException;
 | 
			
		||||
 | 
			
		||||
  protected abstract T newServiceResource(
 | 
			
		||||
      CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager);
 | 
			
		||||
  protected abstract T newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer);
 | 
			
		||||
 | 
			
		||||
  @ParameterizedTest
 | 
			
		||||
  @CsvSource({
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import javax.ws.rs.core.SecurityContext;
 | 
			
		||||
import org.junit.jupiter.api.AfterEach;
 | 
			
		||||
import org.junit.jupiter.api.BeforeEach;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.junit.jupiter.api.extension.ExtendWith;
 | 
			
		||||
@ -58,6 +59,7 @@ import org.openmetadata.service.jdbi3.CollectionDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.EntityDAO;
 | 
			
		||||
import org.openmetadata.service.jdbi3.EntityRepository;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManager;
 | 
			
		||||
import org.openmetadata.service.secrets.SecretsManagerFactory;
 | 
			
		||||
import org.openmetadata.service.security.Authorizer;
 | 
			
		||||
import org.openmetadata.service.util.PipelineServiceClient;
 | 
			
		||||
 | 
			
		||||
@ -93,7 +95,13 @@ public class IngestionPipelineResourceUnitTest {
 | 
			
		||||
    lenient().when(relationshipDAO.findFrom(any(), any(), anyInt())).thenReturn(List.of(entityRelationshipRecord));
 | 
			
		||||
    when(collectionDAO.ingestionPipelineDAO()).thenReturn(entityDAO);
 | 
			
		||||
    lenient().when(collectionDAO.relationshipDAO()).thenReturn(relationshipDAO);
 | 
			
		||||
    ingestionPipelineResource = new IngestionPipelineResource(collectionDAO, authorizer, secretsManager);
 | 
			
		||||
    ingestionPipelineResource = new IngestionPipelineResource(collectionDAO, authorizer);
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(secretsManager);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @AfterEach
 | 
			
		||||
  void afterEach() {
 | 
			
		||||
    SecretsManagerFactory.setSecretsManager(null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user