From c32f99c21ce67b2c1c9fe8bc0a985b7db8419156 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Tue, 24 Aug 2021 23:44:13 +0200 Subject: [PATCH 1/9] init executor skeleton --- .gitignore | 1 + application-skeleton-executor/.classpath | 38 ++++++++++++ application-skeleton-executor/.project | 23 ++++++++ application-skeleton-executor/pom.xml | 54 ++++++++++++++++++ .../ExecutorApplicationInitListener.java | 45 +++++++++++++++ .../skeleton/executor/ExecutorMain.java | 20 +++++++ .../configuration/ConfigConstants.java | 18 ++++++ .../ContainerConfProperties.java | 31 ++++++++++ .../configuration/ContainerConfiguration.java | 47 +++++++++++++++ .../controller/ExecutorController.java | 49 ++++++++++++++++ .../security/ExecutorAccessControlFilter.java | 47 +++++++++++++++ .../security/ExecutorSecurityConfig.java | 12 ++++ .../executor/service/ExecutorDriver.java | 12 ++++ .../executor/service/ExecutorService.java | 20 +++++++ .../src/main/resources/application.properties | 36 ++++++++++++ .../resources/certificates/truststore.p12 | Bin 0 -> 1162 bytes pom.xml | 3 +- 17 files changed, 455 insertions(+), 1 deletion(-) create mode 100644 application-skeleton-executor/.classpath create mode 100644 application-skeleton-executor/.project create mode 100644 application-skeleton-executor/pom.xml create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorMain.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ConfigConstants.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfProperties.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfiguration.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorSecurityConfig.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java create mode 100644 application-skeleton-executor/src/main/resources/application.properties create mode 100644 application-skeleton-executor/src/main/resources/certificates/truststore.p12 diff --git a/.gitignore b/.gitignore index 59abfc9..5763f50 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ wrapper /application-skeleton-consumer/target /application-skeleton-publisher/target /application-skeleton-subscriber/target +/application-skeleton-executor/target /mvnw /mvnw.cmd /.settings diff --git a/application-skeleton-executor/.classpath b/application-skeleton-executor/.classpath new file mode 100644 index 0000000..002ad57 --- /dev/null +++ b/application-skeleton-executor/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/application-skeleton-executor/.project b/application-skeleton-executor/.project new file mode 100644 index 0000000..c674556 --- /dev/null +++ b/application-skeleton-executor/.project @@ -0,0 +1,23 @@ + + + arrowhead-application-skeleton-executor + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/application-skeleton-executor/pom.xml b/application-skeleton-executor/pom.xml new file mode 100644 index 0000000..a54eec8 --- /dev/null +++ b/application-skeleton-executor/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + + eu.arrowhead + application-skeleton-java-spring + 4.4.0.0 + + + arrowhead-application-skeleton-executor + Arrowhead Provider Skeleton + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + maven-resources-plugin + 3.1.0 + + + copy-resources + validate + + copy-resources + + + ${basedir}/target + + + src/main/resources + + application.properties + + + + + + + + + + + \ No newline at end of file diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java new file mode 100644 index 0000000..848d5fc --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java @@ -0,0 +1,45 @@ +package eu.arrowhead.application.skeleton.executor; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; + +import ai.aitia.arrowhead.application.library.ArrowheadService; +import ai.aitia.arrowhead.application.library.config.ApplicationInitListener; +import eu.arrowhead.common.core.CoreSystem; + +@Component +public class ExecutorApplicationInitListener extends ApplicationInitListener { + + //================================================================================================= + // members + + @Autowired + private ArrowheadService arrowheadService; + + private final Logger logger = LogManager.getLogger(ExecutorApplicationInitListener.class); + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + @Override + protected void customInit(final ContextRefreshedEvent event) { + + //Checking the availability of necessary core systems + checkCoreSystemReachability(CoreSystem.CHOREOGRAPHER); + + //Initialize Arrowhead Context + arrowheadService.updateCoreServiceURIs(CoreSystem.CHOREOGRAPHER); + + //TODO: implement here any custom behavior on application start up + } + + //------------------------------------------------------------------------------------------------- + @Override + public void customDestroy() { + //TODO: implement here any custom behavior on application shout down + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorMain.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorMain.java new file mode 100644 index 0000000..49bd7bc --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorMain.java @@ -0,0 +1,20 @@ +package eu.arrowhead.application.skeleton.executor; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +import eu.arrowhead.common.CommonConstants; + +@SpringBootApplication +@ComponentScan(basePackages = {CommonConstants.BASE_PACKAGE}) //TODO: add custom packages if any +public class ExecutorMain { + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + public static void main(final String[] args) { + SpringApplication.run(ExecutorMain.class, args); + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ConfigConstants.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ConfigConstants.java new file mode 100644 index 0000000..a5c1d5e --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ConfigConstants.java @@ -0,0 +1,18 @@ +package eu.arrowhead.application.skeleton.executor.configuration; + +public class ConfigConstants { + + //================================================================================================= + // members + + public static final int MIN_MAXKEEPALIVE_REQUESTS = 1; + public static final int MAX_MAXKEEPALIVE_REQUESTS = 1000; + + //================================================================================================= + // assistant methods + + //------------------------------------------------------------------------------------------------- + private ConfigConstants() { + throw new UnsupportedOperationException(); + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfProperties.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfProperties.java new file mode 100644 index 0000000..85cb09b --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfProperties.java @@ -0,0 +1,31 @@ +package eu.arrowhead.application.skeleton.executor.configuration; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.validation.annotation.Validated; + +@Configuration +@PropertySource("classpath:application.properties") +@ConfigurationProperties(prefix = "container") +@Validated +public class ContainerConfProperties { + + //================================================================================================= + // members + + @Min(ConfigConstants.MIN_MAXKEEPALIVE_REQUESTS) + @Max(ConfigConstants.MAX_MAXKEEPALIVE_REQUESTS) + private int maxKeepAliveRequests; + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + + public int getMaxKeepAliveRequests() { return maxKeepAliveRequests; } + public void setMaxKeepAliveRequests(final int maxKeepAliveRequests) { this.maxKeepAliveRequests = maxKeepAliveRequests; } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfiguration.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfiguration.java new file mode 100644 index 0000000..67ec9ca --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/configuration/ContainerConfiguration.java @@ -0,0 +1,47 @@ +package eu.arrowhead.application.skeleton.executor.configuration; + +import org.apache.coyote.http11.AbstractHttp11Protocol; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ContainerConfiguration implements WebServerFactoryCustomizer { + + //================================================================================================= + // members + + @Autowired + ContainerConfProperties containerConfProperties; + + private final Logger log = LogManager.getLogger( ContainerConfiguration.class); + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + @SuppressWarnings("rawtypes") + @Override + public void customize(TomcatServletWebServerFactory factory) { + factory.addConnectorCustomizers(connector -> { + final AbstractHttp11Protocol protocol = (AbstractHttp11Protocol) connector.getProtocolHandler(); + + protocol.setMaxKeepAliveRequests(containerConfProperties.getMaxKeepAliveRequests()); + + log.info("####################################################################################"); + log.info("#"); + log.info("# TomcatCustomizer"); + log.info("#"); + log.info("# custom maxKeepAliveRequests {}", protocol.getMaxKeepAliveRequests()); + log.info("# origin keepalive timeout: {} ms", protocol.getKeepAliveTimeout()); + log.info("# keepalive timeout: {} ms", protocol.getKeepAliveTimeout()); + log.info("# connection timeout: {} ms", protocol.getConnectionTimeout()); + log.info("# max connections: {}", protocol.getMaxConnections()); + log.info("#"); + log.info("####################################################################################"); + }); + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java new file mode 100644 index 0000000..9fe7da4 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java @@ -0,0 +1,49 @@ +package eu.arrowhead.application.skeleton.executor.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import eu.arrowhead.application.skeleton.executor.service.ExecutorService; +import eu.arrowhead.common.CommonConstants; + +@RestController +public class ExecutorController { + + //================================================================================================= + // members + + @Autowired + private ExecutorService executorService; + + //TODO: add your variables here + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + @GetMapping(path = CommonConstants.ECHO_URI) + public String echo() { + return "Got it!"; + } + + //------------------------------------------------------------------------------------------------- + @PostMapping(path = "/start", produces = MediaType.APPLICATION_JSON_VALUE) //TODO: use values from CommonConstans after new release of client library + public void start(@RequestBody final Object request) { //TODO: change input to ChoreographerExecuteStepRequestDTO after new release + //TODO validate + executorService.startExecution(request); + } + + //------------------------------------------------------------------------------------------------- + @PostMapping(path = "/abort", produces = MediaType.APPLICATION_JSON_VALUE) //TODO: use values from CommonConstans after new release of client library + public void abort(@RequestBody final Object request) { //TODO: change input to ChoreographerAbortStepRequestDTO after new release + //TODO validate + executorService.abortExecution(request); + } + + //------------------------------------------------------------------------------------------------- + //TODO: implement here your provider related REST end points +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java new file mode 100644 index 0000000..bc7bef4 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java @@ -0,0 +1,47 @@ +package eu.arrowhead.application.skeleton.executor.security; + +import java.util.Map; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +import eu.arrowhead.common.CommonConstants; +import eu.arrowhead.common.core.CoreSystem; +import eu.arrowhead.common.exception.AuthException; +import eu.arrowhead.common.security.AccessControlFilter; + +@Component +@ConditionalOnProperty(name = CommonConstants.SERVER_SSL_ENABLED, matchIfMissing = true) +public class ExecutorAccessControlFilter extends AccessControlFilter { + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + @Override + protected void checkClientAuthorized(final String clientCN, final String method, final String requestTarget, final String requestJSON, final Map queryParams) { + super.checkClientAuthorized(clientCN, method, requestTarget, requestJSON, queryParams); + + final String cloudCN = getServerCloudCN(); + + if (requestTarget.contains("/start") || + requestTarget.contains("/abort")) { //TODO: use values from CommonConstans after new release of client library + //Only Choreographer Core System is allowed to call this endpoint + checkIfClientIsChoreographer(clientCN, cloudCN); + } + + //TODO: implement here your custom access filter if any further + } + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + private void checkIfClientIsChoreographer(final String clientCN, final String cloudCN) { + final String coreSystemCN = CoreSystem.CHOREOGRAPHER.name().toLowerCase() + "." + cloudCN; + if (!clientCN.equalsIgnoreCase(coreSystemCN)) { + throw new AuthException("Only Choreographer Core System is allowed to call this endpoint", HttpStatus.UNAUTHORIZED.value()); + } + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorSecurityConfig.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorSecurityConfig.java new file mode 100644 index 0000000..b7d918f --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorSecurityConfig.java @@ -0,0 +1,12 @@ +package eu.arrowhead.application.skeleton.executor.security; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; + +import ai.aitia.arrowhead.application.library.config.DefaultSecurityConfig; + +@Configuration +@EnableWebSecurity +public class ExecutorSecurityConfig extends DefaultSecurityConfig { + +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java new file mode 100644 index 0000000..0591891 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java @@ -0,0 +1,12 @@ +package eu.arrowhead.application.skeleton.executor.service; + +import org.springframework.stereotype.Service; + +@Service +public class ExecutorDriver { + + public void notifyChoreographer(final Long sessionId, final Long sessionStepId, final Object status, //TODO ChoreographerExecutedStepStatus after new release + final String message, final String exception) { + //TODO implement + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java new file mode 100644 index 0000000..cda1581 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java @@ -0,0 +1,20 @@ +package eu.arrowhead.application.skeleton.executor.service; + +import org.springframework.stereotype.Service; + +@Service +public class ExecutorService { + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + public void startExecution(final Object request) { //TODO: change input to ChoreographerExecuteStepRequestDTO after new release + //TODO implement your logic here + } + + //------------------------------------------------------------------------------------------------- + public void abortExecution(final Object request) { //TODO: change input to ChoreographerAbortStepRequestDTO after new release + //TODO implement your logic here + } +} diff --git a/application-skeleton-executor/src/main/resources/application.properties b/application-skeleton-executor/src/main/resources/application.properties new file mode 100644 index 0000000..716ae2e --- /dev/null +++ b/application-skeleton-executor/src/main/resources/application.properties @@ -0,0 +1,36 @@ +############################################ +### CUSTOM PARAMETERS ### +############################################ + +# Name of the client system +application_system_name=EXECUTORSKELETON + +# Client web-server parameters +server.address=127.0.0.1 +server.port=8999 + +# Client application-server paramters +container.max_keep_alive_requests=500 + +# Service Registry Core System web-server parameters +sr_address=127.0.0.1 +sr_port=8443 + +############################################ +### SECURE MODE ### +############################################ + +# configure secure mode + +# Set this to false to disable https mode +server.ssl.enabled=true + +server.ssl.key-store-type=PKCS12 +server.ssl.key-store=classpath:certificates/executorskeleton.p12 +server.ssl.key-store-password=123456 +server.ssl.key-alias=executorskeleton +server.ssl.key-password=123456 +server.ssl.client-auth=need +server.ssl.trust-store-type=PKCS12 +server.ssl.trust-store=classpath:certificates/truststore.p12 +server.ssl.trust-store-password=123456 \ No newline at end of file diff --git a/application-skeleton-executor/src/main/resources/certificates/truststore.p12 b/application-skeleton-executor/src/main/resources/certificates/truststore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..6da7cd2d032a7f5616eb0fa1cb6af7757b79f6ae GIT binary patch literal 1162 zcmV;51aZ%2`Yw2hW8Bt2LUiC1_~;MNQUVie#xIu!wo#Sa)KD-Xk4QB8AcV}aBK<6W{yG=*Ik4y&-y->U2_4Q$Dnr zCauJ3Ukce$1d)$#|5fB8D1^syty5TRV#|}`VMuuACkKRJ-P3~KRD&PD-nW{6(#Z0+vGBy7WYOz<<;gEL0Ovq_P`EuN*=#rIPy z;I+Tm!-5FcSb=yyU#vT7wJ&SzhAgXseVzLnq0kV4POCKg1!l@PQ3Jy=H1Y?zVv6rU zt115AxuG=lwv78#zc<7JYP=nL{o#XCWEOieJ~N$cABq@EcPmO?xv;xEQMaL!>$ zV$TK3AiN$@(omV_ioYE^;ks5rqv@ae3CHDG>5pvz0t%a=+3CSUEU$A)n#!u$S|)x}*)IxGFH=r(=OdixR&9U#O|bHhZwlBH4hwER5riuq$dgEB z%_A%V=s!KvT1PgWCspA&^+T9*#pXgP>3+uK{{$Y{i8?Aqd$9(x3!-U)kN?q-H;)+< z$Ayj5@5rvON*`*#NqLk3Zw5>##r&X|LRpm@m^a2BRJwvK={E+x8application-skeleton-provider application-skeleton-subscriber application-skeleton-publisher - + application-skeleton-executor + From 8b2d8e78ca5a79d7545b076915685180b3e4e5f3 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Wed, 25 Aug 2021 00:56:56 +0200 Subject: [PATCH 2/9] executor skeleton impl --- .../controller/ExecutorController.java | 21 +++++--- .../security/ExecutorAccessControlFilter.java | 6 +-- .../executor/service/ExecutorDriver.java | 48 +++++++++++++++-- .../executor/service/ExecutorService.java | 54 ++++++++++++++++++- pom.xml | 10 +++- 5 files changed, 123 insertions(+), 16 deletions(-) diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java index 9fe7da4..bc03e73 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java @@ -5,10 +5,15 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import eu.arrowhead.application.skeleton.executor.service.ExecutorService; import eu.arrowhead.common.CommonConstants; +import eu.arrowhead.common.dto.shared.ChoreographerAbortStepRequestDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecuteStepRequestDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecutorServiceInfoRequestDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecutorServiceInfoResponseDTO; @RestController public class ExecutorController { @@ -31,19 +36,23 @@ public String echo() { } //------------------------------------------------------------------------------------------------- - @PostMapping(path = "/start", produces = MediaType.APPLICATION_JSON_VALUE) //TODO: use values from CommonConstans after new release of client library - public void start(@RequestBody final Object request) { //TODO: change input to ChoreographerExecuteStepRequestDTO after new release - //TODO validate + @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_START_URI, produces = MediaType.APPLICATION_JSON_VALUE) + public void start(@RequestBody final ChoreographerExecuteStepRequestDTO request) { executorService.startExecution(request); } //------------------------------------------------------------------------------------------------- - @PostMapping(path = "/abort", produces = MediaType.APPLICATION_JSON_VALUE) //TODO: use values from CommonConstans after new release of client library - public void abort(@RequestBody final Object request) { //TODO: change input to ChoreographerAbortStepRequestDTO after new release - //TODO validate + @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_ABORT_URI, produces = MediaType.APPLICATION_JSON_VALUE) + public void abort(@RequestBody final ChoreographerAbortStepRequestDTO request) { executorService.abortExecution(request); } + //------------------------------------------------------------------------------------------------- + @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_INFO_URI, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody public ChoreographerExecutorServiceInfoResponseDTO serviceInfo(@RequestBody final ChoreographerExecutorServiceInfoRequestDTO request) { + return executorService.collectServiceInfo(request); + } + //------------------------------------------------------------------------------------------------- //TODO: implement here your provider related REST end points } diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java index bc7bef4..f04ad27 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java @@ -25,9 +25,9 @@ protected void checkClientAuthorized(final String clientCN, final String method, final String cloudCN = getServerCloudCN(); - if (requestTarget.contains("/start") || - requestTarget.contains("/abort")) { //TODO: use values from CommonConstans after new release of client library - //Only Choreographer Core System is allowed to call this endpoint + if (requestTarget.contains(CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_START_URI) || + requestTarget.contains(CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_ABORT_URI)) { + //Only Choreographer Core System is allowed to call this endpoints checkIfClientIsChoreographer(clientCN, cloudCN); } diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java index 0591891..2b1dc4c 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorDriver.java @@ -1,12 +1,54 @@ package eu.arrowhead.application.skeleton.executor.service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import ai.aitia.arrowhead.application.library.ArrowheadService; +import ai.aitia.arrowhead.application.library.util.CoreServiceUri; +import eu.arrowhead.common.CommonConstants; +import eu.arrowhead.common.SSLProperties; +import eu.arrowhead.common.core.CoreSystemService; +import eu.arrowhead.common.dto.shared.ChoreographerExecutedStepResultDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecutedStepStatus; @Service public class ExecutorDriver { - public void notifyChoreographer(final Long sessionId, final Long sessionStepId, final Object status, //TODO ChoreographerExecutedStepStatus after new release - final String message, final String exception) { - //TODO implement + //================================================================================================= + // members + + @Autowired + private ArrowheadService arrowheadService; + + @Autowired + private SSLProperties sslProperties; + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + public void notifyChoreographer(final long sessionId, final long sessionStepId, final ChoreographerExecutedStepStatus status, + final String message, final String exception) { + Assert.notNull(status, "ChoreographerExecutedStepStatus is null"); + + final ChoreographerExecutedStepResultDTO dto = new ChoreographerExecutedStepResultDTO(); + dto.setSessionId(sessionId); + dto.setSessionStepId(sessionStepId); + dto.setStatus(status); + dto.setMessage(message); + dto.setException(exception); + + final CoreServiceUri uri = arrowheadService.getCoreServiceUri(CoreSystemService.CHOREOGRAPHER_SERVICE); + arrowheadService.consumeServiceHTTP(Void.class, HttpMethod.POST, uri.getAddress(), uri.getPort(), uri.getPath(), getCoreSystemInterface(), null, dto, new String[0]); + } + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + private String getCoreSystemInterface() { + return sslProperties.isSslEnabled() ? CommonConstants.HTTP_SECURE_JSON : CommonConstants.HTTP_INSECURE_JSON; } } diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java index cda1581..a9bbad2 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java @@ -1,7 +1,15 @@ package eu.arrowhead.application.skeleton.executor.service; +import org.apache.http.HttpStatus; import org.springframework.stereotype.Service; +import eu.arrowhead.common.Utilities; +import eu.arrowhead.common.dto.shared.ChoreographerAbortStepRequestDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecuteStepRequestDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecutorServiceInfoRequestDTO; +import eu.arrowhead.common.dto.shared.ChoreographerExecutorServiceInfoResponseDTO; +import eu.arrowhead.common.exception.BadPayloadException; + @Service public class ExecutorService { @@ -9,12 +17,54 @@ public class ExecutorService { // methods //------------------------------------------------------------------------------------------------- - public void startExecution(final Object request) { //TODO: change input to ChoreographerExecuteStepRequestDTO after new release + public void startExecution(final ChoreographerExecuteStepRequestDTO request) { + validateChoreographerExecuteStepRequestDTO(request); //TODO implement your logic here } //------------------------------------------------------------------------------------------------- - public void abortExecution(final Object request) { //TODO: change input to ChoreographerAbortStepRequestDTO after new release + public void abortExecution(final ChoreographerAbortStepRequestDTO request) { //TODO implement your logic here } + + //------------------------------------------------------------------------------------------------- + public ChoreographerExecutorServiceInfoResponseDTO collectServiceInfo(final ChoreographerExecutorServiceInfoRequestDTO request) { + validateChoreographerExecutorServiceInfoRequestDTO(request); + + final ChoreographerExecutorServiceInfoResponseDTO response = new ChoreographerExecutorServiceInfoResponseDTO(); + //TODO implement your logic here + return response; + } + + //================================================================================================= + // assistant methods + + //------------------------------------------------------------------------------------------------- + private void validateChoreographerExecuteStepRequestDTO(final ChoreographerExecuteStepRequestDTO dto) { + if (dto == null) { + throw new BadPayloadException("dto is null", HttpStatus.SC_BAD_REQUEST); + } + if (dto.getMainOrchestrationResult() == null) { + throw new BadPayloadException("mainOrchestrationResult is null", HttpStatus.SC_BAD_REQUEST); + } + } + + //------------------------------------------------------------------------------------------------- + private void validateChoreographerExecutorServiceInfoRequestDTO(final ChoreographerExecutorServiceInfoRequestDTO dto) { + if (dto == null) { + throw new BadPayloadException("dto is null", HttpStatus.SC_BAD_REQUEST); + } + if (Utilities.isEmpty(dto.getServiceDefinition())) { + throw new BadPayloadException("serviceDefinition is empty", HttpStatus.SC_BAD_REQUEST); + } + if (dto.getMinVersion() == null) { + throw new BadPayloadException("minVersion is empty", HttpStatus.SC_BAD_REQUEST); + } + if (dto.getMaxVersion() == null) { + throw new BadPayloadException("maxVersion is empty", HttpStatus.SC_BAD_REQUEST); + } + if (dto.getMinVersion() > dto.getMaxVersion()) { + throw new BadPayloadException("minVersion cannot be greater than maxVersion.", HttpStatus.SC_BAD_REQUEST); + } + } } diff --git a/pom.xml b/pom.xml index 51544b4..8a44be4 100644 --- a/pom.xml +++ b/pom.xml @@ -31,10 +31,11 @@ application-skeleton-executor - + + ossrh - https://s01.oss.sonatype.org/content/repositories/aiaitia-1017 + https://s01.oss.sonatype.org/content/repositories/aiaitia-1018 @@ -43,6 +44,11 @@ ai.aitia arrowhead-application-library-java-spring 4.4.0.0 + + + ai.aitia + arrowhead-core-common-essentials-java-spring + 4.4.0.2 From b4f6ff35bf2992e2cae8f1f0d47a403329134de8 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Wed, 25 Aug 2021 01:05:08 +0200 Subject: [PATCH 3/9] executor skeleton impl --- application-skeleton-executor/pom.xml | 2 +- .../skeleton/executor/controller/ExecutorController.java | 2 +- .../executor/security/ExecutorAccessControlFilter.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/application-skeleton-executor/pom.xml b/application-skeleton-executor/pom.xml index a54eec8..8347fa3 100644 --- a/application-skeleton-executor/pom.xml +++ b/application-skeleton-executor/pom.xml @@ -8,7 +8,7 @@ arrowhead-application-skeleton-executor - Arrowhead Provider Skeleton + Arrowhead Executor Skeleton diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java index bc03e73..82d1fc7 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java @@ -48,7 +48,7 @@ public void abort(@RequestBody final ChoreographerAbortStepRequestDTO request) { } //------------------------------------------------------------------------------------------------- - @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_INFO_URI, produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_INFO_URI, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ChoreographerExecutorServiceInfoResponseDTO serviceInfo(@RequestBody final ChoreographerExecutorServiceInfoRequestDTO request) { return executorService.collectServiceInfo(request); } diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java index f04ad27..1a00680 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/security/ExecutorAccessControlFilter.java @@ -26,7 +26,8 @@ protected void checkClientAuthorized(final String clientCN, final String method, final String cloudCN = getServerCloudCN(); if (requestTarget.contains(CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_START_URI) || - requestTarget.contains(CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_ABORT_URI)) { + requestTarget.contains(CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_ABORT_URI) || + requestTarget.contains(CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_INFO_URI)) { //Only Choreographer Core System is allowed to call this endpoints checkIfClientIsChoreographer(clientCN, cloudCN); } From 6abd90a4bb4bf9f0561cc1503008a109b7b0f2a4 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Wed, 25 Aug 2021 01:11:43 +0200 Subject: [PATCH 4/9] executor skeleton cert --- .../resources/certificates/executorskeleton.p12 | Bin 0 -> 4387 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 application-skeleton-executor/src/main/resources/certificates/executorskeleton.p12 diff --git a/application-skeleton-executor/src/main/resources/certificates/executorskeleton.p12 b/application-skeleton-executor/src/main/resources/certificates/executorskeleton.p12 new file mode 100644 index 0000000000000000000000000000000000000000..fcdef1d74195435b581f03ee427ef30d92096484 GIT binary patch literal 4387 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 KIJnqRh5rNg$S9fs literal 0 HcmV?d00001 From bcb3e3066e2f209949529c2e1b708187b604ab59 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Wed, 25 Aug 2021 10:38:44 +0200 Subject: [PATCH 5/9] executor skeleton controller updates --- .../skeleton/executor/controller/ExecutorController.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java index 82d1fc7..b7f46d6 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/controller/ExecutorController.java @@ -16,6 +16,7 @@ import eu.arrowhead.common.dto.shared.ChoreographerExecutorServiceInfoResponseDTO; @RestController +//@RequestMapping("/executor") // TODO: specify the base URI here public class ExecutorController { //================================================================================================= @@ -36,13 +37,13 @@ public String echo() { } //------------------------------------------------------------------------------------------------- - @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_START_URI, produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_START_URI, consumes = MediaType.APPLICATION_JSON_VALUE) public void start(@RequestBody final ChoreographerExecuteStepRequestDTO request) { executorService.startExecution(request); } //------------------------------------------------------------------------------------------------- - @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_ABORT_URI, produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(path = CommonConstants.CHOREOGRAPHER_EXECUTOR_CLIENT_SERVICE_ABORT_URI, consumes = MediaType.APPLICATION_JSON_VALUE) public void abort(@RequestBody final ChoreographerAbortStepRequestDTO request) { executorService.abortExecution(request); } @@ -54,5 +55,5 @@ public void abort(@RequestBody final ChoreographerAbortStepRequestDTO request) { } //------------------------------------------------------------------------------------------------- - //TODO: implement here your provider related REST end points + //TODO: implement here your executor related REST end points } From d1f02c10cd82ea62670f8d862ed6b883189d9498 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Thu, 26 Aug 2021 09:51:24 +0200 Subject: [PATCH 6/9] executor skeleton execution support impl --- .../ExecutorApplicationInitListener.java | 11 +++ .../skeleton/executor/ExecutorConstants.java | 18 ++++ .../executor/execution/ExecutionBoard.java | 97 +++++++++++++++++++ .../executor/execution/ExecutionManager.java | 63 ++++++++++++ .../executor/execution/ExecutionSignal.java | 6 ++ .../skeleton/executor/execution/Job.java | 28 ++++++ .../worker/ExecutionWorkerFactoryConfig.java | 39 ++++++++ .../worker/UnkownServiceExecutionWorker.java | 33 +++++++ .../executor/service/ExecutorService.java | 12 ++- 9 files changed, 305 insertions(+), 2 deletions(-) create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorConstants.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionManager.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionSignal.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/Job.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/ExecutionWorkerFactoryConfig.java create mode 100644 application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java index 848d5fc..7f9c00a 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorApplicationInitListener.java @@ -8,6 +8,7 @@ import ai.aitia.arrowhead.application.library.ArrowheadService; import ai.aitia.arrowhead.application.library.config.ApplicationInitListener; +import eu.arrowhead.application.skeleton.executor.execution.ExecutionManager; import eu.arrowhead.common.core.CoreSystem; @Component @@ -19,6 +20,9 @@ public class ExecutorApplicationInitListener extends ApplicationInitListener { @Autowired private ArrowheadService arrowheadService; + @Autowired + private ExecutionManager executionManager; + private final Logger logger = LogManager.getLogger(ExecutorApplicationInitListener.class); //================================================================================================= @@ -34,12 +38,19 @@ protected void customInit(final ContextRefreshedEvent event) { //Initialize Arrowhead Context arrowheadService.updateCoreServiceURIs(CoreSystem.CHOREOGRAPHER); + //Start Executor Manager + executionManager.start(); + //TODO: implement here any custom behavior on application start up } //------------------------------------------------------------------------------------------------- @Override public void customDestroy() { + + //Stop Executor Manager + executionManager.interrupt(); + //TODO: implement here any custom behavior on application shout down } } diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorConstants.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorConstants.java new file mode 100644 index 0000000..1cf2514 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/ExecutorConstants.java @@ -0,0 +1,18 @@ +package eu.arrowhead.application.skeleton.executor; + +public class ExecutorConstants { + + //================================================================================================= + // members + + public static final String THREAD_NUM_EXECUTION_WORKER = "thread.num.execution-worker"; + public static final String $THREAD_NUM_EXECUTION_WORKER_WD = "${" + THREAD_NUM_EXECUTION_WORKER + ":1}"; + + //================================================================================================= + // assistant methods + + //------------------------------------------------------------------------------------------------- + private ExecutorConstants() { + throw new UnsupportedOperationException(); + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java new file mode 100644 index 0000000..c604f14 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java @@ -0,0 +1,97 @@ +package eu.arrowhead.application.skeleton.executor.execution; + +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; + +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import eu.arrowhead.common.dto.shared.ChoreographerExecuteStepRequestDTO; + +@Component +public class ExecutionBoard { + + //================================================================================================= + // members + + private final Map board = new ConcurrentHashMap<>(); + private final BlockingQueue queue = new LinkedBlockingQueue<>(); + + private final Object lock = new Object(); + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + public Job newJob(final ChoreographerExecuteStepRequestDTO jobRequest) { + Assert.notNull(jobRequest, "jobRequest is null"); + + synchronized (lock) { + final Job job = new Job(jobRequest, ExecutionSignal.DO); + board.put(getUinqueIdentifier(jobRequest), job); + queue.add(job); + return job; + } + } + + //------------------------------------------------------------------------------------------------- + public Optional peekJob(final long sessionId, final long sessionStepId) { + final Job job = board.get(getUinqueIdentifier(sessionId, sessionStepId)); + if (job != null) { + return Optional.of(job); + } + return Optional.empty(); + } + + //------------------------------------------------------------------------------------------------- + public Job nextJob() throws InterruptedException { + return queue.take(); + } + + //------------------------------------------------------------------------------------------------- + public ExecutionSignal getJobExecutionSignal(final long sessionId, final long sessionStepId) { + synchronized (lock) { + final Job job = board.get(getUinqueIdentifier(sessionId, sessionStepId)); + if (job != null) { + return job.getExecutionSignal(); + } + return ExecutionSignal.UNKNOWN; + } + } + + //------------------------------------------------------------------------------------------------- + public void abortJob(final long sessionId, final long sessionStepId) { + synchronized (lock) { + final Optional optional = peekJob(sessionId, sessionStepId); + if (optional.isPresent()) { + optional.get().setExecutionSignal(ExecutionSignal.ABORT); + } + } + } + + //------------------------------------------------------------------------------------------------- + public void removeJob(final long sessionId, final long sessionStepId) { + synchronized (lock) { + final Job job = board.remove(getUinqueIdentifier(sessionId, sessionStepId)); + if (job != null) { + queue.remove(job); + } + } + } + + //================================================================================================= + // assistant methods + + //------------------------------------------------------------------------------------------------- + private String getUinqueIdentifier(final ChoreographerExecuteStepRequestDTO request) { + return getUinqueIdentifier(request.getSessionId(), request.getSessionStepId()); + } + + //------------------------------------------------------------------------------------------------- + private String getUinqueIdentifier(final long sessionId, final long sessionStepId) { + return sessionId + "-" + sessionStepId; + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionManager.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionManager.java new file mode 100644 index 0000000..acffd9b --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionManager.java @@ -0,0 +1,63 @@ +package eu.arrowhead.application.skeleton.executor.execution; + +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.function.Function; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import eu.arrowhead.application.skeleton.executor.ExecutorConstants; + +@Component +public class ExecutionManager extends Thread { + + //================================================================================================= + // members + + @Autowired + private ExecutionBoard board; + + @Autowired + private Function workerFactory; + + private ThreadPoolExecutor threadPool; + + @Value(ExecutorConstants.$THREAD_NUM_EXECUTION_WORKER_WD) + private int threadNum; + + private boolean doWork = true; + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + @Override + public void run() { + + threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(threadNum); + + while (doWork) { + try { + final Job job = board.nextJob(); + if (job.getExecutionSignal() == ExecutionSignal.ABORT) { + board.removeJob(job.getJobRequest().getSessionId(), job.getJobRequest().getSessionStepId()); + + } else { + threadPool.execute(workerFactory.apply(job)); + } + + } catch (final InterruptedException ex) { + interrupt(); + } + } + } + + //------------------------------------------------------------------------------------------------- + @Override + public void interrupt() { + doWork = false; + super.interrupt(); + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionSignal.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionSignal.java new file mode 100644 index 0000000..bf82810 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionSignal.java @@ -0,0 +1,6 @@ +package eu.arrowhead.application.skeleton.executor.execution; + +public enum ExecutionSignal { + + DO, ABORT, UNKNOWN; +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/Job.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/Job.java new file mode 100644 index 0000000..2dc439e --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/Job.java @@ -0,0 +1,28 @@ +package eu.arrowhead.application.skeleton.executor.execution; + +import eu.arrowhead.common.dto.shared.ChoreographerExecuteStepRequestDTO; + +public class Job { + + //================================================================================================= + // members + + private final ChoreographerExecuteStepRequestDTO jobRequest; + private ExecutionSignal executionSignal; + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + public Job(final ChoreographerExecuteStepRequestDTO jobRequest, final ExecutionSignal executionSignal) { + this.jobRequest = jobRequest; + this.executionSignal = executionSignal; + } + + //------------------------------------------------------------------------------------------------- + public ExecutionSignal getExecutionSignal() { return executionSignal; } + public ChoreographerExecuteStepRequestDTO getJobRequest() { return jobRequest; } + + //------------------------------------------------------------------------------------------------- + public void setExecutionSignal(final ExecutionSignal executionSignal) { this.executionSignal = executionSignal; } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/ExecutionWorkerFactoryConfig.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/ExecutionWorkerFactoryConfig.java new file mode 100644 index 0000000..c25095c --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/ExecutionWorkerFactoryConfig.java @@ -0,0 +1,39 @@ +package eu.arrowhead.application.skeleton.executor.execution.worker; + +import java.util.function.Function; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +import eu.arrowhead.application.skeleton.executor.execution.Job; + +@Configuration +public class ExecutionWorkerFactoryConfig { + + //------------------------------------------------------------------------------------------------- + @Bean + public Function executionWorkerFactory() { + return job -> createExecutionWorker(job); + } + + //------------------------------------------------------------------------------------------------- + @Bean + @Scope(BeanDefinition.SCOPE_PROTOTYPE) + public Runnable createExecutionWorker(final Job job) { + final String serviceDefinition = job.getJobRequest().getMainOrchestrationResult().getService().getServiceDefinition(); + + switch (serviceDefinition) { + //TODO initiate here your execution workers +// case "your-main-service-A": +// return new YourMainServiceAExecutionWorker(job); + +// case "your-main-service-B": +// return new YourMainServiceBExecutionWorker(job); + + default: + return new UnkownServiceExecutionWorker(job); + } + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java new file mode 100644 index 0000000..b14f223 --- /dev/null +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java @@ -0,0 +1,33 @@ +package eu.arrowhead.application.skeleton.executor.execution.worker; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import eu.arrowhead.application.skeleton.executor.execution.Job; + +public class UnkownServiceExecutionWorker implements Runnable { + + //================================================================================================= + // members + + private final Job job; + + private final Logger logger = LogManager.getLogger(UnkownServiceExecutionWorker.class); + + //================================================================================================= + // methods + + //------------------------------------------------------------------------------------------------- + public UnkownServiceExecutionWorker(Job job) { + this.job = job; + } + + //------------------------------------------------------------------------------------------------- + @Override + public void run() { + logger.error("Unkown service execution request: sessionId={}, sessionStepId={}, service={}", + job.getJobRequest().getSessionId(), + job.getJobRequest().getSessionStepId(), + job.getJobRequest().getMainOrchestrationResult().getService().getServiceDefinition()); + } +} diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java index a9bbad2..1db5a8f 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/service/ExecutorService.java @@ -1,8 +1,10 @@ package eu.arrowhead.application.skeleton.executor.service; import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import eu.arrowhead.application.skeleton.executor.execution.ExecutionBoard; import eu.arrowhead.common.Utilities; import eu.arrowhead.common.dto.shared.ChoreographerAbortStepRequestDTO; import eu.arrowhead.common.dto.shared.ChoreographerExecuteStepRequestDTO; @@ -13,18 +15,24 @@ @Service public class ExecutorService { + //================================================================================================= + // members + + @Autowired + private ExecutionBoard executionBoard; + //================================================================================================= // methods //------------------------------------------------------------------------------------------------- public void startExecution(final ChoreographerExecuteStepRequestDTO request) { validateChoreographerExecuteStepRequestDTO(request); - //TODO implement your logic here + executionBoard.newJob(request); } //------------------------------------------------------------------------------------------------- public void abortExecution(final ChoreographerAbortStepRequestDTO request) { - //TODO implement your logic here + executionBoard.abortJob(request.getSessionId(), request.getSessionStepId()); } //------------------------------------------------------------------------------------------------- From b09695f0118900c250f32b33f66304ebb43656ad Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Thu, 26 Aug 2021 09:56:15 +0200 Subject: [PATCH 7/9] executor skeleton execution add missing property --- .../src/main/resources/application.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/application-skeleton-executor/src/main/resources/application.properties b/application-skeleton-executor/src/main/resources/application.properties index 716ae2e..d3e3561 100644 --- a/application-skeleton-executor/src/main/resources/application.properties +++ b/application-skeleton-executor/src/main/resources/application.properties @@ -16,6 +16,10 @@ container.max_keep_alive_requests=500 sr_address=127.0.0.1 sr_port=8443 +# Execution parameters +#------------------------------ +thread.num.execution-worker=1 + ############################################ ### SECURE MODE ### ############################################ From 60d0bb94f48a98335e08676361444075389f0260 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Fri, 27 Aug 2021 12:12:46 +0200 Subject: [PATCH 8/9] executor skeleton fix --- .../executor/execution/ExecutionBoard.java | 14 +++++++------- .../worker/UnkownServiceExecutionWorker.java | 9 +++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java index c604f14..f07ab22 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/ExecutionBoard.java @@ -31,7 +31,7 @@ public Job newJob(final ChoreographerExecuteStepRequestDTO jobRequest) { synchronized (lock) { final Job job = new Job(jobRequest, ExecutionSignal.DO); - board.put(getUinqueIdentifier(jobRequest), job); + board.put(getUniqueIdentifier(jobRequest), job); queue.add(job); return job; } @@ -39,7 +39,7 @@ public Job newJob(final ChoreographerExecuteStepRequestDTO jobRequest) { //------------------------------------------------------------------------------------------------- public Optional peekJob(final long sessionId, final long sessionStepId) { - final Job job = board.get(getUinqueIdentifier(sessionId, sessionStepId)); + final Job job = board.get(getUniqueIdentifier(sessionId, sessionStepId)); if (job != null) { return Optional.of(job); } @@ -54,7 +54,7 @@ public Job nextJob() throws InterruptedException { //------------------------------------------------------------------------------------------------- public ExecutionSignal getJobExecutionSignal(final long sessionId, final long sessionStepId) { synchronized (lock) { - final Job job = board.get(getUinqueIdentifier(sessionId, sessionStepId)); + final Job job = board.get(getUniqueIdentifier(sessionId, sessionStepId)); if (job != null) { return job.getExecutionSignal(); } @@ -75,7 +75,7 @@ public void abortJob(final long sessionId, final long sessionStepId) { //------------------------------------------------------------------------------------------------- public void removeJob(final long sessionId, final long sessionStepId) { synchronized (lock) { - final Job job = board.remove(getUinqueIdentifier(sessionId, sessionStepId)); + final Job job = board.remove(getUniqueIdentifier(sessionId, sessionStepId)); if (job != null) { queue.remove(job); } @@ -86,12 +86,12 @@ public void removeJob(final long sessionId, final long sessionStepId) { // assistant methods //------------------------------------------------------------------------------------------------- - private String getUinqueIdentifier(final ChoreographerExecuteStepRequestDTO request) { - return getUinqueIdentifier(request.getSessionId(), request.getSessionStepId()); + private String getUniqueIdentifier(final ChoreographerExecuteStepRequestDTO request) { + return getUniqueIdentifier(request.getSessionId(), request.getSessionStepId()); } //------------------------------------------------------------------------------------------------- - private String getUinqueIdentifier(final long sessionId, final long sessionStepId) { + private String getUniqueIdentifier(final long sessionId, final long sessionStepId) { return sessionId + "-" + sessionStepId; } } diff --git a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java index b14f223..6ab39e9 100644 --- a/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java +++ b/application-skeleton-executor/src/main/java/eu/arrowhead/application/skeleton/executor/execution/worker/UnkownServiceExecutionWorker.java @@ -2,8 +2,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; import eu.arrowhead.application.skeleton.executor.execution.Job; +import eu.arrowhead.application.skeleton.executor.service.ExecutorDriver; +import eu.arrowhead.common.dto.shared.ChoreographerExecutedStepStatus; public class UnkownServiceExecutionWorker implements Runnable { @@ -12,6 +15,9 @@ public class UnkownServiceExecutionWorker implements Runnable { private final Job job; + @Autowired + private ExecutorDriver driver; + private final Logger logger = LogManager.getLogger(UnkownServiceExecutionWorker.class); //================================================================================================= @@ -29,5 +35,8 @@ public void run() { job.getJobRequest().getSessionId(), job.getJobRequest().getSessionStepId(), job.getJobRequest().getMainOrchestrationResult().getService().getServiceDefinition()); + + driver.notifyChoreographer(job.getJobRequest().getSessionId(), job.getJobRequest().getSessionStepId(), ChoreographerExecutedStepStatus.ERROR, + job.getJobRequest().getMainOrchestrationResult().getService().getServiceDefinition() + " is not supported", null); } } From 02d55234ce67cf0f4a5f1db64e83b1726af82578 Mon Sep 17 00:00:00 2001 From: Tamas Bordi Date: Wed, 1 Sep 2021 13:13:49 +0200 Subject: [PATCH 9/9] check configuration --- .../provider/ProviderApplicationInitListener.java | 11 ++++++++++- .../publisher/PublisherApplicationInitListener.java | 11 ++++++++++- .../subscriber/SubscriberApplicationInitListener.java | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/application-skeleton-provider/src/main/java/eu/arrowhead/application/skeleton/provider/ProviderApplicationInitListener.java b/application-skeleton-provider/src/main/java/eu/arrowhead/application/skeleton/provider/ProviderApplicationInitListener.java index 1f5e0f5..e6cd326 100644 --- a/application-skeleton-provider/src/main/java/eu/arrowhead/application/skeleton/provider/ProviderApplicationInitListener.java +++ b/application-skeleton-provider/src/main/java/eu/arrowhead/application/skeleton/provider/ProviderApplicationInitListener.java @@ -50,7 +50,8 @@ public class ProviderApplicationInitListener extends ApplicationInitListener { //------------------------------------------------------------------------------------------------- @Override protected void customInit(final ContextRefreshedEvent event) { - + checkConfiguration(); + //Checking the availability of necessary core systems checkCoreSystemReachability(CoreSystem.SERVICEREGISTRY); if (sslEnabled && tokenSecurityFilterEnabled) { @@ -76,6 +77,14 @@ public void customDestroy() { //================================================================================================= // assistant methods + + //------------------------------------------------------------------------------------------------- + private void checkConfiguration() { + if (!sslEnabled && tokenSecurityFilterEnabled) { + logger.info("Contradictory configuration:"); + logger.info("token.security.filter.enabled=true while server.ssl.enabled=false"); + } + } //------------------------------------------------------------------------------------------------- private void setTokenSecurityFilter() { diff --git a/application-skeleton-publisher/src/main/java/eu/arrowhead/application/skeleton/publisher/PublisherApplicationInitListener.java b/application-skeleton-publisher/src/main/java/eu/arrowhead/application/skeleton/publisher/PublisherApplicationInitListener.java index e1ca8f3..f77e795 100644 --- a/application-skeleton-publisher/src/main/java/eu/arrowhead/application/skeleton/publisher/PublisherApplicationInitListener.java +++ b/application-skeleton-publisher/src/main/java/eu/arrowhead/application/skeleton/publisher/PublisherApplicationInitListener.java @@ -66,7 +66,8 @@ public class PublisherApplicationInitListener extends ApplicationInitListener { //------------------------------------------------------------------------------------------------- @Override protected void customInit(final ContextRefreshedEvent event) { - + checkConfiguration(); + //Checking the availability of necessary core systems checkCoreSystemReachability(CoreSystem.SERVICEREGISTRY); @@ -99,6 +100,14 @@ public void customDestroy() { //================================================================================================= // assistant methods + + //------------------------------------------------------------------------------------------------- + private void checkConfiguration() { + if (!sslEnabled && tokenSecurityFilterEnabled) { + logger.info("Contradictory configuration:"); + logger.info("token.security.filter.enabled=true while server.ssl.enabled=false"); + } + } //------------------------------------------------------------------------------------------------- private void setTokenSecurityFilter() { diff --git a/application-skeleton-subscriber/src/main/java/eu/arrowhead/application/skeleton/subscriber/SubscriberApplicationInitListener.java b/application-skeleton-subscriber/src/main/java/eu/arrowhead/application/skeleton/subscriber/SubscriberApplicationInitListener.java index 493a71f..aa7a533 100644 --- a/application-skeleton-subscriber/src/main/java/eu/arrowhead/application/skeleton/subscriber/SubscriberApplicationInitListener.java +++ b/application-skeleton-subscriber/src/main/java/eu/arrowhead/application/skeleton/subscriber/SubscriberApplicationInitListener.java @@ -66,7 +66,8 @@ public class SubscriberApplicationInitListener extends ApplicationInitListener { //------------------------------------------------------------------------------------------------- @Override protected void customInit(final ContextRefreshedEvent event) { - + checkConfiguration(); + //Checking the availability of necessary core systems checkCoreSystemReachability(CoreSystem.SERVICEREGISTRY); @@ -116,6 +117,14 @@ public void customDestroy() { //================================================================================================= // assistant methods + + //------------------------------------------------------------------------------------------------- + private void checkConfiguration() { + if (!sslEnabled && tokenSecurityFilterEnabled) { + logger.info("Contradictory configuration:"); + logger.info("token.security.filter.enabled=true while server.ssl.enabled=false"); + } + } //------------------------------------------------------------------------------------------------- private void setTokenSecurityFilter() {