diff --git a/.deployment/docker-compose.yml b/.deployment/docker-compose.yml index a23fa53..0a5e192 100644 --- a/.deployment/docker-compose.yml +++ b/.deployment/docker-compose.yml @@ -90,9 +90,7 @@ services: environment: task.list.uri: http://tapas-tasks:8081 auction.house.uri: http://tapas-auction-house:8086 - executor.robot.uri: http://executor-robot:8084 - executor.computation.uri: http://executor-computation:8085 - executor.humidity.uri: http://executor-humidity:8087 + executor.pool.uri: http://executor-pool:8083 mqtt.broker.uri: tcp://broker.hivemq.com:1883 spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017 labels: @@ -135,13 +133,15 @@ services: volumes: - ./:/data/ environment: - EXECUTOR_POOL_URI: http://executor-pool:8083 - ROSTER_URI: http://roster:8082 + executor.type: COMPUTATION + executor.uri: http://executor-computation:8085 + executor.pool.uri: http://executor-pool:8083 + roster.uri: http://roster:8082 labels: - "traefik.enable=true" - "traefik.http.routers.executor-computation.rule=Host(`executor-computation.${PUB_IP}.nip.io`)" - "traefik.http.routers.executor-computation.service=executor-computation" - - "traefik.http.services.executor-computation.loadbalancer.server.port=8084" + - "traefik.http.services.executor-computation.loadbalancer.server.port=8085" - "traefik.http.routers.executor-computation.tls=true" - "traefik.http.routers.executor-computation.entryPoints=web,websecure" - "traefik.http.routers.executor-computation.tls.certresolver=le" @@ -156,13 +156,15 @@ services: volumes: - ./:/data/ environment: - EXECUTOR_POOL_URI: http://executor-pool:8083 - ROSTER_URI: http://roster:8082 + executor.type: SMALLROBOT + executor.uri: http://executor-robot:8084 + executor.pool.uri: http://executor-pool:8083 + roster.uri: http://roster:8082 labels: - "traefik.enable=true" - "traefik.http.routers.executor-robot.rule=Host(`executor-robot.${PUB_IP}.nip.io`)" - "traefik.http.routers.executor-robot.service=executor-robot" - - "traefik.http.services.executor-robot.loadbalancer.server.port=8085" + - "traefik.http.services.executor-robot.loadbalancer.server.port=8084" - "traefik.http.routers.executor-robot.tls=true" - "traefik.http.routers.executor-robot.entryPoints=web,websecure" - "traefik.http.routers.executor-robot.tls.certresolver=le" @@ -177,8 +179,10 @@ services: volumes: - ./:/data/ environment: - EXECUTOR_POOL_URI: http://executor-pool:8083 - ROSTER_URI: http://roster:8082 + executor.type: HUMIDITY + executor.uri: http://executor-humidity:8087 + executor.pool.uri: http://executor-pool:8083 + roster.uri: http://roster:8082 labels: - "traefik.enable=true" - "traefik.http.routers.executor-computation.rule=Host(`executor-humidity.${PUB_IP}.nip.io`)" diff --git a/Californium3.properties b/Californium3.properties deleted file mode 100644 index a9d922c..0000000 --- a/Californium3.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Californium3 CoAP Properties file -# Wed Dec 15 21:41:00 CET 2021 -# diff --git a/README.md b/README.md index 57106c5..c5ac8fd 100644 --- a/README.md +++ b/README.md @@ -1,125 +1,63 @@ # TAPAS -This is the main GitHub project for your implementation of the TAPAS application. - -## Run application in developent - -We use Docker & docker-compose in development to easly start all the microservices and other needed application (db's, message-broker's) at once. All microservices have hot-reloads enabled by default! - -#### Start - -``` -docker-compose up -``` - -#### Rebuild container - -``` -docker-compose up --build -``` - -#### Start detached - -``` -docker-compose up -d -``` - -#### Stop detached - -``` -docker-compose down -``` - -## Available Services - -Ports and debug ports of each service are listed below: - -| Name | Port | Debug Port | -| ------------------ | ---- | ---------- | -| Tasklist | 8081 | 5005 | -| Assignment Service | 8082 | 5006 | -| Executor Pool | 8083 | 5007 | -| Executor 1 | 8084 | 5008 | -| Executor 2 | 8085 | 5009 | +This is the main GitHub project for the implementation of the TAPAS application from Group 1. ## Project Structure This project is structured as follows: -- [tapas-tasks](tapas-tasks): standalone project for the Tapas-Tasks micro-service (Spring Boot project) - - [tapas-tasks/src](tapas-tasks/src): source code of the project (following the Hexagonal Architecture) - - [tapas-tasks/pom.xml](tapas-tasks\pom.xml): Maven pom-file -- [app](app): folder as placeholder for a second micro-service (Spring Boot project) -- [docker-compose.yml](docker-compose.yml): Docker Compose configuration file for all services -- [.github/workflows/build-and-deploy.yml](.github/workflows/build-and-deploy.yml): GitHub actions script (CI/CD workflow) +- [.deployment/docker-compose.yml](.deployment/docker-compose.yml): Docker Compose configuration file for all services (deployment) +- [.experiments](.experiments): Experiment files for chaos monkey tests +- [.github/workflows](.github/workflows): GitHub actions scripts (CI/CD workflow) +- [common](common): common library for shared elements across the whole application + - [common/src](common/src): source code of the library + - [common/pom.xml](common/pom.xml): Maven pom-file +- [doc/architecture/decisions](doc/architecture/decisions): ADRs +- [doc/workflow.png](doc/workflow.png): Workflow diagram +- [executor-base](executor-base): library for the executors. Includes the logic for executors to connect to the system + - [executor-base/src](executor-base/src): source code of the library + - [executor-base/pom.xml](executor-base/pom.xml): Maven pom-file +- [executor-computation](executor-computation): standalone project for the computation executor micro-service (Spring Boot project) + - [executor-computation/src](executor-computation/src): source code of the project + - [executor-computation/pom.xml](executor-computation/pom.xml): Maven pom-file +- [executor-humidity](executor-humidity): standalone project for the humidity executor micro-service (Spring Boot project) + - [executor-humidity/src](executor-humidity/src): source code of the project + - [executor-humidity/pom.xml](executor-humidity/pom.xml): Maven pom-file +- [executor-pool](executor-pool): standalone project for the executor-pool micro-service (Spring Boot project) + - [executor-pool/src](executor-pool/src): source code of the project (following the Hexagonal Architecture) + - [executor-pool/pom.xml](executor-pool/pom.xml): Maven pom-file +- [executor-robot](executor-robot): standalone project for the robot executor micro-service (Spring Boot project) -## How to Add a New Service with Spring Boot + - [executor-robot/src](executor-robot/src): source code of the project + - [executor-robot/pom.xml](executor-robot/pom.xml): Maven pom-file -### Create a new Spring Boot project +- [mocks](mocks): some auction-house mock files to test localy -- Recommended: use [Spring Initialzr](https://start.spring.io/) (Maven, Spring Boot 2.5.5, Jar, Java 11, dependencies as needed) -- Set the Spring application properties for your service (e.g., port of the web server) in `src/resources/application.properties` +- [roster](roster): standalone project for the Roster micro-service (Spring Boot project) -### Update the Docker Compose file + - [roster/src](roster/src): source code of the project (following the Hexagonal Architecture) + - [roster/pom.xml](roster/pom.xml): Maven pom-file -Your TAPAS application is a multi-container Docker application ran with [Docker Compose](https://docs.docker.com/compose/). -To add your newly created service to the Docker Compose configuration file, you need to create a new service -definition in [docker-compose.yml](docker-compose.yml): +- [tapas-auction-house](tapas-auction-house): standalone project for the Tapas-Aution-House micro-service (Spring Boot project) -- copy and edit the `tapas-tasks` service definition from [lines 29-42](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L29-L42) -- change `command` (see [line 31](https://github.com/scs-asse/tapas/blob/main/docker-compose.yml#L31)) - to use the name of the JAR file generated by Maven for your service - - note: if you change the version of your service, you need to update this line to reflect the change -- update the Traefik label names to reflect the name of your new service (see [lines 37-42](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L37-L42)) - - e.g., change `traefik.http.routers.tapas-tasks.rule` to `traefik.http.routers..rule` -- update the Traefik `rule` (see [line 37](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L37)) with the name of your new service: `` Host(`.${PUB_IP}.nip.io`) `` -- update the Traefik `port` (see [line 39](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/docker-compose.yml#L39)) with the port configured for your new service + - [tapas-auction-house/src](tapas-auction-house/src): source code of the project (following the Hexagonal Architecture) + - [tapas-auction-house/pom.xml](tapas-auction-house/pom.xml): Maven pom-file -### Update the GitHub Actions Workflow +- [tapas-tasks](tapas-tasks): standalone project for the Tapas-Tasks micro-service (Spring Boot project) -This project uses GitHub Actions to build and deploy your TAPAS application whenever a new commit is -pushed on the `main` branch. You can add your new service to the GitHub Actions workflow defined in -[.github/workflows/build-and-deploy.yml](.github/workflows/build-and-deploy.yml): + - [tapas-tasks/src](tapas-tasks/src): source code of the project (following the Hexagonal Architecture) + - [tapas-tasks/pom.xml](tapas-tasks/pom.xml): Maven pom-file -- copy and edit the definition for `tapas-tasks` from [line 28-30](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/.github/workflows/build-and-deploy.yml#L28-L30) -- update the `mvn` command used to build your service to point to the `pom.xml` file of your new service (see [line 29](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/.github/workflows/build-and-deploy.yml#L29)) -- update the `cp` command to point to the JAR file of your new service directive (see [line 30](https://github.com/scs-asse/tapas/blob/424a5f5aa2d6524acfe95d93000571884ed9d66f/.github/workflows/build-and-deploy.yml#L30)) - - note you will need to update the complete file path (folder structure and JAR name) - -### How to Run Your Service Locally - -You can run and test your micro-service on your local machine just like a regular Maven project: - -- Run from IntelliJ: - - Reload _pom.xml_ if necessary - - Run the micro-service's main class from IntelliJ for all required projects -- Use Maven to run from the command line: - -```shell -mvn spring-boot:run -``` - -## How to Deploy on your VM - -1. Start your Ubuntu VM on Switch. - - VM shuts down automatically at 2 AM - - Group admins can do this via https://engines.switch.ch/horizon -2. Push new code to the _main_ branch - - Check the status of the workflow on the _Actions_ page of the GitHub project - - We recommend to test your project locally before pushing the code to GitHub. The GitHub Organizations - used in the course are on a free tier plan, which comes with [various limits](https://github.com/pricing). -3. Open in your browser `https://app..nip.io` - -For the server IP address (see below), you should use dashes instead of dots, e.g.: `127.0.0.1` becomes `127-0-0-1`. +- [docker-compose.yml](docker-compose.yml): Docker Compose configuration file for local development ## VM Configurations Specs (we can upgrade if needed): -- 1 CPU -- 2 GB RAM -- 20 GB HD -- Ubuntu 20.04 +- 1 CPU +- 2 GB RAM +- 20 GB HD +- Ubuntu 20.04 | Name | Server IP | | ------------------ | ------------- | @@ -128,8 +66,3 @@ Specs (we can upgrade if needed): | SCS-ASSE-VM-Group3 | 86.119.34.242 | | SCS-ASSE-VM-Group4 | 86.119.35.199 | | SCS-ASSE-VM-Group5 | 86.119.35.72 | - -## Architecture Decision Records - -We recommend you to use [adr-tools](https://github.com/npryce/adr-tools) to manage your ADRs here in -this GitHub project in a dedicated folder. The tool works best on a Mac OS or Linux machine. diff --git a/app/Dockerfile b/app/Dockerfile deleted file mode 100644 index 429a177..0000000 --- a/app/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# Dockerfile/Docker-Compose file based on an initial version authored by Alexander Lontke (ASSE, Fall Semester 2021) - -FROM maven as build - -COPY . /app - -RUN mvn -f app/pom.xml --batch-mode --update-snapshots verify - -FROM openjdk - -COPY --from=build /app/target/app-0.1.0.jar ./app-0.1.0.jar - -CMD java -jar app-0.1.0.jar diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/in/TaskAvailableCommand.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/in/TaskAvailableCommand.java deleted file mode 100644 index 3accee9..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/in/TaskAvailableCommand.java +++ /dev/null @@ -1,21 +0,0 @@ -package ch.unisg.executorbase.executor.application.port.in; - -import javax.validation.constraints.NotNull; - -import ch.unisg.common.validation.SelfValidating; -import ch.unisg.executorbase.executor.domain.ExecutorType; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class TaskAvailableCommand extends SelfValidating { - - @NotNull - private final ExecutorType taskType; - - public TaskAvailableCommand(ExecutorType taskType) { - this.taskType = taskType; - this.validateSelf(); - } -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/in/TaskAvailableUseCase.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/in/TaskAvailableUseCase.java deleted file mode 100644 index 5e000da..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/in/TaskAvailableUseCase.java +++ /dev/null @@ -1,5 +0,0 @@ -package ch.unisg.executorbase.executor.application.port.in; - -public interface TaskAvailableUseCase { - void newTaskAvailable(TaskAvailableCommand command); -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/ExecutionFinishedEventPort.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/ExecutionFinishedEventPort.java deleted file mode 100644 index ef65922..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/ExecutionFinishedEventPort.java +++ /dev/null @@ -1,7 +0,0 @@ -package ch.unisg.executorbase.executor.application.port.out; - -import ch.unisg.executorbase.executor.domain.ExecutionFinishedEvent; - -public interface ExecutionFinishedEventPort { - void publishExecutionFinishedEvent(ExecutionFinishedEvent event); -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/GetAssignmentPort.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/GetAssignmentPort.java deleted file mode 100644 index 95dc15d..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/GetAssignmentPort.java +++ /dev/null @@ -1,9 +0,0 @@ -package ch.unisg.executorbase.executor.application.port.out; - -import ch.unisg.common.valueobject.ExecutorURI; -import ch.unisg.executorbase.executor.domain.ExecutorType; -import ch.unisg.executorbase.executor.domain.Task; - -public interface GetAssignmentPort { - Task getAssignment(ExecutorType executorType, ExecutorURI executorURI); -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/NotifyExecutorPoolPort.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/NotifyExecutorPoolPort.java deleted file mode 100644 index 1d4d3d3..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/port/out/NotifyExecutorPoolPort.java +++ /dev/null @@ -1,8 +0,0 @@ -package ch.unisg.executorbase.executor.application.port.out; - -import ch.unisg.common.valueobject.ExecutorURI; -import ch.unisg.executorbase.executor.domain.ExecutorType; - -public interface NotifyExecutorPoolPort { - boolean notifyExecutorPool(ExecutorURI executorURI, ExecutorType executorType); -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/service/NotifyExecutorPoolService.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/service/NotifyExecutorPoolService.java deleted file mode 100644 index aee3142..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/service/NotifyExecutorPoolService.java +++ /dev/null @@ -1,16 +0,0 @@ -package ch.unisg.executorbase.executor.application.service; - -import ch.unisg.common.valueobject.ExecutorURI; -import ch.unisg.executorbase.executor.application.port.out.NotifyExecutorPoolPort; -import ch.unisg.executorbase.executor.domain.ExecutorType; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class NotifyExecutorPoolService { - - private final NotifyExecutorPoolPort notifyExecutorPoolPort; - - public boolean notifyExecutorPool(ExecutorURI executorURI, ExecutorType executorType) { - return notifyExecutorPoolPort.notifyExecutorPool(executorURI, executorType); - } -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/service/TaskAvailableService.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/application/service/TaskAvailableService.java deleted file mode 100644 index bdd06e6..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/application/service/TaskAvailableService.java +++ /dev/null @@ -1,20 +0,0 @@ -package ch.unisg.executorbase.executor.application.service; - -import org.springframework.stereotype.Component; - -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import lombok.RequiredArgsConstructor; - -import javax.transaction.Transactional; - -@RequiredArgsConstructor -@Component -@Transactional -public class TaskAvailableService implements TaskAvailableUseCase { - - @Override - public void newTaskAvailable(TaskAvailableCommand command) { - // Placeholder so spring can create a bean, implementation of this service is inside the individual executors - } -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutionFinishedEvent.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutionFinishedEvent.java deleted file mode 100644 index 56637c4..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutionFinishedEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package ch.unisg.executorbase.executor.domain; - -import lombok.Getter; - -public class ExecutionFinishedEvent { - - @Getter - private String taskID; - - @Getter - private String outputData; - - @Getter - private String status; - - public ExecutionFinishedEvent(String taskID, String outputData, String status) { - this.taskID = taskID; - this.outputData = outputData; - this.status = status; - } -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorBase.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorBase.java deleted file mode 100644 index aeafb4d..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorBase.java +++ /dev/null @@ -1,93 +0,0 @@ -package ch.unisg.executorbase.executor.domain; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import ch.unisg.common.valueobject.ExecutorURI; -import ch.unisg.executorbase.executor.adapter.out.web.ExecutionFinishedEventAdapter; -import ch.unisg.executorbase.executor.adapter.out.web.GetAssignmentAdapter; -import ch.unisg.executorbase.executor.adapter.out.web.NotifyExecutorPoolAdapter; -import ch.unisg.executorbase.executor.application.port.out.ExecutionFinishedEventPort; -import ch.unisg.executorbase.executor.application.port.out.GetAssignmentPort; -import ch.unisg.executorbase.executor.application.port.out.NotifyExecutorPoolPort; -import ch.unisg.executorbase.executor.application.service.NotifyExecutorPoolService; -import lombok.Getter; - -public abstract class ExecutorBase { - - @Getter - private ExecutorURI executorURI; - - @Getter - private ExecutorType executorType; - - @Getter - private ExecutorStatus status; - - // TODO Violation of the Dependency Inversion Principle?, - // TODO do this with only services - private final NotifyExecutorPoolPort notifyExecutorPoolPort = new NotifyExecutorPoolAdapter(); - private final NotifyExecutorPoolService notifyExecutorPoolService = new NotifyExecutorPoolService(notifyExecutorPoolPort); - private final GetAssignmentPort getAssignmentPort = new GetAssignmentAdapter(); - private final ExecutionFinishedEventPort executionFinishedEventPort = new ExecutionFinishedEventAdapter(); - - Logger logger = Logger.getLogger(ExecutorBase.class.getName()); - - protected ExecutorBase(ExecutorType executorType, String uri) { - logger.info("ExecutorBase | Starting Executor"); - this.status = ExecutorStatus.STARTING_UP; - this.executorType = executorType; - this.executorURI = new ExecutorURI(uri); - // TODO do this in main - // Notify executor-pool about existence. If executor-pools response is successfull start with getting an assignment, else shut down executor. - logger.info("ExecutorBase | Notifying executor-pool about existens"); - if(!notifyExecutorPoolService.notifyExecutorPool(this.executorURI, this.executorType)) { - logger.log(Level.WARNING, "ExecutorBase | Executor could not connect to executor pool! Shuting down!"); - System.exit(0); - } else { - logger.info("ExecutorBase | Executor conntected to executor pool"); - this.status = ExecutorStatus.IDLING; - getAssignment(); - } - } - - /** - * Requests a new task from the task queue - * @return void - **/ - public void getAssignment() { - Task newTask = getAssignmentPort.getAssignment(this.getExecutorType(), this.getExecutorURI()); - if (newTask != null) { - logger.info("ExecutorBase | Executor got a new task"); - this.executeTask(newTask); - } else { - logger.info("ExecutorBase | Executor got no new task"); - this.status = ExecutorStatus.IDLING; - } - } - - /** - * Start the execution of a task - * @return void - **/ - private void executeTask(Task task) { - logger.info("ExecutorBase | Starting execution"); - this.status = ExecutorStatus.EXECUTING; - - task.setOutputData(execution(task.getInputData())); - - // TODO implement logic if execution was not successful - executionFinishedEventPort.publishExecutionFinishedEvent( - new ExecutionFinishedEvent(task.getTaskID(), task.getOutputData(), "SUCCESS")); - - logger.info("ExecutorBase | Finish execution"); - getAssignment(); - } - - /** - * Implementation of the actual execution method of an executor - * @return the execution result - **/ - protected abstract String execution(String input); - -} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java deleted file mode 100644 index 5ad22a7..0000000 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java +++ /dev/null @@ -1,22 +0,0 @@ -package ch.unisg.executorbase.executor.domain; - -public enum ExecutorType { - COMPUTATION, SMALLROBOT, HUMIDITY; - - /** - * Checks if the give executor type exists. - * @return Whether the given executor type exists - **/ - public static boolean contains(String test) { - - for (ExecutorType x : ExecutorType.values()) { - if (x.name().equals(test)) { - return true; - } - } - return false; - } -} - - - diff --git a/executor-base/src/main/java/ch/unisg/executorbase/Executor.java b/executor-base/src/main/java/ch/unisg/executorbase/Executor.java new file mode 100644 index 0000000..87e35c9 --- /dev/null +++ b/executor-base/src/main/java/ch/unisg/executorbase/Executor.java @@ -0,0 +1,66 @@ +package ch.unisg.executorbase; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import ch.unisg.common.valueobject.ExecutorURI; +import ch.unisg.executorbase.services.GetAssignmentService; +import ch.unisg.executorbase.services.NotifyExecutorPoolService; +import lombok.Getter; + +@Component +public class Executor { + + @Getter + ExecutorStatus executorStatus = ExecutorStatus.STARTING_UP; + + @Getter + @Value("${executor.type}") + String executorType; + + @Getter + @Value("${executor.uri}") + ExecutorURI executorUri; + + @Autowired + NotifyExecutorPoolService notifyExecutorPoolService; + + @Autowired + GetAssignmentService getAssignmentService; + + private Logger logger = Logger.getLogger(Executor.class.getName()); + + public Executor() { + executorStatus = ExecutorStatus.IDLING; + } + + public void init() { + if(!notifyExecutorPoolService.executorStarted(this.executorUri, this.executorType)) { + logger.log(Level.WARNING, "ExecutorBase | Executor could not connect to executor pool! Shuting down!"); + System.exit(0); + } else { + logger.info("ExecutorBase | Executor conntected to executor pool"); + this.setIdling(); + getAssignmentService.getAssignment(); + } + } + + // @PreDestroy + // public void preDestroy() { + // System.out.println("TEST"); + // notifyExecutorPoolService.executorStopped(this.executorUri); + // } + + public void setIdling() { + this.executorStatus = ExecutorStatus.IDLING; + } + + public void setExecuting() { + this.executorStatus = ExecutorStatus.EXECUTING; + } + +} diff --git a/executor-base/src/main/java/ch/unisg/executorbase/ExecutorBase.java b/executor-base/src/main/java/ch/unisg/executorbase/ExecutorBase.java new file mode 100644 index 0000000..fbd8cb5 --- /dev/null +++ b/executor-base/src/main/java/ch/unisg/executorbase/ExecutorBase.java @@ -0,0 +1,27 @@ +package ch.unisg.executorbase; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +import org.springframework.beans.factory.annotation.Autowired; + +import ch.unisg.executorbase.services.NotifyExecutorPoolService; + +public class ExecutorBase { + + @Autowired + Executor executor; + + @Autowired + NotifyExecutorPoolService notifyExecutorPoolService; + + @PostConstruct + private void initialiseRoster(){ + executor.init(); + } + + @PreDestroy + public void test() { + System.out.println("TEST"); + } +} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorStatus.java b/executor-base/src/main/java/ch/unisg/executorbase/ExecutorStatus.java similarity index 81% rename from executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorStatus.java rename to executor-base/src/main/java/ch/unisg/executorbase/ExecutorStatus.java index 1fcf7de..8ac44ed 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorStatus.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/ExecutorStatus.java @@ -1,4 +1,4 @@ -package ch.unisg.executorbase.executor.domain; +package ch.unisg.executorbase; public enum ExecutorStatus { STARTING_UP, // Executor is starting diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/Task.java b/executor-base/src/main/java/ch/unisg/executorbase/Task.java similarity index 91% rename from executor-base/src/main/java/ch/unisg/executorBase/executor/domain/Task.java rename to executor-base/src/main/java/ch/unisg/executorbase/Task.java index aaf4422..ad07039 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/Task.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/Task.java @@ -1,4 +1,4 @@ -package ch.unisg.executorbase.executor.domain; +package ch.unisg.executorbase; import lombok.Getter; import lombok.Setter; diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/in/web/TaskAvailableController.java b/executor-base/src/main/java/ch/unisg/executorbase/controller/TaskAvailableController.java similarity index 53% rename from executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/in/web/TaskAvailableController.java rename to executor-base/src/main/java/ch/unisg/executorbase/controller/TaskAvailableController.java index 22a1708..8356bd0 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/in/web/TaskAvailableController.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/controller/TaskAvailableController.java @@ -1,7 +1,9 @@ -package ch.unisg.executorbase.executor.adapter.in.web; +package ch.unisg.executorbase.controller; +import java.util.concurrent.CompletableFuture; import java.util.logging.Logger; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -9,17 +11,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import ch.unisg.executorbase.executor.domain.ExecutorType; +import ch.unisg.executorbase.services.TaskAvailableService; @RestController public class TaskAvailableController { - private final TaskAvailableUseCase taskAvailableUseCase; - public TaskAvailableController(TaskAvailableUseCase taskAvailableUseCase) { - this.taskAvailableUseCase = taskAvailableUseCase; - } + @Autowired + private TaskAvailableService taskAvailableService; Logger logger = Logger.getLogger(TaskAvailableController.class.getName()); @@ -27,16 +25,12 @@ public class TaskAvailableController { * Controller for notification about new events. * @return 200 OK **/ - @GetMapping(path = "/newtask/{taskType}", consumes = { "application/json" }) + @GetMapping(path = "/newtask/{taskType}") public ResponseEntity retrieveTaskFromTaskList(@PathVariable("taskType") String taskType) { logger.info("ExecutorBase | New " + taskType + " task available"); - if (ExecutorType.contains(taskType.toUpperCase())) { - TaskAvailableCommand command = new TaskAvailableCommand( - ExecutorType.valueOf(taskType.toUpperCase())); - taskAvailableUseCase.newTaskAvailable(command); - } + CompletableFuture.runAsync(() -> taskAvailableService.newTaskAvailable(taskType.toUpperCase())); // Add the content type as a response header HttpHeaders responseHeaders = new HttpHeaders(); diff --git a/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java new file mode 100644 index 0000000..6827fde --- /dev/null +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java @@ -0,0 +1,42 @@ +package ch.unisg.executorbase.services; + +import java.util.logging.Logger; + +import org.springframework.beans.factory.annotation.Autowired; + +import ch.unisg.executorbase.Executor; +import ch.unisg.executorbase.Task; + +public abstract class ExecuteTaskServiceBase implements ExecuteTaskServiceInterface { + + private Logger logger = Logger.getLogger(ExecuteTaskServiceBase.class.getName()); + + @Autowired + private Executor executor; + + @Autowired + private GetAssignmentService getAssignmentService; + + @Autowired + private ExecutionFinishedService executionFinishedService; + + /** + * Start the execution of a task + * @return void + **/ + public void executeTask(Task task) { + + logger.info("ExecutorBase | Starting execution"); + executor.setExecuting(); + + task.setOutputData(execution(task.getInputData())); + + // TODO implement logic if execution was not successful + executionFinishedService.publishExecutionFinishedEvent(task.getTaskID(), task.getOutputData(), "SUCCESS"); + + logger.info("ExecutorBase | Finish execution"); + getAssignmentService.getAssignment(); + + } + +} diff --git a/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceInterface.java b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceInterface.java new file mode 100644 index 0000000..d5b7328 --- /dev/null +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceInterface.java @@ -0,0 +1,13 @@ +package ch.unisg.executorbase.services; + +import ch.unisg.executorbase.Task; + +public interface ExecuteTaskServiceInterface { + void executeTask(Task task); + + /** + * Implementation of the actual execution method of an executor + * @return the execution result + **/ + String execution(String input); +} diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/ExecutionFinishedEventAdapter.java b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java similarity index 58% rename from executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/ExecutionFinishedEventAdapter.java rename to executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java index ab11b49..92f74d2 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/ExecutionFinishedEventAdapter.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java @@ -1,4 +1,4 @@ -package ch.unisg.executorbase.executor.adapter.out.web; +package ch.unisg.executorbase.services; import java.io.IOException; import java.net.URI; @@ -9,36 +9,34 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; -import ch.unisg.executorbase.executor.application.port.out.ExecutionFinishedEventPort; -import ch.unisg.executorbase.executor.domain.ExecutionFinishedEvent; +@Component +public class ExecutionFinishedService { -public class ExecutionFinishedEventAdapter implements ExecutionFinishedEventPort { + @Value("${roster.uri}") + private String rosterUri; - String server = System.getenv("ROSTER_URI") == null ? - "http://localhost:8082" : System.getenv("ROSTER_URI"); - - - Logger logger = Logger.getLogger(ExecutionFinishedEventAdapter.class.getName()); + private Logger logger = Logger.getLogger(ExecutionFinishedService.class.getName()); /** * Publishes the execution finished event * @return void **/ - @Override - public void publishExecutionFinishedEvent(ExecutionFinishedEvent event) { + public void publishExecutionFinishedEvent(String taskID, String outputData, String status) { logger.log(Level.INFO, "ExecutorBase | Sending finish execution event...."); String body = new JSONObject() - .put("taskID", event.getTaskID()) - .put("outputData", event.getOutputData()) - .put("status", event.getStatus()) + .put("taskID", taskID) + .put("outputData", outputData) + .put("status", status) .toString(); HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(server+"/task/completed")) + .uri(URI.create(rosterUri+"/task/completed")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); @@ -53,7 +51,7 @@ public class ExecutionFinishedEventAdapter implements ExecutionFinishedEventPort logger.log(Level.SEVERE, e.getLocalizedMessage(), e); } - logger.log(Level.INFO, "ExecutorBase | Finish execution event sent with result: {0}", event.getOutputData()); + logger.log(Level.INFO, "ExecutorBase | Finish execution event sent with result: {0}", outputData); } } diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/GetAssignmentAdapter.java b/executor-base/src/main/java/ch/unisg/executorbase/services/GetAssignmentService.java similarity index 62% rename from executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/GetAssignmentAdapter.java rename to executor-base/src/main/java/ch/unisg/executorbase/services/GetAssignmentService.java index 361bd97..3eb2c6d 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/GetAssignmentAdapter.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/GetAssignmentService.java @@ -1,4 +1,4 @@ -package ch.unisg.executorbase.executor.adapter.out.web; +package ch.unisg.executorbase.services; import java.io.IOException; import java.net.URI; @@ -8,42 +8,57 @@ import java.net.http.HttpResponse; import java.util.logging.Level; import java.util.logging.Logger; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; -import ch.unisg.common.valueobject.ExecutorURI; -import ch.unisg.executorbase.executor.application.port.out.GetAssignmentPort; -import ch.unisg.executorbase.executor.domain.ExecutorType; -import ch.unisg.executorbase.executor.domain.Task; - -import org.json.JSONObject; +import ch.unisg.executorbase.Executor; +import ch.unisg.executorbase.Task; @Component @Primary -public class GetAssignmentAdapter implements GetAssignmentPort { +public class GetAssignmentService { - String server = System.getenv("ROSTER_URI") == null ? - "http://localhost:8082" : System.getenv("ROSTER_URI"); + @Value("${roster.uri}") + String rosterUri; - Logger logger = Logger.getLogger(GetAssignmentAdapter.class.getName()); + Logger logger = Logger.getLogger(GetAssignmentService.class.getName()); + + @Autowired + private Executor executor; + + @Autowired + private ExecuteTaskServiceInterface executeTaskService; + + public void getAssignment() { + Task newTask = requestAssignment(); + if (newTask != null) { + logger.info("ExecutorBase | Executor got a new task"); + executeTaskService.executeTask(newTask); + } else { + logger.info("ExecutorBase | Executor got no new task"); + executor.setIdling(); + } + } /** * Requests a new task assignment * @return the assigned task * @see Task **/ - @Override - public Task getAssignment(ExecutorType executorType, ExecutorURI executorURI) { + private Task requestAssignment() { String body = new JSONObject() - .put("executorType", executorType) - .put("executorURI", executorURI.getValue()) - .toString(); + .put("executorType", executor.getExecutorType()) + .put("executorURI", executor.getExecutorUri().getValue()) + .toString(); HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(server+"/task/apply")) + .uri(URI.create(rosterUri + "/task/apply")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); @@ -72,5 +87,4 @@ public class GetAssignmentAdapter implements GetAssignmentPort { return null; } - } diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/NotifyExecutorPoolAdapter.java b/executor-base/src/main/java/ch/unisg/executorbase/services/NotifyExecutorPoolService.java similarity index 53% rename from executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/NotifyExecutorPoolAdapter.java rename to executor-base/src/main/java/ch/unisg/executorbase/services/NotifyExecutorPoolService.java index ddf3b1b..1a8c58b 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/adapter/out/web/NotifyExecutorPoolAdapter.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/NotifyExecutorPoolService.java @@ -1,4 +1,4 @@ -package ch.unisg.executorbase.executor.adapter.out.web; +package ch.unisg.executorbase.services; import java.io.IOException; import java.net.URI; @@ -9,29 +9,27 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import ch.unisg.common.valueobject.ExecutorURI; -import ch.unisg.executorbase.executor.application.port.out.NotifyExecutorPoolPort; -import ch.unisg.executorbase.executor.domain.ExecutorType; @Component @Primary -public class NotifyExecutorPoolAdapter implements NotifyExecutorPoolPort { +public class NotifyExecutorPoolService { - String server = System.getenv("EXECUTOR_POOL_URI") == null ? - "http://localhost:8083" : System.getenv("EXECUTOR_POOL_URI"); + @Value("${executor.pool.uri}") + String executorPoolUri; - Logger logger = Logger.getLogger(NotifyExecutorPoolAdapter.class.getName()); + Logger logger = Logger.getLogger(NotifyExecutorPoolService.class.getName()); /** * Notifies the executor-pool about the startup of this executor * @return if the notification was successful **/ - @Override - public boolean notifyExecutorPool(ExecutorURI executorURI, ExecutorType executorType) { + public boolean executorStarted(ExecutorURI executorURI, String executorType) { String body = new JSONObject() .put("executorTaskType", executorType) @@ -40,7 +38,7 @@ public class NotifyExecutorPoolAdapter implements NotifyExecutorPoolPort { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(server+"/executor-pool/executors")) + .uri(URI.create(executorPoolUri + "/executor-pool/executors")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); @@ -58,6 +56,28 @@ public class NotifyExecutorPoolAdapter implements NotifyExecutorPoolPort { } return false; - } + } + /** + * Notifies the executor-pool about the shutdown of this executor + **/ + public static void executorStopped(String executorURI) { + System.out.println("TEST"); + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:8083" + "/executor-pool/executors/" + executorURI)) + // .uri(URI.create(executorPoolUri + "/executor-pool/executors/" + executorURI)) + .header("Content-Type", "application/json") + .DELETE() + .build(); + + try { + client.send(request, HttpResponse.BodyHandlers.ofString()); + } catch (InterruptedException e) { + // logger.log(Level.SEVERE, e.getLocalizedMessage(), e); + // Thread.currentThread().interrupt(); + } catch (IOException e) { + // logger.log(Level.SEVERE, e.getLocalizedMessage(), e); + } + } } diff --git a/executor-base/src/main/java/ch/unisg/executorbase/services/TaskAvailableService.java b/executor-base/src/main/java/ch/unisg/executorbase/services/TaskAvailableService.java new file mode 100644 index 0000000..0fa8f9b --- /dev/null +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/TaskAvailableService.java @@ -0,0 +1,28 @@ +package ch.unisg.executorbase.services; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import ch.unisg.executorbase.Executor; +import ch.unisg.executorbase.ExecutorStatus; +import lombok.RequiredArgsConstructor; + +import javax.transaction.Transactional; + +@RequiredArgsConstructor +@Component +@Transactional +public class TaskAvailableService { + + @Autowired + Executor executor; + + @Autowired + GetAssignmentService getAssignmentService; + + public void newTaskAvailable(String taskType) { + if (executor.getExecutorStatus() == ExecutorStatus.IDLING && executor.getExecutorType().equalsIgnoreCase(taskType)) { + getAssignmentService.getAssignment(); + } + } +} diff --git a/executor-base/src/main/resources/application.properties b/executor-base/src/main/resources/application.properties index fa1e940..2161384 100644 --- a/executor-base/src/main/resources/application.properties +++ b/executor-base/src/main/resources/application.properties @@ -1,6 +1,4 @@ -server.port=8081 -roster.url=http://127.0.0.1:8082 -executor.pool.url=http://127.0.0.1:8083 +roster.uri=http://localhost:8082 spring.profiles.active=chaos-monkey chaos.monkey.enabled=false diff --git a/executor-computation/pom.xml b/executor-computation/pom.xml index c6c5167..56b1889 100644 --- a/executor-computation/pom.xml +++ b/executor-computation/pom.xml @@ -78,6 +78,12 @@ js-scriptengine 21.3.0 + + + javax.annotation + javax.annotation-api + 1.3.2 + diff --git a/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecuteTaskService.java b/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecuteTaskService.java new file mode 100644 index 0000000..808ccc1 --- /dev/null +++ b/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecuteTaskService.java @@ -0,0 +1,40 @@ +package ch.unisg.executorcomputation; + +import java.util.logging.Logger; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import ch.unisg.executorbase.services.ExecuteTaskServiceBase; + +@Component +@Primary +public class ExecuteTaskService extends ExecuteTaskServiceBase { + + Logger executorLogger = Logger.getLogger(ExecuteTaskService.class.getName()); + + @Override + public String execution(String input) { + executorLogger.info("Executor | Starting execution with inputData: " + input); + + ScriptEngineManager mgr = new ScriptEngineManager(); + ScriptEngine engine = mgr.getEngineByName("JavaScript"); + + String result = ""; + try { + result = engine.eval(input).toString(); + } catch (ScriptException e1) { + // TODO some logic if execution fails + executorLogger.severe(e1.getMessage()); + return result; + } + + executorLogger.info("Executor | Finish execution"); + return result; + } + +} diff --git a/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java b/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java index 1ee615d..c57303c 100644 --- a/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java +++ b/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java @@ -1,22 +1,30 @@ package ch.unisg.executorcomputation; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; -import ch.unisg.executorcomputation.executor.domain.Executor; +import ch.unisg.executorbase.ExecutorBase; +import ch.unisg.executorbase.services.NotifyExecutorPoolService; @SpringBootApplication -public class ExecutorcomputationApplication { +@ComponentScan({"ch.unisg.executorbase", "ch.unisg.executorcomputation"}) +public class ExecutorcomputationApplication extends ExecutorBase { static Logger logger = Logger.getLogger(ExecutorcomputationApplication.class.getName()); public static void main(String[] args) { + /** + * This is not a nice solution but I didn't get the @PreDestroy hook to work... This is the + * only solution which was working so I had to make the executorStopped function static + * for now. + */ + Thread printingHook = new Thread(() -> NotifyExecutorPoolService.executorStopped("http://executor-computation:8085")); + Runtime.getRuntime().addShutdownHook(printingHook); + SpringApplication.run(ExecutorcomputationApplication.class, args); - Executor.getExecutor(); } } diff --git a/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/adapter/in/web/TaskAvailableController.java b/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/adapter/in/web/TaskAvailableController.java deleted file mode 100644 index a421924..0000000 --- a/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/adapter/in/web/TaskAvailableController.java +++ /dev/null @@ -1,35 +0,0 @@ -package ch.unisg.executorcomputation.executor.adapter.in.web; - -import java.util.concurrent.CompletableFuture; - -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import ch.unisg.executorbase.executor.domain.ExecutorType; - -@RestController -public class TaskAvailableController { - private final TaskAvailableUseCase taskAvailableUseCase; - - public TaskAvailableController(TaskAvailableUseCase taskAvailableUseCase) { - this.taskAvailableUseCase = taskAvailableUseCase; - } - - @GetMapping(path = "/newtask/{taskType}") - public ResponseEntity retrieveTaskFromTaskList(@PathVariable("taskType") String taskType) { - - if (ExecutorType.contains(taskType.toUpperCase())) { - TaskAvailableCommand command = new TaskAvailableCommand( - ExecutorType.valueOf(taskType.toUpperCase())); - CompletableFuture.runAsync(() -> taskAvailableUseCase.newTaskAvailable(command)); - } - - return new ResponseEntity<>("OK", new HttpHeaders(), HttpStatus.OK); - } -} diff --git a/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/application/service/TaskAvailableService.java b/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/application/service/TaskAvailableService.java deleted file mode 100644 index 6a94577..0000000 --- a/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/application/service/TaskAvailableService.java +++ /dev/null @@ -1,28 +0,0 @@ -package ch.unisg.executorcomputation.executor.application.service; - -import org.springframework.stereotype.Component; - -import ch.unisg.executorcomputation.executor.domain.Executor; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import ch.unisg.executorbase.executor.domain.ExecutorStatus; -import lombok.RequiredArgsConstructor; - -import javax.transaction.Transactional; - -@RequiredArgsConstructor -@Component -@Transactional -public class TaskAvailableService implements TaskAvailableUseCase { - - @Override - public void newTaskAvailable(TaskAvailableCommand command) { - - Executor executor = Executor.getExecutor(); - - if (executor.getExecutorType() == command.getTaskType() && - executor.getStatus() == ExecutorStatus.IDLING) { - executor.getAssignment(); - } - } -} diff --git a/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/domain/Executor.java b/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/domain/Executor.java deleted file mode 100644 index bd22336..0000000 --- a/executor-computation/src/main/java/ch/unisg/executorcomputation/executor/domain/Executor.java +++ /dev/null @@ -1,57 +0,0 @@ -package ch.unisg.executorcomputation.executor.domain; - -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; - -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; - -import ch.unisg.executorbase.executor.domain.ExecutorBase; -import ch.unisg.executorbase.executor.domain.ExecutorType; - -public class Executor extends ExecutorBase { - - private static Logger executorLogger = Logger.getLogger(Executor.class.getName()); - - private static final Executor executor = new Executor(ExecutorType.COMPUTATION, "http://localhost:8085"); - - public static Executor getExecutor() { - return executor; - } - - private Executor(ExecutorType executorType, String uri) { - super(executorType, uri); - } - - @Override - protected - String execution(String inputData) { - - executorLogger.info("Executor | Starting execution with inputData: " + inputData); - - ScriptEngineManager mgr = new ScriptEngineManager(); - ScriptEngine engine = mgr.getEngineByName("JavaScript"); - - String result = ""; - try { - result = engine.eval(inputData).toString(); - } catch (ScriptException e1) { - // TODO some logic if execution fails - executorLogger.severe(e1.getMessage()); - return result; - } - - try { - TimeUnit.SECONDS.sleep(1); - } catch (InterruptedException e) { - return result; - // executorLogger.log(Level.SEVERE, e.getLocalizedMessage(), e); - // Thread.currentThread().interrupt(); - } - - executorLogger.info("Executor | Finish execution"); - return result; - } - -} diff --git a/executor-computation/src/main/resources/application.properties b/executor-computation/src/main/resources/application.properties index c65664e..576a636 100644 --- a/executor-computation/src/main/resources/application.properties +++ b/executor-computation/src/main/resources/application.properties @@ -1,5 +1,10 @@ server.port=8085 +executor.type=COMPUTATION +executor.uri=http://localhost:8085 +roster.uri=http://localhost:8082 +executor.pool.uri=http://localhost:8083 + spring.profiles.active=chaos-monkey chaos.monkey.enabled=false management.endpoint.chaosmonkey.enabled=true diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecuteTaskService.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecuteTaskService.java new file mode 100644 index 0000000..a1077c9 --- /dev/null +++ b/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecuteTaskService.java @@ -0,0 +1,27 @@ +package ch.unisg.executorhumidity; + +import java.util.logging.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import ch.unisg.executorbase.services.ExecuteTaskServiceBase; + +@Component +@Primary +public class ExecuteTaskService extends ExecuteTaskServiceBase { + + @Autowired + GetHumidityService getHumidityService; + + private Logger executorLogger = Logger.getLogger(ExecuteTaskService.class.getName()); + + @Override + public String execution(String input) { + executorLogger.info("Executor | Starting execution with inputData: " + input); + + return getHumidityService.getHumidity(); + } + +} diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecutorhumidityApplication.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecutorhumidityApplication.java index 28f2536..499ffee 100644 --- a/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecutorhumidityApplication.java +++ b/executor-humidity/src/main/java/ch/unisg/executorhumidity/ExecutorhumidityApplication.java @@ -2,15 +2,24 @@ package ch.unisg.executorhumidity; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; -import ch.unisg.executorhumidity.executor.domain.Executor; +import ch.unisg.executorbase.ExecutorBase; +import ch.unisg.executorbase.services.NotifyExecutorPoolService; @SpringBootApplication -public class ExecutorhumidityApplication { +@ComponentScan({"ch.unisg.executorbase", "ch.unisg.executorhumidity"}) +public class ExecutorhumidityApplication extends ExecutorBase { public static void main(String[] args) { + /** + * This is not a nice solution but I didn't get the @PreDestroy hook to work... This is the + * only solution which was working so I had to make the executorStopped function static + * for now. + */ + Thread printingHook = new Thread(() -> NotifyExecutorPoolService.executorStopped("http://executor-humidity:8087")); + Runtime.getRuntime().addShutdownHook(printingHook); SpringApplication.run(ExecutorhumidityApplication.class, args); - Executor.getExecutor(); } } diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/adapter/out/GetHumidityAdapter.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/GetHumidityService.java similarity index 77% rename from executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/adapter/out/GetHumidityAdapter.java rename to executor-humidity/src/main/java/ch/unisg/executorhumidity/GetHumidityService.java index 92e6372..aa93395 100644 --- a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/adapter/out/GetHumidityAdapter.java +++ b/executor-humidity/src/main/java/ch/unisg/executorhumidity/GetHumidityService.java @@ -1,23 +1,4 @@ -package ch.unisg.executorhumidity.executor.adapter.out; - -import ch.unisg.executorhumidity.executor.application.port.out.GetHumidityPort; -import ch.unisg.ics.interactions.wot.td.ThingDescription; -import ch.unisg.ics.interactions.wot.td.affordances.Form; -import ch.unisg.ics.interactions.wot.td.affordances.PropertyAffordance; -import ch.unisg.ics.interactions.wot.td.clients.TDCoapRequest; -import ch.unisg.ics.interactions.wot.td.clients.TDCoapResponse; -import ch.unisg.ics.interactions.wot.td.io.TDGraphReader; -import ch.unisg.ics.interactions.wot.td.schemas.ObjectSchema; -import ch.unisg.ics.interactions.wot.td.vocabularies.TD; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +package ch.unisg.executorhumidity; import java.io.IOException; import java.io.StringReader; @@ -32,15 +13,29 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import ch.unisg.ics.interactions.wot.td.ThingDescription; +import ch.unisg.ics.interactions.wot.td.affordances.Form; +import ch.unisg.ics.interactions.wot.td.affordances.PropertyAffordance; +import ch.unisg.ics.interactions.wot.td.clients.TDCoapRequest; +import ch.unisg.ics.interactions.wot.td.clients.TDCoapResponse; +import ch.unisg.ics.interactions.wot.td.io.TDGraphReader; +import ch.unisg.ics.interactions.wot.td.schemas.ObjectSchema; +import ch.unisg.ics.interactions.wot.td.vocabularies.TD; @Component -@Primary -public class GetHumidityAdapter implements GetHumidityPort { +public class GetHumidityService { - String endpoint = System.getenv("SEARCH_ENGINE_URI") == null ? - "https://api.interactions.ics.unisg.ch/search/searchEngine" : System.getenv("SEARCH_ENGINE_URI"); + @Value("${search.engine.uri}") + String endpoint; - @Override public String getHumidity() { String input = "@prefix dct: . select ?title where { ?title dct:title 'Mirogate' }"; @@ -83,18 +78,14 @@ public class GetHumidityAdapter implements GetHumidityPort { if (humidity.isPresent()) { Optional
form = humidity.get().getFirstFormForOperationType(TD.readProperty); - // System.out.println(humidity.get().getDataSchema().getDatatype()); if (form.isPresent()) { TDCoapRequest request = new TDCoapRequest(form.get(), TD.readProperty); - try { - TDCoapResponse response = request.execute(); - Map payload = response.getPayloadAsObject((ObjectSchema) humidity.get().getDataSchema()); - Object result = payload.get("https://interactions.ics.unisg.ch/mirogate#HumidityValue"); - return result.toString(); - } catch (IOException e) { - e.printStackTrace(); - } + TDCoapResponse response = request.execute(); + Map payload = response.getPayloadAsObject((ObjectSchema) humidity.get().getDataSchema()); + Object result = payload.get("https://interactions.ics.unisg.ch/mirogate#HumidityValue"); + return result.toString(); + } } diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/adapter/in/web/TaskAvailableController.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/adapter/in/web/TaskAvailableController.java deleted file mode 100644 index b66472c..0000000 --- a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/adapter/in/web/TaskAvailableController.java +++ /dev/null @@ -1,38 +0,0 @@ -package ch.unisg.executorhumidity.executor.adapter.in.web; - -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import ch.unisg.executorbase.executor.domain.ExecutorType; - -import java.util.concurrent.CompletableFuture; - -@RestController -public class TaskAvailableController { - private final TaskAvailableUseCase taskAvailableUseCase; - - public TaskAvailableController(TaskAvailableUseCase taskAvailableUseCase) { - this.taskAvailableUseCase = taskAvailableUseCase; - } - - @GetMapping(path="/newtask/{taskType}") - public ResponseEntity retrieveTaskfromTaskList(@PathVariable("taskType") String taskType) { - - if (ExecutorType.contains(taskType.toUpperCase())) { - TaskAvailableCommand command = new TaskAvailableCommand( - ExecutorType.valueOf(taskType.toUpperCase())); - CompletableFuture.runAsync(() -> taskAvailableUseCase.newTaskAvailable(command)); - } - - // Add the content type as a response header - HttpHeaders responseHeaders = new HttpHeaders(); - - return new ResponseEntity<>("OK", responseHeaders, HttpStatus.OK); - } -} diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/application/port/out/GetHumidityPort.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/application/port/out/GetHumidityPort.java deleted file mode 100644 index d2cda18..0000000 --- a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/application/port/out/GetHumidityPort.java +++ /dev/null @@ -1,9 +0,0 @@ -package ch.unisg.executorhumidity.executor.application.port.out; - -import org.eclipse.californium.elements.exception.ConnectorException; - -import java.io.IOException; - -public interface GetHumidityPort { - String getHumidity(); -} diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/application/service/TaskAvailableService.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/application/service/TaskAvailableService.java deleted file mode 100644 index 0e467c4..0000000 --- a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/application/service/TaskAvailableService.java +++ /dev/null @@ -1,27 +0,0 @@ -package ch.unisg.executorhumidity.executor.application.service; - -import ch.unisg.executorbase.executor.domain.ExecutorStatus; -import ch.unisg.executorhumidity.executor.domain.Executor; -import org.springframework.stereotype.Component; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import lombok.RequiredArgsConstructor; - -import javax.transaction.Transactional; - -@RequiredArgsConstructor -@Component -@Transactional -public class TaskAvailableService implements TaskAvailableUseCase { - - @Override - public void newTaskAvailable(TaskAvailableCommand command) { - - Executor executor = Executor.getExecutor(); - - if(executor.getExecutorType() == command.getTaskType() && - executor.getStatus() == ExecutorStatus.IDLING) { - executor.getAssignment(); - } - } -} diff --git a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/domain/Executor.java b/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/domain/Executor.java deleted file mode 100644 index 9205100..0000000 --- a/executor-humidity/src/main/java/ch/unisg/executorhumidity/executor/domain/Executor.java +++ /dev/null @@ -1,28 +0,0 @@ -package ch.unisg.executorhumidity.executor.domain; - -import ch.unisg.executorbase.executor.domain.ExecutorBase; -import ch.unisg.executorbase.executor.domain.ExecutorType; -import ch.unisg.executorhumidity.executor.adapter.out.GetHumidityAdapter; -import ch.unisg.executorhumidity.executor.application.port.out.GetHumidityPort; - -public class Executor extends ExecutorBase { - - private static final Executor executor = new Executor(ExecutorType.HUMIDITY, "http://localhost:8087"); - - private final GetHumidityPort getHumidityPort = new GetHumidityAdapter(); - - private Executor(ExecutorType executorType, String uri) { - super(executorType, uri); - } - - public static Executor getExecutor() {return executor;} - - - @Override - protected - String execution(String input) { - String result = getHumidityPort.getHumidity(); - - return result; - } -} diff --git a/executor-humidity/src/main/resources/application.properties b/executor-humidity/src/main/resources/application.properties index ceeda42..746213e 100644 --- a/executor-humidity/src/main/resources/application.properties +++ b/executor-humidity/src/main/resources/application.properties @@ -1,6 +1,10 @@ server.port=8087 search.engine.uri=https://api.interactions.ics.unisg.ch/search/searchEngine +executor.type=HUMIDITY +executor.uri=http://localhost:8087 +roster.uri=http://localhost:8082 +executor.pool.uri=http://localhost:8083 spring.profiles.active=chaos-monkey chaos.monkey.enabled=false diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/common/clients/TapasMqttClient.java b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/common/clients/TapasMqttClient.java index 0b24b81..1c7dfa8 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/common/clients/TapasMqttClient.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/common/clients/TapasMqttClient.java @@ -1,7 +1,5 @@ package ch.unisg.executorpool.adapter.common.clients; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; @@ -9,7 +7,6 @@ import java.nio.charset.StandardCharsets; import java.util.UUID; public class TapasMqttClient { - private static final Logger LOGGER = LogManager.getLogger(TapasMqttClient.class); private static TapasMqttClient tapasClient = null; diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebController.java b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebController.java index 72f0304..0b446a3 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebController.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebController.java @@ -1,6 +1,5 @@ package ch.unisg.executorpool.adapter.in.web; -import ch.unisg.executorpool.adapter.common.clients.TapasMqttClient; import ch.unisg.executorpool.adapter.common.formats.ExecutorJsonRepresentation; import ch.unisg.executorpool.application.port.in.AddNewExecutorToExecutorPoolUseCase; import ch.unisg.executorpool.application.port.in.AddNewExecutorToExecutorPoolCommand; @@ -14,10 +13,6 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ResponseStatusException; import javax.validation.ConstraintViolationException; import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.UUID; - -import org.eclipse.paho.client.mqttv3.*; @RestController public class AddNewExecutorToExecutorPoolWebController { diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/messaging/PublishExecutorAddedEventAdapter.java b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/messaging/PublishExecutorAddedEventAdapter.java index 323bcbb..346617b 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/messaging/PublishExecutorAddedEventAdapter.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/messaging/PublishExecutorAddedEventAdapter.java @@ -1,6 +1,5 @@ package ch.unisg.executorpool.adapter.out.messaging; -import ch.unisg.common.ConfigProperties; import ch.unisg.executorpool.adapter.common.clients.TapasMqttClient; import ch.unisg.executorpool.adapter.common.formats.ExecutorJsonRepresentation; import ch.unisg.executorpool.application.port.out.ExecutorAddedEventPort; @@ -13,20 +12,12 @@ import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import java.net.URI; - @Component @Primary public class PublishExecutorAddedEventAdapter implements ExecutorAddedEventPort { private static final Logger LOGGER = LogManager.getLogger(PublishExecutorAddedEventAdapter.class); - // TODO Can't autowire. Find fix - /* - @Autowired - private ConfigProperties config; - */ - @Autowired private Environment environment; diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/AddNewExecutorToExecutorPoolCommand.java b/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/AddNewExecutorToExecutorPoolCommand.java index ddd7da9..a352c8f 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/AddNewExecutorToExecutorPoolCommand.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/AddNewExecutorToExecutorPoolCommand.java @@ -1,13 +1,14 @@ package ch.unisg.executorpool.application.port.in; import ch.unisg.common.SelfValidating; -import ch.unisg.executorpool.domain.ExecutorPool; import ch.unisg.executorpool.domain.ExecutorClass.ExecutorUri; import ch.unisg.executorpool.domain.ExecutorClass.ExecutorTaskType; +import lombok.EqualsAndHashCode; import lombok.Value; import javax.validation.constraints.NotNull; @Value +@EqualsAndHashCode(callSuper=false) public class AddNewExecutorToExecutorPoolCommand extends SelfValidating { @NotNull private final ExecutorUri executorUri; diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/GetAllExecutorsInExecutorPoolUseCase.java b/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/GetAllExecutorsInExecutorPoolUseCase.java index b7f2eb7..cee04c2 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/GetAllExecutorsInExecutorPoolUseCase.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/application/port/in/GetAllExecutorsInExecutorPoolUseCase.java @@ -1,7 +1,6 @@ package ch.unisg.executorpool.application.port.in; import ch.unisg.executorpool.domain.ExecutorClass; -import ch.unisg.executorpool.domain.ExecutorPool; import java.util.List; diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java index 5c39427..4310005 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java @@ -16,7 +16,6 @@ import static org.assertj.core.api.BDDAssertions.*; import ch.unisg.executorpool.adapter.common.formats.ExecutorJsonRepresentation; import ch.unisg.executorpool.application.port.out.AddExecutorPort; import ch.unisg.executorpool.domain.ExecutorPool; -import ch.unisg.executorpool.domain.ExecutorClass; import ch.unisg.executorpool.domain.ExecutorClass.ExecutorTaskType; import ch.unisg.executorpool.domain.ExecutorClass.ExecutorUri; @@ -27,16 +26,13 @@ public class AddNewExecutorToExecutorPoolSystemTest { @Autowired private TestRestTemplate restTemplate; - @Autowired - private AddExecutorPort addExecutorPort; - @Test void AddNewExecutorToExecutorPool() throws JSONException { ExecutorTaskType executorTaskType = new ExecutorTaskType("system-integration-test-type"); ExecutorUri executorUri = new ExecutorUri(java.net.URI.create("example.org")); - ResponseEntity response = whenAddNewExecutorToEmptyPool(executorTaskType, executorUri); + ResponseEntity response = whenAddNewExecutorToEmptyPool(executorTaskType, executorUri); JSONObject responseJson = new JSONObject(response.getBody().toString()); String respExecutorUri = responseJson.getString("executorUri"); @@ -50,7 +46,7 @@ public class AddNewExecutorToExecutorPoolSystemTest { } private ResponseEntity whenAddNewExecutorToEmptyPool(ExecutorTaskType executorTaskType, - ExecutorUri executorUri) throws JSONException { + ExecutorUri executorUri) throws JSONException { ExecutorPool.getExecutorPool().getListOfExecutors().getValue().clear(); diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java index 40b7307..f34056f 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java @@ -1,9 +1,6 @@ package ch.unisg.executorpool; -import java.util.Optional; - import ch.unisg.executorpool.application.port.out.LoadExecutorPort; -import org.bson.json.JsonObject; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.mockito.BDDMockito.eq; diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java index a9df873..358deb1 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java @@ -1,7 +1,6 @@ package ch.unisg.executorpool; import java.net.URI; -import java.util.Optional; import org.junit.jupiter.api.Test; diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/ExecuteTaskService.java b/executor-robot/src/main/java/ch/unisg/executorrobot/ExecuteTaskService.java new file mode 100644 index 0000000..6fd091c --- /dev/null +++ b/executor-robot/src/main/java/ch/unisg/executorrobot/ExecuteTaskService.java @@ -0,0 +1,27 @@ +package ch.unisg.executorrobot; + +import java.util.logging.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import ch.unisg.executorbase.services.ExecuteTaskServiceBase; + +@Component +@Primary +public class ExecuteTaskService extends ExecuteTaskServiceBase { + + @Autowired + RobotService robotService; + + private Logger executorLogger = Logger.getLogger(ExecuteTaskService.class.getName()); + + @Override + public String execution(String input) { + executorLogger.info("Executor | Starting execution with inputData: " + input); + robotService.executeRobotTask(); + return ""; + } + +} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java b/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java index 15e2491..9766ba5 100644 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java +++ b/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java @@ -1,18 +1,26 @@ package ch.unisg.executorrobot; -import java.util.concurrent.TimeUnit; - import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; -import ch.unisg.executorrobot.executor.domain.Executor; +import ch.unisg.executorbase.ExecutorBase; +import ch.unisg.executorbase.services.NotifyExecutorPoolService; @SpringBootApplication -public class ExecutorrobotApplication { +@ComponentScan({"ch.unisg.executorbase", "ch.unisg.executorrobot"}) +public class ExecutorrobotApplication extends ExecutorBase { public static void main(String[] args) { + /** + * This is not a nice solution but I didn't get the @PreDestroy hook to work... This is the + * only solution which was working so I had to make the executorStopped function static + * for now. + */ + // Thread printingHook = new Thread(() -> NotifyExecutorPoolService.executorStopped("http://localhost:8084")); + Thread printingHook = new Thread(() -> NotifyExecutorPoolService.executorStopped("http://executor-robot:8084")); + Runtime.getRuntime().addShutdownHook(printingHook); SpringApplication.run(ExecutorrobotApplication.class, args); - Executor.getExecutor(); } } diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java b/executor-robot/src/main/java/ch/unisg/executorrobot/RobotService.java similarity index 90% rename from executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java rename to executor-robot/src/main/java/ch/unisg/executorrobot/RobotService.java index deb4a8b..25e726a 100644 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java +++ b/executor-robot/src/main/java/ch/unisg/executorrobot/RobotService.java @@ -1,4 +1,5 @@ -package ch.unisg.executorrobot.executor.adapter.out; +package ch.unisg.executorrobot; + import java.io.IOException; import java.io.StringReader; import java.net.URI; @@ -9,11 +10,20 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + import ch.unisg.ics.interactions.wot.td.ThingDescription; import ch.unisg.ics.interactions.wot.td.affordances.ActionAffordance; import ch.unisg.ics.interactions.wot.td.affordances.Form; @@ -27,25 +37,15 @@ import ch.unisg.ics.interactions.wot.td.security.SecurityScheme; import ch.unisg.ics.interactions.wot.td.vocabularies.TD; import ch.unisg.ics.interactions.wot.td.vocabularies.WoTSec; -import org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import ch.unisg.executorrobot.executor.application.port.out.UserToRobotPort; - @Component -@Primary -public class UserToRobotAdapter implements UserToRobotPort { +public class RobotService { - @Override - public String userToRobot() { + @Value("${search.engine.uri}") + String endpoint; - String endpoint = "https://api.interactions.ics.unisg.ch/search/searchEngine"; + private Logger logger = Logger.getLogger(RobotService.class.getName()); + + public String executeRobotTask() { String input = "@prefix dct: . select ?title where { ?title dct:title 'leubot1' }"; @@ -83,10 +83,10 @@ public class UserToRobotAdapter implements UserToRobotPort { ThingDescription td = TDGraphReader.readFromURL(ThingDescription.TDFormat.RDF_TURTLE, leubot1Uri); String apiUrl = getAPIKey(td); - System.out.println("FOUND API URL " + apiUrl); + logger.info("Executor | FOUND API URL " + apiUrl); String apiKey = apiUrl.split("/")[apiUrl.split("/").length-1].split("]")[0]; - System.out.println("FOUND KEY " + apiKey); + logger.info("Executor | FOUND KEY " + apiKey); if(apiKey == null) { // TODO implement logic if execution failed @@ -160,7 +160,7 @@ public class UserToRobotAdapter implements UserToRobotPort { try { TDHttpResponse response = request.execute(); - System.out.println("Received response with status code: " + response.getStatusCode()); + logger.info("Executor | Received response with status code: " + response.getStatusCode()); String url = response.getHeaders().get("Location"); return url; @@ -210,7 +210,7 @@ public class UserToRobotAdapter implements UserToRobotPort { try { TDHttpResponse response = request.execute(); - System.out.println("Received response with status code: " + response.getStatusCode()); + logger.info("Executor | Received response with status code: " + response.getStatusCode()); return true; } catch (IOException e) { e.printStackTrace(); @@ -230,12 +230,11 @@ public class UserToRobotAdapter implements UserToRobotPort { try { var response = client.send(request, HttpResponse.BodyHandlers.ofString()); - System.out.println(response.statusCode()); + logger.info("Executor | Delete user from robot response code: " + response.statusCode()); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } - } diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/in/web/TaskAvailableController.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/in/web/TaskAvailableController.java deleted file mode 100644 index 7f256df..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/in/web/TaskAvailableController.java +++ /dev/null @@ -1,38 +0,0 @@ -package ch.unisg.executorrobot.executor.adapter.in.web; - -import java.util.concurrent.CompletableFuture; - -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import ch.unisg.executorbase.executor.domain.ExecutorType; - -@RestController -public class TaskAvailableController { - private final TaskAvailableUseCase taskAvailableUseCase; - - public TaskAvailableController(TaskAvailableUseCase taskAvailableUseCase) { - this.taskAvailableUseCase = taskAvailableUseCase; - } - - @GetMapping(path = "/newtask/{taskType}") - public ResponseEntity retrieveTaskFromTaskList(@PathVariable("taskType") String taskType) { - - if (ExecutorType.contains(taskType.toUpperCase())) { - TaskAvailableCommand command = new TaskAvailableCommand( - ExecutorType.valueOf(taskType.toUpperCase())); - CompletableFuture.runAsync(() -> taskAvailableUseCase.newTaskAvailable(command)); - } - - // Add the content type as a response header - HttpHeaders responseHeaders = new HttpHeaders(); - - return new ResponseEntity<>("OK", responseHeaders, HttpStatus.OK); - } -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/UserToRobotPort.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/UserToRobotPort.java deleted file mode 100644 index 3da8ded..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/UserToRobotPort.java +++ /dev/null @@ -1,7 +0,0 @@ -package ch.unisg.executorrobot.executor.application.port.out; - -import ch.unisg.executorbase.executor.domain.ExecutorType; - -public interface UserToRobotPort { - String userToRobot(); -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/service/TaskAvailableService.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/service/TaskAvailableService.java deleted file mode 100644 index 5d26502..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/service/TaskAvailableService.java +++ /dev/null @@ -1,28 +0,0 @@ -package ch.unisg.executorrobot.executor.application.service; - -import org.springframework.stereotype.Component; - -import ch.unisg.executorrobot.executor.domain.Executor; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableCommand; -import ch.unisg.executorbase.executor.application.port.in.TaskAvailableUseCase; -import ch.unisg.executorbase.executor.domain.ExecutorStatus; -import lombok.RequiredArgsConstructor; - -import javax.transaction.Transactional; - -@RequiredArgsConstructor -@Component -@Transactional -public class TaskAvailableService implements TaskAvailableUseCase { - - @Override - public void newTaskAvailable(TaskAvailableCommand command) { - - Executor executor = Executor.getExecutor(); - - if (executor.getExecutorType() == command.getTaskType() && - executor.getStatus() == ExecutorStatus.IDLING) { - executor.getAssignment(); - } - } -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java deleted file mode 100644 index 2bf2489..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java +++ /dev/null @@ -1,28 +0,0 @@ -package ch.unisg.executorrobot.executor.domain; - -import ch.unisg.executorrobot.executor.adapter.out.UserToRobotAdapter; -import ch.unisg.executorrobot.executor.application.port.out.UserToRobotPort; -import ch.unisg.executorbase.executor.domain.ExecutorBase; -import ch.unisg.executorbase.executor.domain.ExecutorType; - -public class Executor extends ExecutorBase { - - private static final Executor executor = new Executor(ExecutorType.SMALLROBOT, "http://localhost:8084"); - private final UserToRobotPort userToRobotPort = new UserToRobotAdapter(); - - public static Executor getExecutor() { - return executor; - } - - private Executor(ExecutorType executorType, String uri) { - super(executorType, uri); - } - - @Override - protected - String execution(String input) { - userToRobotPort.userToRobot(); - return ""; - } - -} diff --git a/executor-robot/src/main/resources/application.properties b/executor-robot/src/main/resources/application.properties index 5e3bb81..67039aa 100644 --- a/executor-robot/src/main/resources/application.properties +++ b/executor-robot/src/main/resources/application.properties @@ -1 +1,19 @@ server.port=8084 + +executor.type=SMALLROBOT +executor.uri=http://localhost:8084 +roster.uri=http://localhost:8082 +executor.pool.uri=http://localhost:8083 +search.engine.uri=https://api.interactions.ics.unisg.ch/search/searchEngine + +spring.profiles.active=chaos-monkey +chaos.monkey.enabled=false +management.endpoint.chaosmonkey.enabled=true +management.endpoint.chaosmonkeyjmx.enabled=true +# include specific endpoints +management.endpoints.web.exposure.include=health,info,chaosmonkey +chaos.monkey.watcher.controller=true +chaos.monkey.watcher.restController=true +chaos.monkey.watcher.service=true +chaos.monkey.watcher.repository=true +chaos.monkey.watcher.component=true diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java index cc4eeba..441846f 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.function.ServerRequest.Headers; import ch.unisg.roster.roster.application.port.in.NewTaskCommand; import ch.unisg.roster.roster.application.port.in.NewTaskUseCase; diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetExecutorsInExecutorPoolWebAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetExecutorsInExecutorPoolWebAdapter.java index c415a27..bb899e6 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetExecutorsInExecutorPoolWebAdapter.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetExecutorsInExecutorPoolWebAdapter.java @@ -4,7 +4,10 @@ import ch.unisg.roster.roster.domain.ExecutorInfo; import org.apache.logging.log4j.Level; import org.json.JSONArray; import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Primary; import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; import java.io.IOException; import java.net.URI; @@ -15,11 +18,12 @@ import java.util.LinkedList; import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; - +@Component +@Primary public class GetExecutorsInExecutorPoolWebAdapter { private static final Logger LOGGER = LogManager.getLogger(GetExecutorsInExecutorPoolWebAdapter.class); - // TODO get from config + @Value("${executor.pool.uri}") String server = "http://localhost:8083"; public List getExecutorsInExecutorPool(){ diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java index d4fa2c3..e8375af 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java @@ -5,29 +5,22 @@ import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; +import ch.unisg.common.valueobject.ExecutorURI; import ch.unisg.roster.roster.application.port.out.NewTaskEventPort; +import ch.unisg.roster.roster.domain.ExecutorRegistry; import ch.unisg.roster.roster.domain.event.NewTaskEvent; @Component @Primary public class PublishNewTaskEventAdapter implements NewTaskEventPort { - @Value("${executor.robot.uri}") - private String server; - - @Value("${executor.computation.uri}") - private String server2; - - @Value("${executor.humidity.uri}") - private String server3; - Logger logger = Logger.getLogger(PublishNewTaskEventAdapter.class.getName()); /** @@ -37,53 +30,26 @@ public class PublishNewTaskEventAdapter implements NewTaskEventPort { @Override public void publishNewTaskEvent(NewTaskEvent event) { - HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(server + "/newtask/" + event.taskType.getValue())) - .GET() - .build(); + Set executors = ExecutorRegistry.getInstance().getExecutorsByType(event.taskType.getValue()); + + for (ExecutorURI uri : executors) { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(uri.getValue() + "/newtask/" + event.taskType.getValue())) + .GET() + .build(); - try { - client.send(request, HttpResponse.BodyHandlers.ofString()); - } catch (InterruptedException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - Thread.currentThread().interrupt(); - } catch (IOException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); + try { + client.send(request, HttpResponse.BodyHandlers.ofString()); + } catch (InterruptedException e) { + logger.log(Level.SEVERE, e.getLocalizedMessage(), e); + Thread.currentThread().interrupt(); + } catch (IOException e) { + logger.log(Level.SEVERE, e.getLocalizedMessage(), e); + } } - HttpClient client2 = HttpClient.newHttpClient(); - HttpRequest request2 = HttpRequest.newBuilder() - .uri(URI.create(server2 + "/newtask/" + event.taskType.getValue())) - .GET() - .build(); - - - try { - client2.send(request2, HttpResponse.BodyHandlers.ofString()); - } catch (InterruptedException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - Thread.currentThread().interrupt(); - } catch (IOException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - } - - HttpClient client3 = HttpClient.newHttpClient(); - HttpRequest request3 = HttpRequest.newBuilder() - .uri(URI.create(server3 + "/newtask/" + event.taskType.getValue())) - .GET() - .build(); - - - try { - client3.send(request3, HttpResponse.BodyHandlers.ofString()); - } catch (InterruptedException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - Thread.currentThread().interrupt(); - } catch (IOException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - } } } diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java index 0902b03..c92736b 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java @@ -45,7 +45,7 @@ public class PublishTaskAssignedEventAdapter implements TaskAssignedEventPort { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(server + "/tasks/" + event.taskID)) - .header("Content-Type", "application/task+json") + .header("Content-Type", "application/json-patch+json") .method("PATCH", HttpRequest.BodyPublishers.ofString(body)) .build(); @@ -57,27 +57,6 @@ public class PublishTaskAssignedEventAdapter implements TaskAssignedEventPort { logger.log(Level.SEVERE, e.getLocalizedMessage(), e); } - - // String body = new JSONObject() - // .put("taskId", event.taskID) - // .toString(); - - // HttpClient client = HttpClient.newHttpClient(); - // HttpRequest request = HttpRequest.newBuilder() - // .uri(URI.create(server + "/tasks/assignTask")) - // .header("Content-Type", "application/task+json") - // .POST(HttpRequest.BodyPublishers.ofString(body)) - // .build(); - - - // try { - // client.send(request, HttpResponse.BodyHandlers.ofString()); - // } catch (InterruptedException e) { - // logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - // Thread.currentThread().interrupt(); - // } catch (IOException e) { - // logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - // } } } diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java index 116121a..35d1891 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java @@ -38,10 +38,10 @@ public class PublishTaskCompletedEventAdapter implements TaskCompletedEventPort JSONObject op1 = new JSONObject() .put("op", "replace") .put("path", "/taskStatus") - .put("value", event.status); + .put("value", "EXECUTED"); JSONObject op2 = new JSONObject() - .put("op", "replace") + .put("op", "add") .put("path", "/outputData") .put("value", event.result); @@ -50,7 +50,7 @@ public class PublishTaskCompletedEventAdapter implements TaskCompletedEventPort HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(server + "/tasks/" + event.taskID)) - .header("Content-Type", "application/task+json") + .header("Content-Type", "application/json-patch+json") .method("PATCH", HttpRequest.BodyPublishers.ofString(body)) .build(); @@ -62,29 +62,6 @@ public class PublishTaskCompletedEventAdapter implements TaskCompletedEventPort logger.log(Level.SEVERE, e.getLocalizedMessage(), e); } - // String body = new JSONObject() - // .put("taskId", event.taskID) - // .put("status", event.status) - // .put("outputData", event.result) - // .toString(); - - // HttpClient client = HttpClient.newHttpClient(); - // HttpRequest request = HttpRequest.newBuilder() - // .uri(URI.create(server + "/tasks/completeTask/")) - // .header("Content-Type", "application/task+json") - // .POST(HttpRequest.BodyPublishers.ofString(body)) - // .build(); - - - // try { - // client.send(request, HttpResponse.BodyHandlers.ofString()); - // } catch (InterruptedException e) { - // logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - // Thread.currentThread().interrupt(); - // } catch (IOException e) { - // logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - // } - } } diff --git a/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java index de28322..7725441 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java +++ b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java @@ -5,8 +5,6 @@ import ch.unisg.common.valueobject.ExecutorURI; import lombok.Getter; import lombok.Setter; -import java.net.URI; - public class ExecutorInfo { @Getter @Setter diff --git a/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java index 67554e7..46d7516 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java +++ b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java @@ -4,6 +4,7 @@ import java.util.*; import ch.unisg.common.valueobject.ExecutorURI; import ch.unisg.roster.roster.domain.valueobject.ExecutorType; +import lombok.Getter; /** * Registry that keeps a track of executors internal to the TAPAS application and the types of tasks @@ -98,4 +99,8 @@ public class ExecutorRegistry { this.executors.putAll(executors); } + public Set getExecutorsByType(String executorType) { + return this.executors.get(new ExecutorType(executorType)); + } + } diff --git a/roster/src/main/resources/application.properties b/roster/src/main/resources/application.properties index 50c4080..61f695d 100644 --- a/roster/src/main/resources/application.properties +++ b/roster/src/main/resources/application.properties @@ -1,9 +1,8 @@ server.port=8082 -executor.robot.uri=http://127.0.0.1:8084 -executor.computation.uri=http://127.0.0.1:8085 -executor.humidity.uri=http://127.0.0.1:8087 + auction.house.uri=http://127.0.0.1:8086 task.list.uri=http://127.0.0.1:8081 +executor.pool.uri=http://localhost:8083 # mqtt.broker.uri=tcp://localhost:1883 mqtt.broker.uri=tcp://broker.hivemq.com diff --git a/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/in/messaging/http/TaskExecutedEventListenerHttpAdapter.java b/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/in/messaging/http/TaskExecutedEventListenerHttpAdapter.java index f1db541..f8341d2 100644 --- a/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/in/messaging/http/TaskExecutedEventListenerHttpAdapter.java +++ b/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/in/messaging/http/TaskExecutedEventListenerHttpAdapter.java @@ -20,11 +20,14 @@ import java.util.Optional; public class TaskExecutedEventListenerHttpAdapter extends TaskEventListener { public Task handleTaskEvent(String taskId, JsonNode payload) { + System.out.println(payload); TaskJsonPatchRepresentation representation = new TaskJsonPatchRepresentation(payload); Optional serviceProvider = representation.extractFirstServiceProviderChange(); Optional outputData = representation.extractFirstOutputDataAddition(); + System.out.println(outputData); + TaskExecutedEvent taskExecutedEvent = new TaskExecutedEvent(new Task.TaskId(taskId), serviceProvider, outputData); TaskExecutedEventHandler taskExecutedEventHandler = new TaskExecutedHandler();