Fixes #8068 Remove ConstructorType annotation from Collection (#8069)

This commit is contained in:
Suresh Srinivas 2022-10-10 23:32:48 -07:00 committed by GitHub
parent 806dcea0de
commit f4acc4af1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
75 changed files with 202 additions and 368 deletions

View File

@ -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(), "/");

View File

@ -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);

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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()));

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }

View File

@ -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();

View File

@ -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;

View File

@ -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;
} }

View File

@ -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,58 +243,22 @@ 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 =
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(); 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 {

View File

@ -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) {

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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(

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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");

View File

@ -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);
} }

View File

@ -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);

View File

@ -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);
} }

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;
} }

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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());
} }

View File

@ -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);
} }

View File

@ -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> {

View File

@ -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> {

View File

@ -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,

View File

@ -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> {

View File

@ -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> {

View File

@ -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> {

View File

@ -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);
} }

View File

@ -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);

View File

@ -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$");

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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(

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);

View File

@ -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());

View File

@ -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) {

View File

@ -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;
} }
} }

View File

@ -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());

View File

@ -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);

View File

@ -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) {

View File

@ -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());
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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({

View File

@ -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