diff --git a/src/main/java/eu/hbp/mip/StartupTasks.java b/src/main/java/eu/hbp/mip/StartupTasks.java index 598e05b178d6964e37879acac0c50a2acf81864e..d7dc3e0958bc1613ee6afa13fbb4a8d6b9ddc836 100644 --- a/src/main/java/eu/hbp/mip/StartupTasks.java +++ b/src/main/java/eu/hbp/mip/StartupTasks.java @@ -17,7 +17,6 @@ import org.springframework.stereotype.Component; @Component -@DependsOn("wokenCluster") public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> { private static final Logger LOGGER = LoggerFactory.getLogger(StartupTasks.class); @@ -43,32 +42,32 @@ public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> // Pre-fill the local variable repository with the list of datasets, interpreted here as variables // (a bit like a categorical variable can be split into a set of variables (a.k.a one hot encoding in Data science) ) // Try 5 times, to be more robust in the face of cluster failures / slow startup - LOGGER.info("Prefill variable repository with datasets..."); - for (int i = 0; i < 5; i++) { - try { - StringBuilder fetchedDatasets = new StringBuilder(); - for (Dataset dataset : datasetsApi.fetchDatasets()) { - final String code = dataset.id().code(); - fetchedDatasets.append(code).append(' '); - Variable v = variableRepository.findOne(code); - if (v == null) { - LOGGER.info("Store additional variable {}", code); - v = new Variable(code); - variableRepository.save(v); - } - } - LOGGER.info("Datasets fetched from Woken: " + fetchedDatasets.toString()); - variablesRepositoryOk = true; - break; - } catch (Exception e) { - variablesRepositoryOk = false; - LOGGER.error("Cannot initialise the variable repository. Is the connection to Woken working?", e); - } - } + // LOGGER.info("Prefill variable repository with datasets..."); + // for (int i = 0; i < 5; i++) { + // try { + // StringBuilder fetchedDatasets = new StringBuilder(); + // for (Dataset dataset : datasetsApi.fetchDatasets()) { + // final String code = dataset.id().code(); + // fetchedDatasets.append(code).append(' '); + // Variable v = variableRepository.findOne(code); + // if (v == null) { + // LOGGER.info("Store additional variable {}", code); + // v = new Variable(code); + // variableRepository.save(v); + // } + // } + // LOGGER.info("Datasets fetched from Woken: " + fetchedDatasets.toString()); + // variablesRepositoryOk = true; + // break; + // } catch (Exception e) { + // variablesRepositoryOk = false; + // LOGGER.error("Cannot initialise the variable repository. Is the connection to Woken working?", e); + // } + // } - if (!variablesRepositoryOk) { - System.exit(1); - } + // if (!variablesRepositoryOk) { + // System.exit(1); + // } /* for (String variableJson: variablesApi.loadVariables()) { diff --git a/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java b/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java deleted file mode 100644 index 1af3fdafcbd0ac8347079c66e75a172ee1ed0a6b..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java +++ /dev/null @@ -1,33 +0,0 @@ -package eu.hbp.mip.akka; - -import akka.cluster.Cluster; -import ch.chuv.lren.woken.messages.Ping; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.health.Health; -import org.springframework.boot.actuate.health.HealthIndicator; -import org.springframework.stereotype.Component; -import scala.Option; - - -@Component -public class AkkaClusterHealthCheck extends WokenClientController implements HealthIndicator { - - @Autowired - private Cluster wokenCluster; - - @Override - public Health health() { - if (wokenCluster.state().getLeader() == null) { - return Health.down().withDetail("Error", "No leader in the cluster").build(); - } else if (!wokenCluster.state().allRoles().contains("woken")) { - return Health.down().withDetail("Error", "Woken server cannot be seen in the cluster").build(); - } - try { - askWoken(new Ping(Option.apply("woken")), 5); - return Health.up().build(); - } catch (Exception e) { - return Health.down().withDetail("Error", "Cannot reach Woken: " + e.toString()).build(); - } - } - -} diff --git a/src/main/java/eu/hbp/mip/akka/ExperimentActor.java b/src/main/java/eu/hbp/mip/akka/ExperimentActor.java deleted file mode 100644 index 7431d7928e056a22c019dd5bb539b9e2c27a1cbc..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/akka/ExperimentActor.java +++ /dev/null @@ -1,59 +0,0 @@ -package eu.hbp.mip.akka; - -import akka.actor.AbstractActor; -import ch.chuv.lren.woken.messages.query.QueryResult; -import eu.hbp.mip.model.Experiment; -import eu.hbp.mip.repositories.ExperimentRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.UUID; - -/** - * Created by mirco on 30.11.16. - */ - -@Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -public class ExperimentActor extends AbstractActor { - - @Autowired - private ExperimentRepository experimentRepository; - - private static final Logger LOGGER = LoggerFactory.getLogger(ExperimentActor.class); - - public Receive createReceive() { - return receiveBuilder() - .match(QueryResult.class, this::handleQueryResult) - .matchAny(o -> LOGGER.info("received unknown message " + o)) - .build(); - } - - private void handleQueryResult(QueryResult queryResult) { - LOGGER.info("ActorExperiment - onReceive method has been called"); - UUID uuid = UUID.fromString(this.getSelf().path().name()); - LOGGER.info("\n\nExperimentActor received response from woken for UUID: \n" + uuid.toString()); - Experiment experiment = experimentRepository.findOne(uuid); - if (experiment == null) { - LOGGER.error("Experiment with UUID=" + uuid + " not found in DB"); - getContext().stop(getSelf()); - } else { - if (queryResult.error().nonEmpty()) { - experiment.setHasServerError(true); - experiment.setResult(queryResult.error().get()); - } else { - // TODO: use new WokenConversions().toJson(queryResult) - experiment.setResult(queryResult.data().get().compactPrint()); - } - experiment.setFinished(Date.from(queryResult.timestamp().toInstant())); - experimentRepository.save(experiment); - LOGGER.info("Experiment " + uuid + " updated (finished)"); - getContext().stop(getSelf()); - } - } -} diff --git a/src/main/java/eu/hbp/mip/akka/SpringActorProducer.java b/src/main/java/eu/hbp/mip/akka/SpringActorProducer.java deleted file mode 100644 index ade82c181488d6c727aa653f6097aa1ac1ef5eb8..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/akka/SpringActorProducer.java +++ /dev/null @@ -1,28 +0,0 @@ -package eu.hbp.mip.akka; - -import akka.actor.Actor; -import akka.actor.IndirectActorProducer; -import org.springframework.context.ApplicationContext; - - -public class SpringActorProducer implements IndirectActorProducer { - - private final ApplicationContext applicationContext; - private final String actorBeanName; - - public SpringActorProducer(ApplicationContext applicationContext, - String actorBeanName) { - this.applicationContext = applicationContext; - this.actorBeanName = actorBeanName; - } - - @Override - public Actor produce() { - return (Actor) applicationContext.getBean(actorBeanName); - } - - @Override - public Class<? extends Actor> actorClass() { - return (Class<? extends Actor>) applicationContext.getType(actorBeanName); - } -} diff --git a/src/main/java/eu/hbp/mip/akka/SpringExtension.java b/src/main/java/eu/hbp/mip/akka/SpringExtension.java deleted file mode 100644 index 5fe0698be44193fcdc8761297f429cb456aadd40..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/akka/SpringExtension.java +++ /dev/null @@ -1,41 +0,0 @@ -package eu.hbp.mip.akka; - -import akka.actor.AbstractExtensionId; -import akka.actor.ExtendedActorSystem; -import akka.actor.Extension; -import akka.actor.Props; -import org.springframework.context.ApplicationContext; - -/* - * Created by mirco on 24.10.16. - */ - -public class SpringExtension - extends AbstractExtensionId<SpringExtension.SpringExt> { - - public static final SpringExtension SPRING_EXTENSION_PROVIDER - = new SpringExtension(); - - private SpringExtension() - { - /* Private constructor for singleton */ - } - - @Override - public SpringExt createExtension(ExtendedActorSystem system) { - return new SpringExt(); - } - - public static class SpringExt implements Extension { - private volatile ApplicationContext applicationContext; - - public void initialize(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - - public Props props(String actorBeanName) { - return Props.create( - SpringActorProducer.class, applicationContext, actorBeanName); - } - } -} diff --git a/src/main/java/eu/hbp/mip/akka/WokenClientController.java b/src/main/java/eu/hbp/mip/akka/WokenClientController.java deleted file mode 100644 index e6ef3cdd79e7c0a6eaafdf2d72350f55e8f8e8f2..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/akka/WokenClientController.java +++ /dev/null @@ -1,90 +0,0 @@ -package eu.hbp.mip.akka; - -import akka.actor.ActorRef; -import akka.actor.ActorSystem; -import akka.cluster.pubsub.DistributedPubSub; -import akka.cluster.pubsub.DistributedPubSubMediator; -import akka.pattern.Patterns; -import akka.util.Timeout; -import ch.chuv.lren.woken.messages.RemoteMessage; -import ch.chuv.lren.woken.messages.query.Query; -import ch.chuv.lren.woken.messages.query.QueryResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import scala.concurrent.Await; -import scala.concurrent.ExecutionContext; -import scala.concurrent.Future; -import scala.concurrent.duration.Duration; - -import java.util.function.Function; - -/** - * Base class for controllers using Woken services - */ -public abstract class WokenClientController { - - protected final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); - - @Autowired - private ActorSystem actorSystem; - - @Value("#{'${akka.woken.path:/user/entrypoint}'}") - private String wokenPath; - - @SuppressWarnings("unchecked") - protected <A extends RemoteMessage, B> B askWoken(A message, int waitInSeconds) throws Exception { - LOGGER.info("Trying to reach remote Akka actor " + wokenPath + "..."); - - DistributedPubSubMediator.Send queryMessage = new DistributedPubSubMediator.Send(wokenPath, message, false); - Timeout timeout = new Timeout(Duration.create(waitInSeconds, "seconds")); - - Future<Object> future = Patterns.ask(wokenMediator(), queryMessage, timeout); - - B result = (B) Await.result(future, timeout.duration()); - LOGGER.info("Akka actor returned a result for message of class " + message.getClass()); - return result; - } - - protected <A extends RemoteMessage, B> ResponseEntity requestWoken(A message, int waitInSeconds, Function<B, ResponseEntity> handleResponse) { - try { - B result = askWoken(message, waitInSeconds); - return handleResponse.apply(result); - } catch (Exception e) { - final String msg = "Cannot receive result from woken: " + e.getMessage(); - LOGGER.error(msg, e); - return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(msg); - } - } - - protected <A extends Query> ResponseEntity askWokenQuery(A query, int waitInSeconds, Function<QueryResult, ResponseEntity> handleResponse) { - try { - QueryResult result = askWoken(query, waitInSeconds); - return handleResponse.apply(result); - } catch (Exception e) { - final String msg = "Cannot receive algorithm result from woken: " + e.getMessage(); - LOGGER.error(msg, e); - return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(msg); - } - } - - protected <A extends Query> Future<Object> sendWokenQuery(A query, int waitInSeconds) { - LOGGER.info("Akka is trying to reach remote " + wokenPath); - - DistributedPubSubMediator.Send queryMessage = new DistributedPubSubMediator.Send(wokenPath, query, false); - - return Patterns.ask(wokenMediator(), queryMessage, waitInSeconds); - } - - protected ExecutionContext getExecutor() { - return actorSystem.dispatcher(); - } - - private ActorRef wokenMediator() { - return DistributedPubSub.get(actorSystem).mediator(); - } -} diff --git a/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java b/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java deleted file mode 100644 index 4531d4d3070a9a34eb2dbbb617e6edccf225706e..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java +++ /dev/null @@ -1,124 +0,0 @@ -package eu.hbp.mip.configuration; - -import akka.actor.ActorRef; -import akka.actor.ActorSystem; -import akka.actor.ExtendedActorSystem; -import akka.cluster.Cluster; -import akka.cluster.Member; -import akka.cluster.pubsub.DistributedPubSub; -import ch.chuv.lren.woken.utils.ConfigurationLoader; -import com.typesafe.config.Config; -import com.typesafe.config.ConfigFactory; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.*; - -import java.util.List; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import static eu.hbp.mip.akka.SpringExtension.SPRING_EXTENSION_PROVIDER; - -/** - * Created by mirco on 24.10.16. - */ - -@Configuration -@ComponentScan -public class AkkaConfiguration { - - protected final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); - - @Autowired - private ApplicationContext applicationContext; - - private final Config config; - - { - Config appConfig = ConfigFactory.parseResourcesAnySyntax("application.conf") - .withFallback(ConfigFactory.parseResourcesAnySyntax("kamon.conf")); - config = ConfigurationLoader.appendClusterConfiguration(appConfig).resolve(); - } - - @Bean - public ExtendedActorSystem actorSystem() { - LOGGER.info("Step 1/3: Starting actor system..."); - LOGGER.info("Create actor system at " + wokenClusterHost() + ":" + wokenClusterPort()); - ExtendedActorSystem system = (ExtendedActorSystem) ActorSystem.create(wokenClusterName(), config); - SPRING_EXTENSION_PROVIDER.get(system).initialize(applicationContext); - return system; - } - - @Bean - @DependsOn("actorSystem") - public Cluster wokenCluster() { - Cluster cluster = Cluster.get(actorSystem()); - LOGGER.info("Connect to Woken cluster nodes at " + String.join(",", wokenPath())); - Semaphore semaphore = new Semaphore(1); - cluster.registerOnMemberUp( () -> { - LOGGER.info("Step 2/3: Cluster up, registering the actors..."); - - // Do not call wokenMediator() here to avoid recursive loops - ActorRef mediator = DistributedPubSub.get(actorSystem()).mediator(); - - LOGGER.info("Woken Mediator available at " + mediator.path().toStringWithoutAddress()); - - semaphore.release(); - }); - - for (Member member: cluster.state().getMembers()) { - LOGGER.info("Member " + StringUtils.join(member.getRoles(), ",") + " at " + member.address().toString() + " is in the cluster"); - } - - if (cluster.state().members().size() < 2) { - LOGGER.info("Waiting for Woken cluster connection..."); - try { - semaphore.tryAcquire(5, TimeUnit.MINUTES); - Thread.sleep(5000); - } catch (InterruptedException e) { - LOGGER.warn("Cannot wait for Akka cluster start", e); - } - } - - final Runnable leaveCluster = () -> cluster.leave(cluster.selfAddress()); - actorSystem().registerOnTermination(leaveCluster); - - cluster.registerOnMemberRemoved( () -> { - LOGGER.info("Exiting..."); - cluster.leave(cluster.selfAddress()); - actorSystem().registerOnTermination(() -> System.exit(0)); - actorSystem().terminate(); - }); - - Runtime.getRuntime().addShutdownHook(new Thread(leaveCluster) - ); - - LOGGER.info("Step 3/3: Cluster connected to Woken."); - - return cluster; - } - - @Bean - public String wokenClusterHost() { - return config.getString("clustering.ip"); - } - - @Bean - public String wokenClusterName() { - return config.getString("clustering.cluster.name"); - } - - @Bean - public Integer wokenClusterPort() { - return config.getInt("clustering.port"); - } - - @Bean - public List<String> wokenPath() { - return config.getStringList("akka.cluster.seed-nodes"); - } - -} diff --git a/src/main/java/eu/hbp/mip/configuration/WebConfiguration.java b/src/main/java/eu/hbp/mip/configuration/WebConfiguration.java index a6ae893f9df932db208fc5680e44df012dbd4d0c..a5b514dfb815c9df88c0475b7c3ce24df1f06803 100644 --- a/src/main/java/eu/hbp/mip/configuration/WebConfiguration.java +++ b/src/main/java/eu/hbp/mip/configuration/WebConfiguration.java @@ -20,7 +20,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 @EnableSpringDataWebSupport -@DependsOn("wokenCluster") public class WebConfiguration { @Bean diff --git a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java index c7bd005aee68488280f16ec4ac079ef5c9756de4..4faac4ee5502fce220445a26de559aa04e9c5632 100644 --- a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java @@ -4,11 +4,6 @@ package eu.hbp.mip.controllers; - -import ch.chuv.lren.woken.messages.datasets.Dataset; -import ch.chuv.lren.woken.messages.datasets.DatasetsQuery; -import ch.chuv.lren.woken.messages.datasets.DatasetsResponse; -import eu.hbp.mip.akka.WokenClientController; import eu.hbp.mip.model.DatasetDescription; import io.swagger.annotations.*; import org.slf4j.Logger; @@ -30,40 +25,9 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController @RequestMapping(value = "/datasets", produces = {APPLICATION_JSON_VALUE}) @Api(value = "/datasets", description = "the datasets API") -public class DatasetsApi extends WokenClientController { +public class DatasetsApi { private static final Logger LOGGER = LoggerFactory.getLogger(DatasetsApi.class); - @ApiOperation(value = "Get dataset list", response = Dataset.class, responseContainer = "List") - @RequestMapping(method = RequestMethod.GET) - @Cacheable(value = "datasets") - public ResponseEntity getDatasets( - ) { - LOGGER.info("Get list of datasets"); - - try { - List<DatasetDescription> datasets = new ArrayList<>(); - for (Dataset d: fetchDatasets()) { - DatasetDescription dataset = new DatasetDescription(); - LOGGER.info("Dataset {}", d); - dataset.setCode(d.id().code()); - dataset.setLabel(d.label()); - dataset.setDescription(d.description()); - dataset.setAnonymisationLevel(d.anonymisationLevel().toString()); - datasets.add(dataset); - } - - return ResponseEntity.ok(datasets); - } catch (Exception e) { - final String msg = "Cannot receive datasets from woken: " + e.getMessage(); - LOGGER.error(msg, e); - return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(msg); - } - - } - public List<ch.chuv.lren.woken.messages.datasets.Dataset> fetchDatasets() throws Exception { - DatasetsResponse result = askWoken(new DatasetsQuery(Option.empty()), 30); - return new ArrayList<>(scala.collection.JavaConversions.asJavaCollection(result.datasets())); - } } diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index 2c626060818dc93ee79b1029ced677ce1412e8cf..3035889605e555189c2c2ff93eba40ccaa820a10 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -6,7 +6,7 @@ import com.google.gson.*; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import eu.hbp.mip.akka.WokenClientController; + import eu.hbp.mip.model.*; import eu.hbp.mip.repositories.ExperimentRepository; import eu.hbp.mip.repositories.ModelRepository; @@ -35,7 +35,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController @RequestMapping(value = "/experiments", produces = { APPLICATION_JSON_VALUE }) @Api(value = "/experiments", description = "the experiments API") -public class ExperimentApi extends WokenClientController { +public class ExperimentApi { private static final Logger LOGGER = LoggerFactory.getLogger(ExperimentApi.class); @@ -62,16 +62,7 @@ public class ExperimentApi extends WokenClientController { @Autowired private ExperimentRepository experimentRepository; - @ApiOperation(value = "Send a request to the workflow to run an experiment", response = Experiment.class) - @RequestMapping(method = RequestMethod.POST) - public ResponseEntity<String> runExperiment(@RequestBody ExperimentQuery expQuery) { - LOGGER.info("Run an experiment"); - - Experiment experiment = saveExperiment(expQuery); - sendExperiment(experiment); - return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK); - } @ApiOperation(value = "Create an experiment on Exareme", response = Experiment.class) @RequestMapping(value = "/exareme", method = RequestMethod.POST) @@ -367,38 +358,6 @@ public class ExperimentApi extends WokenClientController { return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK); } - private void sendExperiment(final Experiment experiment) { - User user = userInfo.getUser(); - - // this runs in the background. For future optimization: use a thread pool - final ch.chuv.lren.woken.messages.query.ExperimentQuery experimentQuery = experiment - .prepareQuery(user.getUsername()); - final ExecutionContext ec = getExecutor(); - - Future<Object> response = sendWokenQuery(experimentQuery, 24 * 3600); - response.onSuccess(new OnSuccess<Object>() { - public void onSuccess(Object result) { - QueryResult queryResult = (QueryResult) result; - UUID uuid = experiment.getUuid(); - LOGGER.info("\n\nExperimentActor received response from woken for UUID: \n" + uuid.toString()); - Experiment experiment = experimentRepository.findOne(uuid); - if (experiment == null) { - LOGGER.error("Experiment with UUID=" + uuid + " not found in DB"); - } else { - if (queryResult.error().nonEmpty()) { - experiment.setHasServerError(true); - LOGGER.error("Experiment failed with message: " + queryResult.error().get()); - } - // TODO: use new WokenConversions().toJson(queryResult) - experiment.setResult(queryResult.data().get().compactPrint()); - experiment.setFinished(Date.from(queryResult.timestamp().toInstant())); - experimentRepository.save(experiment); - LOGGER.info("Experiment " + uuid + " updated (finished)"); - } - } - }, ec); - } - private void finishExperiment(Experiment experiment) { experiment.setFinished(new Date()); experimentRepository.save(experiment); diff --git a/src/main/java/eu/hbp/mip/controllers/MethodsApi.java b/src/main/java/eu/hbp/mip/controllers/MethodsApi.java index 5eaf651b756c1536bddb6aea8431bf55eedccb7a..10f1e2276931dcc137c02f31cbf5a2aa3f01549b 100644 --- a/src/main/java/eu/hbp/mip/controllers/MethodsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MethodsApi.java @@ -1,7 +1,7 @@ package eu.hbp.mip.controllers; import com.google.gson.*; -import eu.hbp.mip.akka.WokenClientController; + import ch.chuv.lren.woken.messages.query.MethodsQuery$; import ch.chuv.lren.woken.messages.query.MethodsResponse; import io.swagger.annotations.Api; @@ -21,7 +21,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController @RequestMapping(value = "/methods", produces = { APPLICATION_JSON_VALUE }) @Api(value = "/methods", description = "the methods API") -public class MethodsApi extends WokenClientController { +public class MethodsApi { private static final Logger LOGGER = LoggerFactory.getLogger(MethodsApi.class); @@ -36,20 +36,6 @@ public class MethodsApi extends WokenClientController { @Value("#{'${services.workflows.workflowAuthorization}'}") private String workflowAuthorization; - @ApiOperation(value = "List available methods and validations", response = String.class) - @Cacheable(value = "methods", unless = "#result.getStatusCode().value()!=200") - @RequestMapping(method = RequestMethod.GET) - public ResponseEntity listAvailableMethodsAndValidations() { - LOGGER.info("List available methods and validations"); - - return requestWoken(MethodsQuery$.MODULE$, 10, r -> { - MethodsResponse result = (MethodsResponse) r; - JsonObject catalog = new JsonParser().parse(result.methods().compactPrint()).getAsJsonObject(); - - return ResponseEntity.ok(gson.toJson(catalog)); - }); - } - @ApiOperation(value = "List Exareme algorithms and validations", response = String.class) @Cacheable(value = "exareme", unless = "#result.getStatusCode().value()!=200") @RequestMapping(value = "/exareme", method = RequestMethod.GET) diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java index edee07b8dad31bcd62c7759a048f9edb82103446..a585098261f35176c3710ce2aeb73f3e20bd4e70 100644 --- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java @@ -3,7 +3,7 @@ package eu.hbp.mip.controllers; import eu.hbp.mip.utils.HTTPUtil; import com.google.gson.Gson; -import eu.hbp.mip.akka.WokenClientController; + import eu.hbp.mip.model.Mining; import eu.hbp.mip.model.User; import eu.hbp.mip.model.UserInfo; @@ -34,7 +34,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController @RequestMapping(value = "/mining", produces = { APPLICATION_JSON_VALUE }) @Api(value = "/mining", description = "the mining API") -public class MiningApi extends WokenClientController { +public class MiningApi { private static final Logger LOGGER = LoggerFactory.getLogger(MiningApi.class); private static final Gson gson = new Gson(); @@ -45,27 +45,6 @@ public class MiningApi extends WokenClientController { @Value("#{'${services.exareme.miningExaremeUrl:http://localhost:9090/mining/query}'}") public String miningExaremeQueryUrl; - @ApiOperation(value = "Run an algorithm", response = String.class) - @Cacheable(value = "mining", condition = "#query != null and (#query.getAlgorithm().getCode() == 'histograms' or #query.getAlgorithm().getCode() == 'histograms')", key = "#query.toString()", unless = "#result.getStatusCode().value()!=200") - @RequestMapping(method = RequestMethod.POST) - public ResponseEntity runAlgorithm(@RequestBody eu.hbp.mip.model.MiningQuery query) { - LOGGER.info("Run an algorithm"); - User user = userInfo.getUser(); - - return askWokenQuery(query.prepareQuery(user.getUsername()), 120, result -> { - if (result.error().nonEmpty()) { - LOGGER.error(result.error().get()); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body("{\"error\":\"" + result.error().get() + "\"}"); - } else { - Mining mining = new Mining(result.jobId(), result.node(), unwrap(result.algorithm()), - result.type().mime(), Date.from(result.timestamp().toInstant()), - result.data().get().compactPrint()); - return ResponseEntity.ok(gson.toJson(mining.jsonify())); - } - }); - } - @ApiOperation(value = "Create an histogram on Exareme", response = String.class) @RequestMapping(value = "/exareme", method = RequestMethod.POST) public ResponseEntity runExaremeMining(@RequestBody List<HashMap<String, String>> queryList) { diff --git a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java index 6d7cce1c7819b64d168f06f94c817177fd461567..e41afded17f4779e0b41516e3ab8b796124a43b3 100644 --- a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java +++ b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java @@ -13,7 +13,7 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import eu.hbp.mip.akka.WokenClientController; + import eu.hbp.mip.model.Algorithm; import eu.hbp.mip.model.MiningQuery; import eu.hbp.mip.model.Variable; @@ -43,7 +43,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController @RequestMapping(value = "/variables", produces = {APPLICATION_JSON_VALUE}) @Api(value = "/variables", description = "the variables API") -public class VariablesApi extends WokenClientController { +public class VariablesApi { private static final Logger LOGGER = LoggerFactory.getLogger(VariablesApi.class); @@ -79,36 +79,7 @@ public class VariablesApi extends WokenClientController { return ResponseEntity.ok(variablesObjects); } - @ApiOperation(value = "Get variables available for a dataset", response = List.class, responseContainer = "List") - @Cacheable(value = "availableVariables", - unless = "#result.getStatusCode().value()!=200") - @RequestMapping(value = "/availableVariables", method = RequestMethod.GET) - public ResponseEntity getAvailableVariables( - @ApiParam(value = "List of datasets : ds1,ds2,...") @RequestParam(value = "datasets") String datasets) { - - LOGGER.info("Get available variables for datasets " + datasets); - - List<Variable> dsAsVariables = Arrays.stream(datasets.split(",")).map(Variable::new).collect(Collectors.toList()); - WokenConversions conv = new WokenConversions(); - - VariablesForDatasetsQuery query = new VariablesForDatasetsQuery(conv.toDatasets(dsAsVariables), true); - - return requestWoken(query, 30, r -> { - VariablesForDatasetsResponse response = (VariablesForDatasetsResponse) r; - - if (response.error().isDefined()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response.error().get()); - } else { - List<Variable> variables = new ArrayList<>(); - for (VariableMetaData var: JavaConversions.setAsJavaSet(response.variables())) { - variables.add(new Variable(var.code())); - } - return ResponseEntity.ok(variables); - } - }); - - } - + @ApiOperation(value = "Get a variable", response = Object.class) @Cacheable("variable") diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 57becf5e642e1601d4024194e4eff427698d3986..c5c8d43bb2256424e434b9f4f859f00834630afd 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -10,7 +10,13 @@ <Root level="${env:LOG_LEVEL:-INFO}"> <AppenderRef ref="Console"/> </Root> - <Logger name="akka.actor.LocalActorRefProvider(akka://woken)" level="INFO"> + <Logger name="akka.actor.LocalActorRefProvider(akka:// + <Logger name="io.netty" level="${env:NETTY_LOG_LEVEL:-ERROR}"> + <AppenderRef ref="Console"/> + </Logger> + </Loggers> +</Configuration> +woken)" level="INFO"> <AppenderRef ref="Console"/> </Logger> <Logger name="akka.cluster" level="${env:AKKA_CLUSTER_LOG_LEVEL:-INFO}"> @@ -30,9 +36,4 @@ </Logger> <Logger name="akka.stream.impl" level="${env:AKKA_STREAM_LOG_LEVEL:-INFO}"> <AppenderRef ref="Console"/> - </Logger> - <Logger name="io.netty" level="${env:NETTY_LOG_LEVEL:-ERROR}"> - <AppenderRef ref="Console"/> - </Logger> - </Loggers> -</Configuration> + </Logger> \ No newline at end of file