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