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
EventPubSub.start();
registerResources(catalogConfig, environment, jdbi, secretsManager);
registerResources(catalogConfig, environment, jdbi);
// Register Event Handler
registerEventFilter(catalogConfig, environment, jdbi);
@ -270,9 +270,8 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
}
}
private void registerResources(
OpenMetadataApplicationConfig config, Environment environment, Jdbi jdbi, SecretsManager secretsManager) {
CollectionRegistry.getInstance().registerResources(jdbi, environment, config, authorizer, secretsManager);
private void registerResources(OpenMetadataApplicationConfig config, Environment environment, Jdbi jdbi) {
CollectionRegistry.getInstance().registerResources(jdbi, environment, config, authorizer);
environment.jersey().register(new JsonPatchProvider());
ErrorPageErrorHandler eph = new ErrorPageErrorHandler();
eph.addErrorPage(Response.Status.NOT_FOUND.getStatusCode(), "/");

View File

@ -23,17 +23,15 @@ import org.openmetadata.schema.type.Relationship;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.bots.BotResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.util.EntityUtil.Fields;
public class BotRepository extends EntityRepository<Bot> {
static final String BOT_UPDATE_FIELDS = "botUser";
final SecretsManager secretsManager;
public BotRepository(CollectionDAO dao, SecretsManager secretsManager) {
public BotRepository(CollectionDAO dao) {
super(BotResource.COLLECTION_PATH, Entity.BOT, Bot.class, dao.botDAO(), dao, "", BOT_UPDATE_FIELDS);
this.secretsManager = secretsManager;
}
@Override
@ -54,6 +52,7 @@ public class BotRepository extends EntityRepository<Bot> {
entity.withBotUser(null);
store(entity.getId(), entity, update);
if (!BotType.BOT.equals(entity.getBotType())) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
secretsManager.encryptOrDecryptBotCredentials(entity.getBotType().value(), botUser.getName(), true);
}
entity.withBotUser(botUser);

View File

@ -18,17 +18,15 @@ import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.type.DashboardConnection;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.services.dashboard.DashboardServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
public class DashboardServiceRepository extends ServiceEntityRepository<DashboardService, DashboardConnection> {
public DashboardServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
public DashboardServiceRepository(CollectionDAO dao) {
super(
DashboardServiceResource.COLLECTION_PATH,
Entity.DASHBOARD_SERVICE,
dao,
dao.dashboardServiceDAO(),
secretsManager,
DashboardConnection.class,
ServiceType.DASHBOARD);
}

View File

@ -18,16 +18,14 @@ import org.openmetadata.schema.entity.services.DatabaseService;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.services.database.DatabaseServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
public class DatabaseServiceRepository extends ServiceEntityRepository<DatabaseService, DatabaseConnection> {
public DatabaseServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
public DatabaseServiceRepository(CollectionDAO dao) {
super(
DatabaseServiceResource.COLLECTION_PATH,
Entity.DATABASE_SERVICE,
dao,
dao.dbServiceDAO(),
secretsManager,
DatabaseConnection.class,
ServiceType.DATABASE);
}

View File

@ -29,6 +29,7 @@ import org.openmetadata.schema.type.Relationship;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.util.EntityUtil.Fields;
import org.openmetadata.service.util.FullyQualifiedName;
import org.openmetadata.service.util.JsonUtils;
@ -39,9 +40,7 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
private static final String PATCH_FIELDS = "owner,sourceConfig,airflowConfig,loggerLevel,enabled";
private static PipelineServiceClient pipelineServiceClient;
private final SecretsManager secretsManager;
public IngestionPipelineRepository(CollectionDAO dao, SecretsManager secretsManager) {
public IngestionPipelineRepository(CollectionDAO dao) {
super(
IngestionPipelineResource.COLLECTION_PATH,
Entity.INGESTION_PIPELINE,
@ -50,7 +49,6 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
dao,
PATCH_FIELDS,
UPDATE_FIELDS);
this.secretsManager = secretsManager;
}
@Override
@ -83,6 +81,7 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
ingestionPipeline.withOwner(null).withService(null).withHref(null);
// encrypt config in case of local secret manager
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (secretsManager.isLocal()) {
secretsManager.encryptOrDecryptDbtConfigSource(ingestionPipeline, service, true);
store(ingestionPipeline.getId(), ingestionPipeline, update);
@ -152,6 +151,7 @@ public class IngestionPipelineRepository extends EntityRepository<IngestionPipel
}
private void updateSourceConfig() throws JsonProcessingException {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
secretsManager.encryptOrDecryptDbtConfigSource(original, false);
JSONObject origSourceConfig = new JSONObject(JsonUtils.pojoToJson(original.getSourceConfig().getConfig()));

View File

@ -18,18 +18,16 @@ import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.type.MessagingConnection;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.services.messaging.MessagingServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
public class MessagingServiceRepository extends ServiceEntityRepository<MessagingService, MessagingConnection> {
private static final String UPDATE_FIELDS = "owner, connection";
public MessagingServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
public MessagingServiceRepository(CollectionDAO dao) {
super(
MessagingServiceResource.COLLECTION_PATH,
Entity.MESSAGING_SERVICE,
dao,
dao.messagingServiceDAO(),
secretsManager,
MessagingConnection.class,
UPDATE_FIELDS,
ServiceType.MESSAGING);

View File

@ -18,18 +18,16 @@ import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.type.MlModelConnection;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.services.mlmodel.MlModelServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
public class MlModelServiceRepository extends ServiceEntityRepository<MlModelService, MlModelConnection> {
private static final String UPDATE_FIELDS = "owner,connection";
public MlModelServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
public MlModelServiceRepository(CollectionDAO dao) {
super(
MlModelServiceResource.COLLECTION_PATH,
Entity.MLMODEL_SERVICE,
dao,
dao.mlModelServiceDAO(),
secretsManager,
MlModelConnection.class,
UPDATE_FIELDS,
ServiceType.ML_MODEL);

View File

@ -18,17 +18,15 @@ import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.type.PipelineConnection;
import org.openmetadata.service.Entity;
import org.openmetadata.service.resources.services.pipeline.PipelineServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
public class PipelineServiceRepository extends ServiceEntityRepository<PipelineService, PipelineConnection> {
public PipelineServiceRepository(CollectionDAO dao, SecretsManager secretsManager) {
public PipelineServiceRepository(CollectionDAO dao) {
super(
PipelineServiceResource.COLLECTION_PATH,
Entity.PIPELINE_SERVICE,
dao,
dao.pipelineServiceDAO(),
secretsManager,
PipelineConnection.class,
ServiceType.PIPELINE);
}

View File

@ -22,6 +22,7 @@ import org.openmetadata.schema.ServiceEntityInterface;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.util.EntityUtil;
import org.openmetadata.service.util.JsonUtils;
@ -32,8 +33,6 @@ public abstract class ServiceEntityRepository<
@Getter private final Class<S> serviceConnectionClass;
protected final SecretsManager secretsManager;
@Getter private final ServiceType serviceType;
protected ServiceEntityRepository(
@ -41,10 +40,9 @@ public abstract class ServiceEntityRepository<
String service,
CollectionDAO dao,
EntityDAO<T> entityDAO,
SecretsManager secretsManager,
Class<S> serviceConnectionClass,
ServiceType serviceType) {
this(collectionPath, service, dao, entityDAO, secretsManager, serviceConnectionClass, UPDATE_FIELDS, serviceType);
this(collectionPath, service, dao, entityDAO, serviceConnectionClass, UPDATE_FIELDS, serviceType);
}
protected ServiceEntityRepository(
@ -52,12 +50,10 @@ public abstract class ServiceEntityRepository<
String service,
CollectionDAO dao,
EntityDAO<T> entityDAO,
SecretsManager secretsManager,
Class<S> serviceConnectionClass,
String updatedFields,
ServiceType serviceType) {
super(collectionPath, service, entityDAO.getEntityClass(), entityDAO, dao, "", updatedFields);
this.secretsManager = secretsManager;
this.serviceConnectionClass = serviceConnectionClass;
this.serviceType = serviceType;
}
@ -83,6 +79,7 @@ public abstract class ServiceEntityRepository<
service.withOwner(null).withHref(null);
// encrypt connection config in case of local secret manager
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (secretsManager.isLocal()) {
service
.getConnection()
@ -135,6 +132,7 @@ public abstract class ServiceEntityRepository<
}
private void updateConnection() throws IOException {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (secretsManager.isLocal()) {
ServiceConnectionEntityInterface origConn = original.getConnection();
ServiceConnectionEntityInterface updatedConn = updated.getConnection();

View File

@ -40,6 +40,7 @@ import org.openmetadata.service.exception.CatalogExceptionMessage;
import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord;
import org.openmetadata.service.resources.teams.UserResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.policyevaluator.SubjectCache;
import org.openmetadata.service.util.EntityUtil;
import org.openmetadata.service.util.EntityUtil.Fields;
@ -50,9 +51,8 @@ public class UserRepository extends EntityRepository<User> {
static final String USER_PATCH_FIELDS = "profile,roles,teams,authenticationMechanism,isEmailVerified";
static final String USER_UPDATE_FIELDS = "profile,roles,teams,authenticationMechanism,isEmailVerified";
private final EntityReference organization;
private final SecretsManager secretsManager;
public UserRepository(CollectionDAO dao, SecretsManager secretsManager) {
public UserRepository(CollectionDAO dao) {
super(
UserResource.COLLECTION_PATH,
Entity.USER,
@ -62,7 +62,6 @@ public class UserRepository extends EntityRepository<User> {
USER_PATCH_FIELDS,
USER_UPDATE_FIELDS);
organization = dao.teamDAO().findEntityReferenceByName(Entity.ORGANIZATION_NAME, Include.ALL);
this.secretsManager = secretsManager;
}
public final Fields getFieldsWithUserAuth(String fields) {
@ -112,6 +111,7 @@ public class UserRepository extends EntityRepository<User> {
// Don't store roles, teams and href as JSON. Build it on the fly based on relationships
user.withRoles(null).withTeams(null).withHref(null).withInheritedRoles(null);
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (secretsManager != null && Boolean.TRUE.equals(user.getIsBot()) && user.getAuthenticationMechanism() != null) {
user.getAuthenticationMechanism()
.setConfig(
@ -226,10 +226,11 @@ public class UserRepository extends EntityRepository<User> {
@Transaction
public User getByNameWithSecretManager(String fqn, Fields fields) throws IOException {
User user = getByName(null, fqn, fields, NON_DELETED);
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (user.getAuthenticationMechanism() != null) {
user.getAuthenticationMechanism()
.withConfig(
this.secretsManager.encryptOrDecryptBotUserCredentials(
secretsManager.encryptOrDecryptBotUserCredentials(
user.getName(), user.getAuthenticationMechanism().getConfig(), false));
}
return user;

View File

@ -21,17 +21,8 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR})
public @interface Collection {
enum ConstructorType {
CONFIG,
DAO_AUTH,
DAO_AUTH_SM,
DAO_AUTH_CONFIG,
DAO_AUTH_SM_CONFIG,
}
String name();
String name() default "";
/** Only order from 0 to 9 (inclusive) are allowed */
int order() default 9;
ConstructorType constructorType() default ConstructorType.DAO_AUTH;
}

View File

@ -18,7 +18,6 @@ import io.dropwizard.setup.Environment;
import io.swagger.annotations.Api;
import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
@ -42,7 +41,6 @@ import org.openmetadata.schema.type.CollectionDescriptor;
import org.openmetadata.schema.type.CollectionInfo;
import org.openmetadata.service.OpenMetadataApplicationConfig;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.RestUtil;
import org.reflections.Reflections;
@ -181,11 +179,7 @@ public final class CollectionRegistry {
/** Register resources from CollectionRegistry */
public void registerResources(
Jdbi jdbi,
Environment environment,
OpenMetadataApplicationConfig config,
Authorizer authorizer,
SecretsManager secretsManager) {
Jdbi jdbi, Environment environment, OpenMetadataApplicationConfig config, Authorizer authorizer) {
// Build list of ResourceDescriptors
for (Map.Entry<String, CollectionDetails> e : collectionMap.entrySet()) {
CollectionDetails details = e.getValue();
@ -193,7 +187,7 @@ public final class CollectionRegistry {
try {
CollectionDAO daoObject = jdbi.onDemand(CollectionDAO.class);
Objects.requireNonNull(daoObject, "CollectionDAO must not be null");
Object resource = createResource(daoObject, resourceClass, config, authorizer, secretsManager);
Object resource = createResource(daoObject, resourceClass, config, authorizer);
details.setResource(resource);
environment.jersey().register(resource);
LOG.info("Registering {} with order {}", resourceClass, details.order);
@ -212,28 +206,24 @@ public final class CollectionRegistry {
/** Get collection details based on annotations in Resource classes */
private static CollectionDetails getCollection(Class<?> cl) {
String href;
String doc;
String name;
int order = 0;
href = null;
doc = null;
name = null;
CollectionInfo collectionInfo = new CollectionInfo();
for (Annotation a : cl.getAnnotations()) {
if (a instanceof Path) {
// Use @Path annotation to compile href
href = ((Path) a).value();
collectionInfo.withHref(URI.create(((Path) a).value()));
} else if (a instanceof Api) {
// Use @Api annotation to get documentation about the collection
doc = ((Api) a).value();
collectionInfo.withDocumentation(((Api) a).value());
} else if (a instanceof Collection) {
// Use @Collection annotation to get initialization information for the class
name = ((Collection) a).name();
order = ((Collection) a).order();
Collection collection = (Collection) a;
collectionInfo.withName(collection.name());
order = collection.order();
}
}
CollectionDescriptor cd = new CollectionDescriptor();
cd.setCollection(new CollectionInfo().withName(name).withDocumentation(doc).withHref(URI.create(href)));
cd.setCollection(collectionInfo);
return new CollectionDetails(cd, cl.getCanonicalName(), order);
}
@ -253,59 +243,23 @@ public final class CollectionRegistry {
/** Create a resource class based on dependencies declared in @Collection annotation */
private static Object createResource(
CollectionDAO daoObject,
String resourceClass,
OpenMetadataApplicationConfig config,
Authorizer authorizer,
SecretsManager secretsManager)
CollectionDAO daoObject, String resourceClass, OpenMetadataApplicationConfig config, Authorizer authorizer)
throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException,
InstantiationException {
Object resource = null;
Object resource;
Class<?> clz = Class.forName(resourceClass);
// NOTE: Currently this will work fine for One Constructor scenario since per resource only one constructor is
// present,
// for multiple constructor we can use order as the priority to qualify amongst multiple constructors
for (Constructor<?> constructor : clz.getConstructors()) {
Collection c = constructor.getAnnotation(Collection.class);
if (c != null) {
switch (c.constructorType()) {
case DAO_AUTH:
resource =
clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class).newInstance(daoObject, authorizer);
break;
case DAO_AUTH_SM:
resource =
clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class, SecretsManager.class)
.newInstance(daoObject, authorizer, secretsManager);
break;
case CONFIG:
resource = clz.getDeclaredConstructor(OpenMetadataApplicationConfig.class).newInstance(config);
break;
case DAO_AUTH_CONFIG:
resource =
clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class, OpenMetadataApplicationConfig.class)
.newInstance(daoObject, authorizer, config);
break;
case DAO_AUTH_SM_CONFIG:
resource =
clz.getDeclaredConstructor(
CollectionDAO.class,
Authorizer.class,
SecretsManager.class,
OpenMetadataApplicationConfig.class)
.newInstance(daoObject, authorizer, secretsManager, config);
break;
default:
resource = Class.forName(resourceClass).getConstructor().newInstance();
}
// Create the resource identified by resourceClass
try {
resource = clz.getDeclaredConstructor(CollectionDAO.class, Authorizer.class).newInstance(daoObject, authorizer);
} catch (NoSuchMethodException e) {
try {
resource = clz.getDeclaredConstructor().newInstance();
} catch (NoSuchMethodException exc) {
resource = Class.forName(resourceClass).getConstructor().newInstance();
}
}
if (resource == null) {
resource = Class.forName(resourceClass).getConstructor().newInstance();
}
// Call initialize method, if it exists
try {
Method initializeMethod = resource.getClass().getMethod("initialize", OpenMetadataApplicationConfig.class);

View File

@ -9,6 +9,7 @@ import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.CreateEntity;
import org.openmetadata.schema.EntityInterface;
@ -35,7 +36,7 @@ public abstract class EntityResource<T extends EntityInterface, K extends Entity
protected final Class<T> entityClass;
protected final String entityType;
protected final List<String> allowedFields;
protected final K dao;
@Getter protected final K dao;
protected final Authorizer authorizer;
protected EntityResource(Class<T> entityClass, K repository, Authorizer authorizer) {

View File

@ -60,6 +60,7 @@ import org.openmetadata.service.jdbi3.UserRepository;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.EntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.EntityUtil;
import org.openmetadata.service.util.ResultList;
@ -72,12 +73,8 @@ import org.openmetadata.service.util.ResultList;
public class BotResource extends EntityResource<Bot, BotRepository> {
public static final String COLLECTION_PATH = "/v1/bots/";
final SecretsManager secretsManager;
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public BotResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(Bot.class, new BotRepository(dao, secretsManager), authorizer);
this.secretsManager = secretsManager;
public BotResource(CollectionDAO dao, Authorizer authorizer) {
super(Bot.class, new BotRepository(dao), authorizer);
}
@Override
@ -269,6 +266,7 @@ public class BotResource extends EntityResource<Bot, BotRepository> {
Response response = createOrUpdate(uriInfo, securityContext, bot, false);
// ensures the secrets' manager store the credentials even when the botUser does not change
bot = (Bot) response.getEntity();
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (!BotType.BOT.equals(bot.getBotType())) {
secretsManager.encryptOrDecryptBotCredentials(bot.getBotType().value(), bot.getBotUser().getName(), true);
}

View File

@ -76,7 +76,6 @@ public class ChartResource extends EntityResource<Chart, ChartRepository> {
return chart;
}
@Collection
public ChartResource(CollectionDAO dao, Authorizer authorizer) {
super(Chart.class, new ChartRepository(dao), authorizer);
}

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.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import java.io.IOException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@ -37,15 +38,17 @@ import org.openmetadata.service.security.jwt.JWTTokenGenerator;
@Produces(MediaType.APPLICATION_JSON)
@Collection(name = "config")
public class ConfigResource {
private final OpenMetadataApplicationConfig openMetadataApplicationConfig;
private OpenMetadataApplicationConfig openMetadataApplicationConfig;
private final JWTTokenGenerator jwtTokenGenerator;
@Collection(constructorType = Collection.ConstructorType.CONFIG)
public ConfigResource(OpenMetadataApplicationConfig openMetadataApplicationConfig) {
this.openMetadataApplicationConfig = openMetadataApplicationConfig;
public ConfigResource() {
this.jwtTokenGenerator = JWTTokenGenerator.getInstance();
}
public void initialize(OpenMetadataApplicationConfig config) throws IOException {
this.openMetadataApplicationConfig = config;
}
@GET
@Path(("/auth"))
@Operation(

View File

@ -75,7 +75,6 @@ public class DashboardResource extends EntityResource<Dashboard, DashboardReposi
return dashboard;
}
@Collection
public DashboardResource(CollectionDAO dao, Authorizer authorizer) {
super(Dashboard.class, new DashboardRepository(dao), authorizer);
}

View File

@ -76,7 +76,6 @@ public class DatabaseResource extends EntityResource<Database, DatabaseRepositor
return db;
}
@Collection
public DatabaseResource(CollectionDAO dao, Authorizer authorizer) {
super(Database.class, new DatabaseRepository(dao), authorizer);
}

View File

@ -75,7 +75,6 @@ public class DatabaseSchemaResource extends EntityResource<DatabaseSchema, Datab
return schema;
}
@Collection
public DatabaseSchemaResource(CollectionDAO dao, Authorizer authorizer) {
super(DatabaseSchema.class, new DatabaseSchemaRepository(dao), authorizer);
}

View File

@ -114,7 +114,6 @@ public class TableResource extends EntityResource<Table, TableRepository> {
return operations.toArray(new MetadataOperation[0]);
}
@Collection
public TableResource(CollectionDAO dao, Authorizer authorizer) {
super(Table.class, new TableRepository(dao), authorizer);
allowedFields.add("tests");

View File

@ -83,7 +83,6 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
}
@Inject
@Collection
public TestCaseResource(CollectionDAO dao, Authorizer authorizer) {
super(TestCase.class, new TestCaseRepository(dao), authorizer);
}

View File

@ -77,7 +77,6 @@ public class TestDefinitionResource extends EntityResource<TestDefinition, TestD
}
@Inject
@Collection
public TestDefinitionResource(CollectionDAO dao, Authorizer authorizer) {
super(TestDefinition.class, new TestDefinitionRepository(dao), authorizer);
this.daoTestDefinition = new TestDefinitionRepository(dao);

View File

@ -67,7 +67,6 @@ public class TestSuiteResource extends EntityResource<TestSuite, TestSuiteReposi
}
@Inject
@Collection
public TestSuiteResource(CollectionDAO dao, Authorizer authorizer) {
super(TestSuite.class, new TestSuiteRepository(dao), authorizer);
}

View File

@ -60,7 +60,6 @@ import org.openmetadata.service.jdbi3.EntityRepository;
import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.jdbi3.UserRepository;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.ElasticSearchClientUtils;
import org.openmetadata.service.util.EntityUtil;
@ -84,21 +83,22 @@ public class BuildSearchIndexResource {
private final ExecutorService threadScheduler;
private final UserRepository userRepository;
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM_CONFIG)
public BuildSearchIndexResource(
CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager, OpenMetadataApplicationConfig config) {
if (config.getElasticSearchConfiguration() != null) {
this.client = ElasticSearchClientUtils.createElasticSearchClient(config.getElasticSearchConfiguration());
this.elasticSearchIndexDefinition = new ElasticSearchIndexDefinition(client, dao);
}
public BuildSearchIndexResource(CollectionDAO dao, Authorizer authorizer) {
this.dao = dao;
this.userRepository = new UserRepository(dao, secretsManager);
this.userRepository = new UserRepository(dao);
this.authorizer = authorizer;
this.threadScheduler =
new ThreadPoolExecutor(
2, 2, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(5), new ThreadPoolExecutor.CallerRunsPolicy());
}
public void initialize(OpenMetadataApplicationConfig config) throws IOException {
if (config.getElasticSearchConfiguration() != null) {
this.client = ElasticSearchClientUtils.createElasticSearchClient(config.getElasticSearchConfiguration());
this.elasticSearchIndexDefinition = new ElasticSearchIndexDefinition(client, dao);
}
}
private BulkProcessor getBulkProcessor(BulkProcessorListener listener, int bulkSize, int flushIntervalInSeconds) {
BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer =
(request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener);

View File

@ -61,7 +61,6 @@ public class EventResource {
}
}
@Collection
public EventResource(CollectionDAO dao, Authorizer authorizer) {
Objects.requireNonNull(dao, "ChangeEventRepository must not be null");
this.dao = new ChangeEventRepository(dao);

View File

@ -86,7 +86,6 @@ public class WebhookResource extends EntityResource<Webhook, WebhookRepository>
}
}
@Collection
public WebhookResource(CollectionDAO dao, Authorizer authorizer) {
super(Webhook.class, new WebhookRepository(dao), authorizer);
webhookDAO = dao.webhookDAO();

View File

@ -100,7 +100,6 @@ public class FeedResource {
return thread;
}
@Collection
public FeedResource(CollectionDAO dao, Authorizer authorizer) {
Objects.requireNonNull(dao, "FeedRepository must not be null");
this.dao = new FeedRepository(dao);

View File

@ -77,7 +77,6 @@ public class GlossaryResource extends EntityResource<Glossary, GlossaryRepositor
}
@Inject
@Collection
public GlossaryResource(CollectionDAO dao, Authorizer authorizer) {
super(Glossary.class, new GlossaryRepository(dao), authorizer);
}

View File

@ -84,7 +84,6 @@ public class GlossaryTermResource extends EntityResource<GlossaryTerm, GlossaryT
}
@Inject
@Collection
public GlossaryTermResource(CollectionDAO dao, Authorizer authorizer) {
super(GlossaryTerm.class, new GlossaryTermRepository(dao), authorizer);
}

View File

@ -66,7 +66,6 @@ public class LineageResource {
private final LineageRepository dao;
private final Authorizer authorizer;
@Collection
public LineageResource(@NonNull CollectionDAO dao, Authorizer authorizer) {
this.dao = new LineageRepository(dao);
this.authorizer = authorizer;

View File

@ -78,7 +78,6 @@ public class LocationResource extends EntityResource<Location, LocationRepositor
return location;
}
@Collection
public LocationResource(CollectionDAO dao, Authorizer authorizer) {
super(Location.class, new LocationRepository(dao), authorizer);
}

View File

@ -57,7 +57,6 @@ import org.openmetadata.service.util.ResultList;
public class MetricsResource extends EntityResource<Metrics, MetricsRepository> {
public static final String COLLECTION_PATH = "/v1/metrics/";
@Collection
public MetricsResource(CollectionDAO dao, Authorizer authorizer) {
super(Metrics.class, new MetricsRepository(dao), authorizer);
}

View File

@ -78,7 +78,6 @@ public class MlModelResource extends EntityResource<MlModel, MlModelRepository>
return mlmodel;
}
@Collection
public MlModelResource(CollectionDAO dao, Authorizer authorizer) {
super(MlModel.class, new MlModelRepository(dao), authorizer);
}

View File

@ -48,7 +48,6 @@ public class PermissionsResource {
private final Authorizer authorizer;
@SuppressWarnings("unused")
@Collection
public PermissionsResource(CollectionDAO dao, @NonNull Authorizer authorizer) {
this.authorizer = authorizer;
}

View File

@ -80,7 +80,6 @@ public class PipelineResource extends EntityResource<Pipeline, PipelineRepositor
return pipeline;
}
@Collection
public PipelineResource(CollectionDAO dao, Authorizer authorizer) {
super(Pipeline.class, new PipelineRepository(dao), authorizer);
}

View File

@ -91,7 +91,6 @@ public class PolicyResource extends EntityResource<Policy, PolicyRepository> {
return policy;
}
@Collection
public PolicyResource(CollectionDAO dao, Authorizer authorizer) {
super(Policy.class, new PolicyRepository(dao), authorizer);
}

View File

@ -56,7 +56,6 @@ import org.openmetadata.service.util.ResultList;
public class ReportResource extends EntityResource<Report, ReportRepository> {
public static final String COLLECTION_PATH = "/v1/bots/";
@Collection
public ReportResource(CollectionDAO dao, Authorizer authorizer) {
super(Report.class, new ReportRepository(dao), authorizer);
}

View File

@ -73,8 +73,9 @@ public class SearchResource {
private static final String DESCRIPTION = "description";
private static final String UNIFIED = "unified";
@Collection(constructorType = Collection.ConstructorType.CONFIG)
public SearchResource(OpenMetadataApplicationConfig config) {
public SearchResource() {}
public void initialize(OpenMetadataApplicationConfig config) throws IOException {
if (config.getElasticSearchConfiguration() != null) {
this.client = ElasticSearchClientUtils.createElasticSearchClient(config.getElasticSearchConfiguration());
}

View File

@ -26,6 +26,7 @@ import org.openmetadata.service.exception.UnhandledServerException;
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
import org.openmetadata.service.resources.EntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.AuthorizationException;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.JsonUtils;
@ -37,25 +38,19 @@ public abstract class ServiceEntityResource<
S extends ServiceConnectionEntityInterface>
extends EntityResource<T, R> {
private final SecretsManager secretsManager;
@Getter private final ServiceEntityRepository<T, S> serviceEntityRepository;
private final ServiceType serviceType;
protected ServiceEntityResource(
Class<T> entityClass,
R serviceRepository,
Authorizer authorizer,
SecretsManager secretsManager,
ServiceType serviceType) {
Class<T> entityClass, R serviceRepository, Authorizer authorizer, ServiceType serviceType) {
super(entityClass, serviceRepository, authorizer);
this.serviceEntityRepository = serviceRepository;
this.secretsManager = secretsManager;
this.serviceType = serviceType;
}
protected T decryptOrNullify(SecurityContext securityContext, T service) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
try {
authorizer.authorizeAdmin(securityContext, secretsManager.isLocal());
} catch (AuthorizationException e) {
@ -66,6 +61,7 @@ public abstract class ServiceEntityResource<
}
private Object retrieveServiceConnectionConfig(T service) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
return secretsManager.encryptOrDecryptServiceConnectionConfig(
service.getConnection().getConfig(), extractServiceType(service), service.getName(), serviceType, false);
}

View File

@ -55,7 +55,6 @@ import org.openmetadata.service.jdbi3.DashboardServiceRepository;
import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.services.ServiceEntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.RestUtil;
@ -78,14 +77,9 @@ public class DashboardServiceResource
return service;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public DashboardServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(
DashboardService.class,
new DashboardServiceRepository(dao, secretsManager),
authorizer,
secretsManager,
ServiceType.DASHBOARD);
public DashboardServiceResource(CollectionDAO dao, Authorizer authorizer) {
super(DashboardService.class, new DashboardServiceRepository(dao), authorizer, ServiceType.DASHBOARD);
}
public static class DashboardServiceList extends ResultList<DashboardService> {

View File

@ -54,7 +54,6 @@ import org.openmetadata.service.jdbi3.DatabaseServiceRepository;
import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.services.ServiceEntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.EntityUtil;
import org.openmetadata.service.util.JsonUtils;
@ -80,14 +79,8 @@ public class DatabaseServiceResource
return service;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public DatabaseServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(
DatabaseService.class,
new DatabaseServiceRepository(dao, secretsManager),
authorizer,
secretsManager,
ServiceType.DATABASE);
public DatabaseServiceResource(CollectionDAO dao, Authorizer authorizer) {
super(DatabaseService.class, new DatabaseServiceRepository(dao), authorizer, ServiceType.DATABASE);
}
public static class DatabaseServiceList extends ResultList<DatabaseService> {

View File

@ -51,7 +51,6 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.api.services.ingestionPipelines.CreateIngestionPipeline;
import org.openmetadata.schema.api.services.ingestionPipelines.TestServiceConnection;
@ -69,6 +68,7 @@ import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.EntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.AuthorizationException;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.security.policyevaluator.OperationContext;
@ -87,9 +87,6 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
public static final String COLLECTION_PATH = "v1/services/ingestionPipelines/";
private PipelineServiceClient pipelineServiceClient;
private OpenMetadataApplicationConfig openMetadataApplicationConfig;
private final SecretsManager secretsManager;
@Getter private final IngestionPipelineRepository ingestionPipelineRepository;
@Override
public IngestionPipeline addHref(UriInfo uriInfo, IngestionPipeline ingestionPipeline) {
@ -98,11 +95,8 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
return ingestionPipeline;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public IngestionPipelineResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(IngestionPipeline.class, new IngestionPipelineRepository(dao, secretsManager), authorizer);
this.secretsManager = secretsManager;
this.ingestionPipelineRepository = new IngestionPipelineRepository(dao, secretsManager);
public IngestionPipelineResource(CollectionDAO dao, Authorizer authorizer) {
super(IngestionPipeline.class, new IngestionPipelineRepository(dao), authorizer);
}
public void initialize(OpenMetadataApplicationConfig config) {
@ -404,7 +398,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
Fields fields = getFields(FIELD_OWNER);
IngestionPipeline ingestionPipeline = dao.get(uriInfo, id, fields);
ingestionPipeline.setOpenMetadataServerConnection(
new OpenMetadataServerConnectionBuilder(secretsManager, openMetadataApplicationConfig).build());
new OpenMetadataServerConnectionBuilder(openMetadataApplicationConfig).build());
pipelineServiceClient.deployPipeline(ingestionPipeline);
decryptOrNullify(securityContext, ingestionPipeline);
return addHref(uriInfo, ingestionPipeline);
@ -498,6 +492,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
@Context UriInfo uriInfo,
@Context SecurityContext securityContext,
@Valid TestServiceConnection testServiceConnection) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
testServiceConnection =
testServiceConnection
.withConnection(secretsManager.storeTestConnectionObject(testServiceConnection))
@ -590,7 +585,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
private IngestionPipeline getIngestionPipeline(CreateIngestionPipeline create, String user) throws IOException {
OpenMetadataServerConnection openMetadataServerConnection =
new OpenMetadataServerConnectionBuilder(secretsManager, openMetadataApplicationConfig).build();
new OpenMetadataServerConnectionBuilder(openMetadataApplicationConfig).build();
return copy(new IngestionPipeline(), create, user)
.withPipelineType(create.getPipelineType())
.withAirflowConfig(create.getAirflowConfig())
@ -614,6 +609,7 @@ public class IngestionPipelineResource extends EntityResource<IngestionPipeline,
}
private IngestionPipeline decryptOrNullify(SecurityContext securityContext, IngestionPipeline ingestionPipeline) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
try {
authorizer.authorize(
securityContext,

View File

@ -55,7 +55,6 @@ import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.jdbi3.MessagingServiceRepository;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.services.ServiceEntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.RestUtil;
@ -79,14 +78,8 @@ public class MessagingServiceResource
return service;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public MessagingServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(
MessagingService.class,
new MessagingServiceRepository(dao, secretsManager),
authorizer,
secretsManager,
ServiceType.MESSAGING);
public MessagingServiceResource(CollectionDAO dao, Authorizer authorizer) {
super(MessagingService.class, new MessagingServiceRepository(dao), authorizer, ServiceType.MESSAGING);
}
public static class MessagingServiceList extends ResultList<MessagingService> {

View File

@ -53,7 +53,6 @@ import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.jdbi3.MlModelServiceRepository;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.services.ServiceEntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.RestUtil;
@ -78,14 +77,8 @@ public class MlModelServiceResource
return service;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public MlModelServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(
MlModelService.class,
new MlModelServiceRepository(dao, secretsManager),
authorizer,
secretsManager,
ServiceType.ML_MODEL);
public MlModelServiceResource(CollectionDAO dao, Authorizer authorizer) {
super(MlModelService.class, new MlModelServiceRepository(dao), authorizer, ServiceType.ML_MODEL);
}
public static class MlModelServiceList extends ResultList<MlModelService> {

View File

@ -53,7 +53,6 @@ import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.jdbi3.PipelineServiceRepository;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.services.ServiceEntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.RestUtil;
@ -77,14 +76,8 @@ public class PipelineServiceResource
return service;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM)
public PipelineServiceResource(CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager) {
super(
PipelineService.class,
new PipelineServiceRepository(dao, secretsManager),
authorizer,
secretsManager,
ServiceType.PIPELINE);
public PipelineServiceResource(CollectionDAO dao, Authorizer authorizer) {
super(PipelineService.class, new PipelineServiceRepository(dao), authorizer, ServiceType.PIPELINE);
}
public static class PipelineServiceList extends ResultList<PipelineService> {

View File

@ -73,7 +73,6 @@ public class StorageServiceResource extends EntityResource<StorageService, Stora
return service;
}
@Collection
public StorageServiceResource(CollectionDAO dao, Authorizer authorizer) {
super(StorageService.class, new StorageServiceRepository(dao), authorizer);
}

View File

@ -120,7 +120,6 @@ public class SettingsResource {
}
}
@Collection
public SettingsResource(CollectionDAO dao, Authorizer authorizer) {
Objects.requireNonNull(dao, "SettingsRepository must not be null");
this.settingsRepository = new SettingsRepository(dao);

View File

@ -86,7 +86,6 @@ public class TagResource {
}
}
@Collection
public TagResource(CollectionDAO collectionDAO, Authorizer authorizer) {
Objects.requireNonNull(collectionDAO, "TagRepository must not be null");
this.dao = new TagRepository(collectionDAO);
@ -94,7 +93,7 @@ public class TagResource {
this.authorizer = authorizer;
}
@SuppressWarnings("unused") // Method used for reflection
@SuppressWarnings("unused") // Method used by reflection
public void initialize(OpenMetadataApplicationConfig config) throws IOException {
// Find tag definitions and load tag categories from the json file, if necessary
List<String> tagFiles = EntityUtil.getJsonDataResources(".*json/data/tags/.*\\.json$");

View File

@ -86,7 +86,6 @@ public class RoleResource extends EntityResource<Role, RoleRepository> {
return role;
}
@Collection
public RoleResource(CollectionDAO collectionDAO, Authorizer authorizer) {
super(Role.class, new RoleRepository(collectionDAO), authorizer);
}

View File

@ -87,7 +87,6 @@ public class TeamResource extends EntityResource<Team, TeamRepository> {
return team;
}
@Collection
public TeamResource(CollectionDAO dao, Authorizer authorizer) {
super(Team.class, new TeamRepository(dao), authorizer);
}

View File

@ -47,7 +47,6 @@ import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
@ -77,7 +76,6 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;
@ -120,6 +118,7 @@ import org.openmetadata.service.jdbi3.UserRepository;
import org.openmetadata.service.resources.Collection;
import org.openmetadata.service.resources.EntityResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.AuthorizationException;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.security.auth.LoginAttemptCache;
@ -147,14 +146,12 @@ public class UserResource extends EntityResource<User, UserRepository> {
public static final String USER_PROTECTED_FIELDS = "authenticationMechanism";
private final JWTTokenGenerator jwtTokenGenerator;
private final TokenRepository tokenRepository;
@Getter private final UserRepository userRepository;
private final SecretsManager secretsManager;
private final boolean isEmailServiceEnabled;
private final LoginAttemptCache loginAttemptCache;
private boolean isEmailServiceEnabled;
private LoginAttemptCache loginAttemptCache;
private final AuthenticationConfiguration authenticationConfiguration;
private AuthenticationConfiguration authenticationConfiguration;
private final AuthorizerConfiguration authorizerConfiguration;
private AuthorizerConfiguration authorizerConfiguration;
@Override
public User addHref(UriInfo uriInfo, User user) {
@ -166,15 +163,14 @@ public class UserResource extends EntityResource<User, UserRepository> {
return user;
}
@Collection(constructorType = Collection.ConstructorType.DAO_AUTH_SM_CONFIG)
public UserResource(
CollectionDAO dao, Authorizer authorizer, SecretsManager secretsManager, OpenMetadataApplicationConfig config) {
super(User.class, new UserRepository(dao, secretsManager), authorizer);
public UserResource(CollectionDAO dao, Authorizer authorizer) {
super(User.class, new UserRepository(dao), authorizer);
jwtTokenGenerator = JWTTokenGenerator.getInstance();
allowedFields.remove(USER_PROTECTED_FIELDS);
tokenRepository = new TokenRepository(dao);
userRepository = new UserRepository(dao, secretsManager);
this.secretsManager = secretsManager;
}
public void initialize(OpenMetadataApplicationConfig config) throws IOException {
this.authenticationConfiguration = config.getAuthenticationConfiguration();
this.authorizerConfiguration = config.getAuthorizerConfiguration();
SmtpSettings smtpSettings = config.getSmtpSettings();
@ -1220,8 +1216,7 @@ public class UserResource extends EntityResource<User, UserRepository> {
if (emailVerificationToken == null) {
throw new EntityNotFoundException("Invalid Token. Please issue a new Request");
}
User registeredUser =
dao.get(uriInfo, emailVerificationToken.getUserId(), userRepository.getFieldsWithUserAuth("*"));
User registeredUser = dao.get(uriInfo, emailVerificationToken.getUserId(), dao.getFieldsWithUserAuth("*"));
if (Boolean.TRUE.equals(registeredUser.getIsEmailVerified())) {
LOG.info("User [{}] already registered.", emailToken);
return;
@ -1243,22 +1238,6 @@ public class UserResource extends EntityResource<User, UserRepository> {
tokenRepository.deleteTokenByUserAndType(registeredUser.getId().toString(), EMAIL_VERIFICATION.toString());
}
public User extendRegistrationToken(UriInfo uriInfo, String existingToken) throws IOException {
EmailVerificationToken emailVerificationToken = (EmailVerificationToken) tokenRepository.findByToken(existingToken);
User registeredUser = dao.get(uriInfo, emailVerificationToken.getUserId(), getFields("isEmailVerified"));
if (Boolean.TRUE.equals(registeredUser.getIsEmailVerified())) {
// no need to do anything
return registeredUser;
}
// Update token with new Expiry and Status
emailVerificationToken.setTokenStatus(EmailVerificationToken.TokenStatus.STATUS_PENDING);
emailVerificationToken.setExpiryDate(Instant.now().plus(24, ChronoUnit.HOURS).toEpochMilli());
// Update the token details in Database
tokenRepository.updateToken(emailVerificationToken);
return registeredUser;
}
private void sendEmailVerification(UriInfo uriInfo, User user) throws IOException, TemplateException {
UUID mailVerificationToken = UUID.randomUUID();
EmailVerificationToken emailVerificationToken =
@ -1500,6 +1479,7 @@ public class UserResource extends EntityResource<User, UserRepository> {
if (isValidAuthenticationMechanism(create)) {
AuthenticationMechanism authMechanism = create.getAuthenticationMechanism();
AuthenticationMechanism.AuthType authType = authMechanism.getAuthType();
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
switch (authType) {
case JWT:
User original = retrieveBotUser(user, uriInfo);
@ -1578,6 +1558,7 @@ public class UserResource extends EntityResource<User, UserRepository> {
}
private User decryptOrNullify(SecurityContext securityContext, User user) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (Boolean.TRUE.equals(user.getIsBot()) && user.getAuthenticationMechanism() != null) {
try {
authorizer.authorize(

View File

@ -78,7 +78,6 @@ public class TopicResource extends EntityResource<Topic, TopicRepository> {
}
@Inject
@Collection
public TopicResource(CollectionDAO dao, Authorizer authorizer) {
super(Topic.class, new TopicRepository(dao), authorizer);
}

View File

@ -85,7 +85,6 @@ public class TypeResource extends EntityResource<Type, TypeRepository> {
}
@Inject
@Collection
public TypeResource(CollectionDAO dao, Authorizer authorizer) {
super(Type.class, new TypeRepository(dao), authorizer);
}

View File

@ -56,7 +56,6 @@ public class UsageResource {
private final UsageRepository dao;
@Inject
@Collection
public UsageResource(CollectionDAO dao, Authorizer authorizer) {
Objects.requireNonNull(dao, "UsageRepository must not be null");
this.dao = new UsageRepository(dao);

View File

@ -32,7 +32,6 @@ public class UtilResource {
private final UtilRepository utilRepository;
private final Authorizer authorizer;
@Collection
public UtilResource(CollectionDAO dao, Authorizer authorizer) {
Objects.requireNonNull(dao, "UtilRepository must not be null");
this.utilRepository = new UtilRepository(dao.utilDAO());

View File

@ -24,11 +24,10 @@ public class InMemorySecretsManager extends ThirdPartySecretsManager {
private static InMemorySecretsManager INSTANCE;
@Getter private final Map<String, String> secretsMap;
@Getter private final Map<String, String> secretsMap = new HashMap<>();
protected InMemorySecretsManager(SecretsManagerProvider secretsManagerProvider, String clusterPrefix) {
super(secretsManagerProvider, clusterPrefix);
secretsMap = new HashMap<>();
}
public static InMemorySecretsManager getInstance(String clusterPrefix) {

View File

@ -13,28 +13,45 @@
package org.openmetadata.service.secrets;
import com.google.common.annotations.VisibleForTesting;
import lombok.Getter;
import org.openmetadata.schema.services.connections.metadata.SecretsManagerProvider;
public class SecretsManagerFactory {
@Getter private static SecretsManager secretsManager;
private SecretsManagerFactory() {}
/** Expected to be called only once when the Application starts */
public static SecretsManager createSecretsManager(SecretsManagerConfiguration config, String clusterName) {
SecretsManagerProvider secretManager =
if (secretsManager != null) {
return secretsManager;
}
SecretsManagerProvider secretsManagerProvider =
config != null && config.getSecretsManager() != null
? config.getSecretsManager()
: SecretsManagerConfiguration.DEFAULT_SECRET_MANAGER;
switch (secretManager) {
switch (secretsManagerProvider) {
case NOOP:
return NoopSecretsManager.getInstance(clusterName);
secretsManager = NoopSecretsManager.getInstance(clusterName);
break;
case AWS:
return AWSSecretsManager.getInstance(config, clusterName);
secretsManager = AWSSecretsManager.getInstance(config, clusterName);
break;
case AWS_SSM:
return AWSSSMSecretsManager.getInstance(config, clusterName);
secretsManager = AWSSSMSecretsManager.getInstance(config, clusterName);
break;
case IN_MEMORY:
return InMemorySecretsManager.getInstance(clusterName);
secretsManager = InMemorySecretsManager.getInstance(clusterName);
break;
default:
throw new IllegalArgumentException("Not implemented secret manager store: " + secretManager);
throw new IllegalArgumentException("Not implemented secret manager store: " + secretsManagerProvider);
}
return secretsManager;
}
@VisibleForTesting
public static void setSecretsManager(SecretsManager secretsManager) {
SecretsManagerFactory.secretsManager = secretsManager;
}
}

View File

@ -30,15 +30,13 @@ import org.openmetadata.schema.entity.teams.User;
import org.openmetadata.service.Entity;
import org.openmetadata.service.exception.SecretsManagerMigrationException;
import org.openmetadata.service.jdbi3.ChangeEventRepository;
import org.openmetadata.service.jdbi3.IngestionPipelineRepository;
import org.openmetadata.service.jdbi3.EntityRepository;
import org.openmetadata.service.jdbi3.ListFilter;
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
import org.openmetadata.service.jdbi3.UserRepository;
import org.openmetadata.service.resources.CollectionRegistry;
import org.openmetadata.service.resources.CollectionRegistry.CollectionDetails;
import org.openmetadata.service.resources.events.EventResource;
import org.openmetadata.service.resources.services.ServiceEntityResource;
import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResource;
import org.openmetadata.service.resources.teams.UserResource;
import org.openmetadata.service.util.EntityUtil;
/**
@ -64,16 +62,16 @@ public class SecretsManagerMigrationService {
private final ChangeEventRepository changeEventRepository;
private final IngestionPipelineRepository ingestionPipelineRepository;
private final EntityRepository<IngestionPipeline> ingestionPipelineRepository;
private final UserRepository userRepository;
private final EntityRepository<User> userRepository;
public SecretsManagerMigrationService(SecretsManager secretsManager, String clusterName) {
this.newSecretManager = secretsManager;
this.connectionTypeRepositoriesMap = retrieveConnectionTypeRepositoriesMap();
this.changeEventRepository = retrieveChangeEventRepository();
this.ingestionPipelineRepository = retrieveIngestionPipelineRepository();
this.userRepository = retrieveUserRepository();
this.ingestionPipelineRepository = Entity.getEntityRepository(Entity.INGESTION_PIPELINE);
this.userRepository = Entity.getEntityRepository(Entity.USER);
// by default, it is going to be LOCAL
this.oldSecretManager = SecretsManagerFactory.createSecretsManager(null, clusterName);
}
@ -332,27 +330,7 @@ public class SecretsManagerMigrationService {
.orElseThrow(() -> new SecretsManagerMigrationException("Unexpected error: ChangeEventRepository not found."));
}
private UserRepository retrieveUserRepository() {
return CollectionRegistry.getInstance().getCollectionMap().values().stream()
.map(collectionDetails -> retrieveResource(collectionDetails, UserResource.class))
.filter(Optional::isPresent)
.map(res -> res.get().getUserRepository())
.findFirst()
.orElseThrow(
() -> new SecretsManagerMigrationException("Unexpected error: IngestionPipelineRepository not found."));
}
private IngestionPipelineRepository retrieveIngestionPipelineRepository() {
return CollectionRegistry.getInstance().getCollectionMap().values().stream()
.map(collectionDetails -> retrieveResource(collectionDetails, IngestionPipelineResource.class))
.filter(Optional::isPresent)
.map(res -> res.get().getIngestionPipelineRepository())
.findFirst()
.orElseThrow(
() -> new SecretsManagerMigrationException("Unexpected error: IngestionPipelineRepository not found."));
}
private <T> Optional<T> retrieveResource(CollectionRegistry.CollectionDetails collectionDetails, Class<T> clazz) {
private <T> Optional<T> retrieveResource(CollectionDetails collectionDetails, Class<T> clazz) {
Class<?> collectionDetailsClass = extractCollectionDetailsClass(collectionDetails);
if (clazz.equals(collectionDetailsClass)) {
return Optional.of(clazz.cast(collectionDetails.getResource()));
@ -360,8 +338,7 @@ public class SecretsManagerMigrationService {
return Optional.empty();
}
private Optional<ServiceEntityRepository<?, ?>> retrieveServiceRepository(
CollectionRegistry.CollectionDetails collectionDetails) {
private Optional<ServiceEntityRepository<?, ?>> retrieveServiceRepository(CollectionDetails collectionDetails) {
Class<?> collectionDetailsClass = extractCollectionDetailsClass(collectionDetails);
if (ServiceEntityResource.class.isAssignableFrom(collectionDetailsClass)) {
return Optional.of(
@ -370,7 +347,7 @@ public class SecretsManagerMigrationService {
return Optional.empty();
}
private Class<?> extractCollectionDetailsClass(CollectionRegistry.CollectionDetails collectionDetails) {
private Class<?> extractCollectionDetailsClass(CollectionDetails collectionDetails) {
Class<?> collectionDetailsClass;
try {
collectionDetailsClass = Class.forName(collectionDetails.getResourceClass());

View File

@ -82,7 +82,6 @@ public class DefaultAuthorizer implements Authorizer {
private Set<String> botPrincipalUsers;
private Set<String> testUsers;
private String principalDomain;
private SecretsManager secretsManager;
private String providerType;
@ -95,10 +94,6 @@ public class DefaultAuthorizer implements Authorizer {
new HashSet<>(openMetadataApplicationConfig.getAuthorizerConfiguration().getBotPrincipals());
this.testUsers = new HashSet<>(openMetadataApplicationConfig.getAuthorizerConfiguration().getTestPrincipals());
this.principalDomain = openMetadataApplicationConfig.getAuthorizerConfiguration().getPrincipalDomain();
this.secretsManager =
SecretsManagerFactory.createSecretsManager(
openMetadataApplicationConfig.getSecretsManagerConfiguration(),
openMetadataApplicationConfig.getClusterName());
this.providerType = openMetadataApplicationConfig.getAuthenticationConfiguration().getProvider();
SubjectCache.initialize();
PolicyCache.initialize();
@ -413,6 +408,7 @@ public class DefaultAuthorizer implements Authorizer {
User originalUser =
userRepository.getByName(null, user.getName(), new EntityUtil.Fields(List.of("authenticationMechanism")));
AuthenticationMechanism authMechanism = originalUser.getAuthenticationMechanism();
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (authMechanism != null) {
Object config =
secretsManager.encryptOrDecryptBotUserCredentials(user.getName(), authMechanism.getConfig(), false);

View File

@ -20,6 +20,7 @@ import org.openmetadata.service.exception.EntityNotFoundException;
import org.openmetadata.service.jdbi3.BotRepository;
import org.openmetadata.service.jdbi3.UserRepository;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.util.EntityUtil.Fields;
@Slf4j
@ -35,11 +36,8 @@ public class OpenMetadataServerConnectionBuilder {
private final Object airflowSSLConfig;
BotRepository botRepository;
UserRepository userRepository;
private final SecretsManager secretsManager;
public OpenMetadataServerConnectionBuilder(
SecretsManager secretsManager, OpenMetadataApplicationConfig openMetadataApplicationConfig) {
this.secretsManager = secretsManager;
public OpenMetadataServerConnectionBuilder(OpenMetadataApplicationConfig openMetadataApplicationConfig) {
// TODO: https://github.com/open-metadata/OpenMetadata/issues/7712
authProvider =
"basic".equals(openMetadataApplicationConfig.getAuthenticationConfiguration().getProvider())
@ -47,6 +45,7 @@ public class OpenMetadataServerConnectionBuilder {
: OpenMetadataServerConnection.AuthProvider.fromValue(
openMetadataApplicationConfig.getAuthenticationConfiguration().getProvider());
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
if (!OpenMetadataServerConnection.AuthProvider.NO_AUTH.equals(authProvider)) {
botRepository = BotRepository.class.cast(Entity.getEntityRepository(Entity.BOT));
userRepository = UserRepository.class.cast(Entity.getEntityRepository(Entity.USER));
@ -118,6 +117,7 @@ public class OpenMetadataServerConnectionBuilder {
}
private User retrieveIngestionBotUser(String botName) {
SecretsManager secretsManager = SecretsManagerFactory.getSecretsManager();
try {
Bot bot1 = botRepository.getByName(null, botName, Fields.EMPTY_FIELDS);
if (bot1.getBotUser() == null) {

View File

@ -56,7 +56,6 @@ import org.openmetadata.service.fernet.Fernet;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.UserRepository;
import org.openmetadata.service.jdbi3.locator.ConnectionAwareAnnotationSqlLocator;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.jwt.JWTTokenGenerator;
@ -246,6 +245,10 @@ public final class TablesInitializer {
jdbi.getConfig(SqlObjects.class)
.setSqlLocator(new ConnectionAwareAnnotationSqlLocator(config.getDataSourceFactory().getDriverClass()));
ElasticSearchIndexDefinition esIndexDefinition;
// Initialize secrets manager
SecretsManagerFactory.createSecretsManager(config.getSecretsManagerConfiguration(), config.getClusterName());
switch (schemaMigrationOption) {
case CREATE:
try (Connection connection = flyway.getConfiguration().getDataSource().getConnection()) {
@ -356,7 +359,7 @@ public final class TablesInitializer {
user.setAuthenticationMechanism(authenticationMechanism);
}
try {
addOrUpdateUser(user, jdbi, config);
addOrUpdateUser(user, jdbi);
if (jwtAuthMechanism != null) {
printToConsoleMandatory(JsonUtils.pojoToJson(user));
}
@ -394,9 +397,7 @@ public final class TablesInitializer {
}
try {
CollectionDAO daoObject = jdbi.onDemand(CollectionDAO.class);
SecretsManager secretsManager =
SecretsManagerFactory.createSecretsManager(config.getSecretsManagerConfiguration(), config.getClusterName());
UserRepository userRepository = new UserRepository(daoObject, secretsManager);
UserRepository userRepository = new UserRepository(daoObject);
RestUtil.PutResponse<User> addedUser = userRepository.createOrUpdate(null, user);
printToConsoleInDebug("Updated user entry: " + addedUser.getEntity());
if (jwtAuthMechanism != null) {
@ -407,11 +408,9 @@ public final class TablesInitializer {
}
}
private static void addOrUpdateUser(User user, Jdbi jdbi, OpenMetadataApplicationConfig config) throws Exception {
private static void addOrUpdateUser(User user, Jdbi jdbi) throws Exception {
CollectionDAO daoObject = jdbi.onDemand(CollectionDAO.class);
SecretsManager secretsManager =
SecretsManagerFactory.createSecretsManager(config.getSecretsManagerConfiguration(), config.getClusterName());
UserRepository userRepository = new UserRepository(daoObject, secretsManager);
UserRepository userRepository = new UserRepository(daoObject);
User addedUser = userRepository.create(null, user);
printToConsoleInDebug("Added user entry: " + addedUser.getName());
}

View File

@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.DashboardService;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.schema.type.DashboardConnection;
import org.openmetadata.service.secrets.SecretsManager;
public class DashboardServiceRepositoryUnitTest
extends ServiceEntityRepositoryTest<DashboardServiceRepository, DashboardService, DashboardConnection> {
@ -32,9 +31,8 @@ public class DashboardServiceRepositoryUnitTest
}
@Override
protected DashboardServiceRepository newServiceRepository(
CollectionDAO collectionDAO, SecretsManager secretsManager) {
return new DashboardServiceRepository(collectionDAO, secretsManager);
protected DashboardServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
return new DashboardServiceRepository(collectionDAO);
}
@Override

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.ServiceType;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.service.secrets.SecretsManager;
public class DatabaseServiceRepositoryUnitTest
extends ServiceEntityRepositoryTest<DatabaseServiceRepository, DatabaseService, DatabaseConnection> {
@ -32,8 +31,8 @@ public class DatabaseServiceRepositoryUnitTest
}
@Override
protected DatabaseServiceRepository newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager) {
return new DatabaseServiceRepository(collectionDAO, secretsManager);
protected DatabaseServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
return new DatabaseServiceRepository(collectionDAO);
}
@Override

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.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ -37,6 +36,7 @@ import org.openmetadata.schema.metadataIngestion.SourceConfig;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.service.Entity;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
@ExtendWith(MockitoExtension.class)
public class IngestionPipelineRepositoryUnitTest {
@ -50,14 +50,15 @@ public class IngestionPipelineRepositoryUnitTest {
protected IngestionPipelineRepository ingestionPipelineRepository;
@BeforeEach
void beforeEach() {
void before() {
SecretsManagerFactory.setSecretsManager(secretsManager);
when(collectionDAO.ingestionPipelineDAO()).thenReturn(dao);
ingestionPipelineRepository = new IngestionPipelineRepository(collectionDAO, secretsManager);
ingestionPipelineRepository = new IngestionPipelineRepository(collectionDAO);
}
@AfterEach
void afterEach() {
reset(secretsManager);
void after() {
SecretsManagerFactory.setSecretsManager(null);
}
@Test

View File

@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.MessagingService;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.schema.type.MessagingConnection;
import org.openmetadata.service.secrets.SecretsManager;
public class MessagingServiceRepositoryUnitTest
extends ServiceEntityRepositoryTest<MessagingServiceRepository, MessagingService, MessagingConnection> {
@ -32,9 +31,8 @@ public class MessagingServiceRepositoryUnitTest
}
@Override
protected MessagingServiceRepository newServiceRepository(
CollectionDAO collectionDAO, SecretsManager secretsManager) {
return new MessagingServiceRepository(collectionDAO, secretsManager);
protected MessagingServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
return new MessagingServiceRepository(collectionDAO);
}
@Override

View File

@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.MlModelService;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.schema.type.MlModelConnection;
import org.openmetadata.service.secrets.SecretsManager;
public class MlModelServiceRepositoryUnitTest
extends ServiceEntityRepositoryTest<MlModelServiceRepository, MlModelService, MlModelConnection> {
@ -32,8 +31,8 @@ public class MlModelServiceRepositoryUnitTest
}
@Override
protected MlModelServiceRepository newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager) {
return new MlModelServiceRepository(collectionDAO, secretsManager);
protected MlModelServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
return new MlModelServiceRepository(collectionDAO);
}
@Override

View File

@ -22,7 +22,6 @@ import org.openmetadata.schema.entity.services.PipelineService;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.schema.type.PipelineConnection;
import org.openmetadata.service.secrets.SecretsManager;
public class PipelineServiceRepositoryUnitTest
extends ServiceEntityRepositoryTest<PipelineServiceRepository, PipelineService, PipelineConnection> {
@ -32,8 +31,8 @@ public class PipelineServiceRepositoryUnitTest
}
@Override
protected PipelineServiceRepository newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager) {
return new PipelineServiceRepository(collectionDAO, secretsManager);
protected PipelineServiceRepository newServiceRepository(CollectionDAO collectionDAO) {
return new PipelineServiceRepository(collectionDAO);
}
@Override

View File

@ -34,6 +34,7 @@ import org.openmetadata.schema.ServiceConnectionEntityInterface;
import org.openmetadata.schema.ServiceEntityInterface;
import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
@ExtendWith(MockitoExtension.class)
public abstract class ServiceEntityRepositoryTest<
@ -59,16 +60,18 @@ public abstract class ServiceEntityRepositoryTest<
@BeforeEach
void beforeEach() {
SecretsManagerFactory.setSecretsManager(secretsManager);
mockServiceResourceSpecific();
serviceRepository = newServiceRepository(collectionDAO, secretsManager);
serviceRepository = newServiceRepository(collectionDAO);
}
@AfterEach
void afterEach() {
reset(secretsManager, service);
SecretsManagerFactory.setSecretsManager(null);
}
protected abstract T newServiceRepository(CollectionDAO collectionDAO, SecretsManager secretsManager);
protected abstract T newServiceRepository(CollectionDAO collectionDAO);
protected abstract void mockServiceResourceSpecific();

View File

@ -34,7 +34,6 @@ import org.openmetadata.schema.type.Include;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.DashboardServiceRepository;
import org.openmetadata.service.resources.services.dashboard.DashboardServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
public class DashboardServiceResourceUnitTest
@ -42,9 +41,8 @@ public class DashboardServiceResourceUnitTest
DashboardServiceResource, DashboardService, DashboardServiceRepository, DashboardConnection> {
@Override
protected DashboardServiceResource newServiceResource(
CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
return new DashboardServiceResource(collectionDAO, authorizer, secretsManager);
protected DashboardServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
return new DashboardServiceResource(collectionDAO, authorizer);
}
@Override

View File

@ -34,7 +34,6 @@ import org.openmetadata.schema.type.Include;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.DatabaseServiceRepository;
import org.openmetadata.service.resources.services.database.DatabaseServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
public class DatabaseServiceResourceUnitTest
@ -42,9 +41,8 @@ public class DatabaseServiceResourceUnitTest
DatabaseServiceResource, DatabaseService, DatabaseServiceRepository, DatabaseConnection> {
@Override
protected DatabaseServiceResource newServiceResource(
CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
return new DatabaseServiceResource(collectionDAO, authorizer, secretsManager);
protected DatabaseServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
return new DatabaseServiceResource(collectionDAO, authorizer);
}
@Override

View File

@ -34,7 +34,6 @@ import org.openmetadata.schema.type.MessagingConnection;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.MessagingServiceRepository;
import org.openmetadata.service.resources.services.messaging.MessagingServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
public class MessagingServiceResourceUnitTest
@ -42,9 +41,8 @@ public class MessagingServiceResourceUnitTest
MessagingServiceResource, MessagingService, MessagingServiceRepository, MessagingConnection> {
@Override
protected MessagingServiceResource newServiceResource(
CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
return new MessagingServiceResource(collectionDAO, authorizer, secretsManager);
protected MessagingServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
return new MessagingServiceResource(collectionDAO, authorizer);
}
@Override

View File

@ -36,7 +36,6 @@ import org.openmetadata.schema.type.MlModelConnection;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.MlModelServiceRepository;
import org.openmetadata.service.resources.services.mlmodel.MlModelServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
@ExtendWith(MockitoExtension.class)
@ -44,9 +43,8 @@ public class MlModelServiceResourceUnitTest
extends ServiceResourceTest<MlModelServiceResource, MlModelService, MlModelServiceRepository, MlModelConnection> {
@Override
protected MlModelServiceResource newServiceResource(
CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
return new MlModelServiceResource(collectionDAO, authorizer, secretsManager);
protected MlModelServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
return new MlModelServiceResource(collectionDAO, authorizer);
}
@Override

View File

@ -36,7 +36,6 @@ import org.openmetadata.schema.type.PipelineConnection;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.PipelineServiceRepository;
import org.openmetadata.service.resources.services.pipeline.PipelineServiceResource;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.security.Authorizer;
@ExtendWith(MockitoExtension.class)
@ -45,9 +44,8 @@ public class PipelineServiceResourceUnitTest
PipelineServiceResource, PipelineService, PipelineServiceRepository, PipelineConnection> {
@Override
protected PipelineServiceResource newServiceResource(
CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager) {
return new PipelineServiceResource(collectionDAO, authorizer, secretsManager);
protected PipelineServiceResource newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer) {
return new PipelineServiceResource(collectionDAO, authorizer);
}
@Override

View File

@ -28,6 +28,7 @@ import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.UUID;
import javax.ws.rs.core.SecurityContext;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
@ -40,6 +41,7 @@ import org.openmetadata.schema.entity.services.ServiceType;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.ServiceEntityRepository;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.AuthorizationException;
import org.openmetadata.service.security.Authorizer;
@ -66,6 +68,7 @@ public abstract class ServiceResourceTest<
@BeforeEach
void beforeEach() throws IOException {
SecretsManagerFactory.setSecretsManager(secretsManager);
mockServiceResourceSpecific();
when(collectionDAO.relationshipDAO()).thenReturn(mock(CollectionDAO.EntityRelationshipDAO.class));
when(service.getId()).thenReturn(UUID.randomUUID());
@ -75,13 +78,17 @@ public abstract class ServiceResourceTest<
secretsManager.encryptOrDecryptServiceConnectionConfig(
any(), anyString(), any(), any(ServiceType.class), anyBoolean()))
.thenReturn(serviceConnectionConfig);
serviceResource = newServiceResource(collectionDAO, authorizer, secretsManager);
serviceResource = newServiceResource(collectionDAO, authorizer);
}
@AfterEach
void afterEach() {
SecretsManagerFactory.setSecretsManager(null);
}
protected abstract void mockServiceResourceSpecific() throws IOException;
protected abstract T newServiceResource(
CollectionDAO collectionDAO, Authorizer authorizer, SecretsManager secretsManager);
protected abstract T newServiceResource(CollectionDAO collectionDAO, Authorizer authorizer);
@ParameterizedTest
@CsvSource({

View File

@ -35,6 +35,7 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.ws.rs.core.SecurityContext;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ -58,6 +59,7 @@ import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.EntityDAO;
import org.openmetadata.service.jdbi3.EntityRepository;
import org.openmetadata.service.secrets.SecretsManager;
import org.openmetadata.service.secrets.SecretsManagerFactory;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.util.PipelineServiceClient;
@ -93,7 +95,13 @@ public class IngestionPipelineResourceUnitTest {
lenient().when(relationshipDAO.findFrom(any(), any(), anyInt())).thenReturn(List.of(entityRelationshipRecord));
when(collectionDAO.ingestionPipelineDAO()).thenReturn(entityDAO);
lenient().when(collectionDAO.relationshipDAO()).thenReturn(relationshipDAO);
ingestionPipelineResource = new IngestionPipelineResource(collectionDAO, authorizer, secretsManager);
ingestionPipelineResource = new IngestionPipelineResource(collectionDAO, authorizer);
SecretsManagerFactory.setSecretsManager(secretsManager);
}
@AfterEach
void afterEach() {
SecretsManagerFactory.setSecretsManager(null);
}
@Test