Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MINOR - Prepare App Instances & fix bigtable json #15292

Merged
merged 8 commits into from
Feb 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.openmetadata.service.apps;

import javax.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;

public class AppException extends WebServiceException {

private static final String BY_NAME_MESSAGE = "Application [%s] Exception [%s] due to [%s].";
private static final String ERROR_TYPE = "PIPELINE_SERVICE_ERROR";

public AppException(String message) {
super(Response.Status.BAD_REQUEST, ERROR_TYPE, message);
}

private AppException(Response.Status status, String message) {
super(status, ERROR_TYPE, message);
}

public static AppException byMessage(
String appName, String name, String errorMessage, Response.Status status) {
return new AppException(status, buildMessageByName(appName, name, errorMessage));
}

public static AppException byMessage(String appName, String name, String errorMessage) {
return new AppException(
Response.Status.BAD_REQUEST, buildMessageByName(appName, name, errorMessage));
}

private static String buildMessageByName(String appName, String name, String errorMessage) {
return String.format(BY_NAME_MESSAGE, appName, name, errorMessage);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.entity.app.App;
import org.openmetadata.service.exception.UnhandledServerException;
Expand All @@ -11,6 +12,12 @@
@Slf4j
public class ApplicationHandler {

private static HashMap<String, Object> instances = new HashMap<>();

public static Object getAppInstance(String className) {
return instances.get(className);
}

private ApplicationHandler() {
/*Helper*/
}
Expand All @@ -30,19 +37,36 @@ public static void configureApplication(
runMethodFromApplication(app, daoCollection, searchRepository, "configure");
}

public static Object runAppInit(
App app, CollectionDAO daoCollection, SearchRepository searchRepository)
throws ClassNotFoundException,
NoSuchMethodException,
InvocationTargetException,
InstantiationException,
IllegalAccessException {
Class<?> clz = Class.forName(app.getClassName());
Object resource =
clz.getDeclaredConstructor(CollectionDAO.class, SearchRepository.class)
.newInstance(daoCollection, searchRepository);

// Call init Method
Method initMethod = resource.getClass().getMethod("init", App.class);
initMethod.invoke(resource, app);

instances.put(app.getClassName(), resource);

return resource;
}

/** Load an App from its className and call its methods dynamically */
public static void runMethodFromApplication(
App app, CollectionDAO daoCollection, SearchRepository searchRepository, String methodName) {
// Native Application
try {
Class<?> clz = Class.forName(app.getClassName());
Object resource =
clz.getDeclaredConstructor(CollectionDAO.class, SearchRepository.class)
.newInstance(daoCollection, searchRepository);

// Call init Method
Method initMethod = resource.getClass().getMethod("init", App.class);
initMethod.invoke(resource, app);
Object resource = getAppInstance(app.getClassName());
if (resource == null) {
resource = runAppInit(app, daoCollection, searchRepository);
}

// Call method on demand
Method scheduleMethod = resource.getClass().getMethod(methodName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,12 +164,12 @@ public void storeRelationships(App entity) {
}
}

public final List<AppRunRecord> listAll() {
public final List<App> listAll() {
// forward scrolling, if after == null then first page is being asked
List<String> jsons = dao.listAfterWithOffset(Integer.MAX_VALUE, 0);
List<AppRunRecord> entities = new ArrayList<>();
List<App> entities = new ArrayList<>();
for (String json : jsons) {
AppRunRecord entity = JsonUtils.readValue(json, AppRunRecord.class);
App entity = JsonUtils.readValue(json, App.class);
mohityadav766 marked this conversation as resolved.
Show resolved Hide resolved
entities.add(entity);
}
return entities;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,21 @@ public void initialize(OpenMetadataApplicationConfig config) {
ApplicationHandler.installApplication(app, Entity.getCollectionDAO(), searchRepository);
}
}

// Initialize installed applications
for (App installedApp : repository.listAll()) {
App appWithBot = getAppForInit(installedApp.getName());
if (appWithBot == null) {
LOG.error(
String.format(
"Failed to init app [%s]. GET should return the installed app",
installedApp.getName()));
} else {
setAppRuntimeProperties(appWithBot);
ApplicationHandler.runAppInit(appWithBot, dao, searchRepository);
LOG.info(String.format("Initialized installed app [%s]", installedApp.getName()));
}
}
} catch (Exception ex) {
LOG.error("Failed in Create App Requests", ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
{
"name": "ReadRows",
"description": "Validate that we can read rows with the given credentials.",
"errorMessage": "Failed to read rows from BigTable, please validate to the credentials of service account"
"errorMessage": "Failed to read rows from BigTable, please validate to the credentials of service account",
"shortCircuit": true,
"mandatory": true
}
Expand Down
Loading