Skip to content

Commit

Permalink
MINOR - Prepare App Instances & fix bigtable json (#15292)
Browse files Browse the repository at this point in the history
* MINOR - Prepare App Exception & fix bigtable json

* Do not init the app all the time and allow to fetch initialized resources

* init installed apps

* Add runtime props

* Add runtime props

* Format
  • Loading branch information
pmbrull authored Feb 23, 2024
1 parent ad9a6df commit cc878bf
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 12 deletions.
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);
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

0 comments on commit cc878bf

Please sign in to comment.