diff --git a/adapter/src/main/java/eu/melodic/upperware/adapter/planexecutor/colosseum/NodeTaskExecutor.java b/adapter/src/main/java/eu/melodic/upperware/adapter/planexecutor/colosseum/NodeTaskExecutor.java index 559800a51da0e246512e118fb16b0a3e9bc8caad..25aa1da0553c14b448646637a6a697f4f3c205b3 100644 --- a/adapter/src/main/java/eu/melodic/upperware/adapter/planexecutor/colosseum/NodeTaskExecutor.java +++ b/adapter/src/main/java/eu/melodic/upperware/adapter/planexecutor/colosseum/NodeTaskExecutor.java @@ -59,11 +59,16 @@ public class NodeTaskExecutor extends RunnableTaskExecutor { nodeJSON.put("taskName", taskBody.getTaskName()); nodeJSON.put("nodeName", taskBody.getNodeName()); JSONObject nodeCandidateInformationJSON = new JSONObject(); + if(taskBody.getNodeCandidate().getCloud().getApi().getProviderName().equals("openstack")){ + nodeCandidateInformationJSON.put("hardwareProviderId", checkEmptiness(taskBody.getNodeCandidate().getHardware().getProviderId().substring(4), "hardwareProviderId")); + }else{ + nodeCandidateInformationJSON.put("hardwareProviderId", checkEmptiness(taskBody.getNodeCandidate().getHardware().getProviderId(), "hardwareProviderId")); + } + nodeCandidateInformationJSON.put("hardwareProviderId", checkEmptiness(taskBody.getNodeCandidate().getHardware().getProviderId(), "hardwareProviderId")); nodeCandidateInformationJSON.put("ID", checkEmptiness(taskBody.getNodeCandidate().getId(), "ID")); nodeCandidateInformationJSON.put("cloudID", checkEmptiness(taskBody.getNodeCandidate().getCloud().getId(), "cloudID")); nodeCandidateInformationJSON.put("locationName", checkEmptiness(taskBody.getNodeCandidate().getLocation().getName(), "locationName")); nodeCandidateInformationJSON.put("imageProviderId", checkEmptiness(taskBody.getNodeCandidate().getImage().getProviderId(), "imageProviderId")); - nodeCandidateInformationJSON.put("hardwareProviderId", checkEmptiness(taskBody.getNodeCandidate().getHardware().getProviderId(), "hardwareProviderId")); nodeJSON.put("nodeCandidateInformation", nodeCandidateInformationJSON); nodesJSONArray.put(nodeJSON); log.info("NodeTaskExecutor->addIAASNode: [application id: {}] ProActive node(s) (JSONArray): \n{}", applicationId, nodesJSONArray); diff --git a/event-management/bin/run.bat b/event-management/bin/run.bat index 705597fad7277ee2a4d055f04d59f7ff85fe013f..d156520fad98eabfc4f85a72cf894f8fe479135f 100644 --- a/event-management/bin/run.bat +++ b/event-management/bin/run.bat @@ -62,12 +62,21 @@ rem set JAVA_OPTS=-Djavax.net.debug=all echo MELODIC_CONFIG_DIR=%MELODIC_CONFIG_DIR% echo Starting EMS server... +IF NOT DEFINED RESTART_EXIT_CODE set RESTART_EXIT_CODE=99 +:_restart_ems + rem Use when Esper is packaged in control-service.jar rem java %JAVA_OPTS% -Djasypt.encryptor.password=%JASYPT_PASSWORD% -Duser.timezone=Europe/Warsaw -Djava.security.egd=file:/dev/urandom -jar %JARS_DIR%\control-service.jar --logging.config=file:%LOG_CONFIG_FILE% rem Use when Esper is NOT packaged in control-service.jar java %JAVA_OPTS% -Djasypt.encryptor.password=%JASYPT_PASSWORD% -Duser.timezone=Europe/Warsaw -Djava.security.egd=file:/dev/urandom -cp %JARS_DIR%\control-service.jar -Dloader.path=%JARS_DIR%\esper-7.1.0.jar org.springframework.boot.loader.PropertiesLauncher -nolog --logging.config=file:%LOG_CONFIG_FILE% %* +if errorlevel %RESTART_EXIT_CODE% ( + echo Restarting EMS server... + goto :_restart_ems +) +echo EMS server exited + rem e.g. --spring.config.location=%MELODIC_CONFIG_DIR%\ rem e.g. --spring.config.name=application.properties diff --git a/event-management/bin/run.sh b/event-management/bin/run.sh index bf17867e3dc0a4e2dc70ae86be8907f5d8a3e59e..7aef86f03a72baca86ba9eb3273fdb40507b3cc9 100755 --- a/event-management/bin/run.sh +++ b/event-management/bin/run.sh @@ -66,11 +66,19 @@ fi echo "MELODIC_CONFIG_DIR=${MELODIC_CONFIG_DIR}" echo "Starting EMS server..." -# Use when Esper is packaged in control-service.jar -# java $JAVA_OPTS -Djasypt.encryptor.password=$JASYPT_PASSWORD -Duser.timezone=Europe/Warsaw -Djava.security.egd=file:/dev/urandom -jar $JARS_DIR/control-service/target/control-service.jar --logging.config=file:$LOG_CONFIG_FILE +if [[ -z $RESTART_EXIT_CODE ]]; then RESTART_EXIT_CODE=99; export RESTART_EXIT_CODE; fi +retCode=$RESTART_EXIT_CODE +while :; do + # Use when Esper is packaged in control-service.jar + # java $JAVA_OPTS -Djasypt.encryptor.password=$JASYPT_PASSWORD -Duser.timezone=Europe/Warsaw -Djava.security.egd=file:/dev/urandom -jar $JARS_DIR/control-service/target/control-service.jar --logging.config=file:$LOG_CONFIG_FILE -# Use when Esper is NOT packaged in control-service.jar -java $JAVA_OPTS -Djasypt.encryptor.password=$JASYPT_PASSWORD -Duser.timezone=Europe/Warsaw -Djava.security.egd=file:/dev/urandom -cp ${JARS_DIR}/control-service.jar -Dloader.path=${JARS_DIR}/esper-7.1.0.jar org.springframework.boot.loader.PropertiesLauncher --logging.config=file:$LOG_CONFIG_FILE $* + # Use when Esper is NOT packaged in control-service.jar + java $JAVA_OPTS -Djasypt.encryptor.password=$JASYPT_PASSWORD -Duser.timezone=Europe/Warsaw -Djava.security.egd=file:/dev/urandom -cp ${JARS_DIR}/control-service.jar -Dloader.path=${JARS_DIR}/esper-7.1.0.jar org.springframework.boot.loader.PropertiesLauncher --logging.config=file:$LOG_CONFIG_FILE $* + + retCode=$? + if [[ $retCode -eq $RESTART_EXIT_CODE ]]; then echo "Restarting EMS server..."; else break; fi +done +echo "EMS server exited" # Extra parameters # e.g. --spring.config.location=$MELODIC_CONFIG_DIR diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java index 3913e1cde8268af9eb42048ad2a075e57c6455a8..923581db57afd825937608a229ba21dbf7d15ec0 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceApplication.java @@ -91,22 +91,28 @@ public class ControlServiceApplication implements ApplicationContextAware { synchronized static void exitApp(int exitCode, long gracePeriod) { if (exitTimer==null) { - // Close SpringBoot application - log.info("ControlServiceApplication.exitApp(): Closing application context..."); - ExitCodeGenerator exitCodeGenerator = () -> exitCode; - SpringApplication.exit(applicationContext, exitCodeGenerator); - - // Wait for 'gracePeriod' seconds before force JVM to exit + // Wait for 'gracePeriod' seconds before forcing JVM to exit log.info("ControlServiceApplication.exitApp(): Wait for {}sec before exit", gracePeriod); - exitTimer = new Timer("exit-app-grace-period-timer", true); + exitTimer = new Timer("exit-timer", true); exitTimer.schedule(new TimerTask() { @Override public void run() { - log.info("ControlServiceApplication.exitApp(): Exiting..."); + log.info("ControlServiceApplication.exitApp(): exit-timer: Exiting with code: {}", exitCode); System.exit(exitCode); - log.info("ControlServiceApplication.exitApp(): Bye"); + log.info("ControlServiceApplication.exitApp(): exit-timer: Bye"); } }, gracePeriod * 1000); + + // Close SpringBoot application + log.info("ControlServiceApplication.exitApp(): Closing application context..."); + ExitCodeGenerator exitCodeGenerator = () -> { + log.info("ControlServiceApplication.exitApp(): exitCodeGenerator: Exit code: {}", exitCode); + return exitCode; + }; + SpringApplication.exit(applicationContext, exitCodeGenerator); + log.info("ControlServiceApplication.exitApp(): Exiting with code: {}", exitCode); + System.exit(exitCode); + } else { log.warn("ControlServiceApplication.exitApp(): Exit timer has already started: {}", exitTimer); } diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java index 87d88092afcfd537cd14aa9c180dd3d994f82773..9d0b932d7e8efd1e8087a3517c5aa33132b568af 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceController.java @@ -433,15 +433,27 @@ public class ControlServiceController { // EMS status and information query methods // ------------------------------------------------------------------------------------------------------------ - @RequestMapping(value = { "/ems/shutdown", "/ems/shutdown/{exitApp}" }, method = {GET, POST}) - public String emsShutdown(@PathVariable Optional exitApp) { - boolean _exitApp = exitApp.orElse(false); - log.info("ControlServiceController.emsShutdown(): exitApp={}", _exitApp); + @RequestMapping(value = "/ems/shutdown", method = {GET, POST}) + public String emsShutdown() { + log.info("ControlServiceController.emsShutdown(): "); coordinator.emsShutdown(); - if (_exitApp) coordinator.emsExit(); return "OK"; } + @RequestMapping(value = { "/ems/exit", "/ems/exit/{exitCode}" }, method = {GET, POST}) + public String emsExit(@PathVariable Optional exitCode) { + if (properties.isExitAllowed()) { + int _exitCode = exitCode.orElse(properties.getExitCode()); + log.info("ControlServiceController.emsExit(): exitCode={}", _exitCode); + coordinator.emsShutdown(); + coordinator.emsExit(_exitCode); + return "OK"; + } else { + log.info("ControlServiceController.emsExit(): Exiting EMS is not allowed"); + return "NOT ALLOWED"; + } + } + @RequestMapping(value = "/ems/status", method = {GET, POST}, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public String emsStatus() { diff --git a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java index 3fa702d22bee8d0addb459fdbe147a0ddedc3405..9f528cdda0a897b767a0f14206e84dc531466dd4 100644 --- a/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java +++ b/event-management/control-service/src/main/java/eu/melodic/event/control/ControlServiceCoordinator.java @@ -685,10 +685,15 @@ public class ControlServiceCoordinator { @Async synchronized void emsExit() { + emsExit(properties.getExitCode()); + } + + @Async + synchronized void emsExit(int exitCode) { if (properties.isExitAllowed()) { // Signal SpringBootApp to exit log.info("ControlServiceCoordinator.emsExit(): Signaling exit..."); - ControlServiceApplication.exitApp(properties.getExitCode(), properties.getExitGracePeriod()); + ControlServiceApplication.exitApp(exitCode, properties.getExitGracePeriod()); log.info("ControlServiceCoordinator.emsExit(): Signaling exit... done"); } else { log.warn("ControlServiceCoordinator.emsExit(): Exit is not allowed"); diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUI.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUI.java index b0d71ce8a7f768b51ce2f7ee337cf70e61062922..180b8c27e6315e4e951563e2fb93c63a3f9ef695 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUI.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUI.java @@ -26,4 +26,6 @@ public interface ProactiveClientServiceGUI extends IProactiveClientServiceConnec List getAllNodes(); List getAllMonitors(); + + boolean deleteByonNode(String byonId); } diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUIImpl.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUIImpl.java index 484522982549fcce96078ed9fcf90b066b171463..440ea11046b04a68237343902cb3e5de16816c33 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUIImpl.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/proactive/ProactiveClientServiceGUIImpl.java @@ -64,4 +64,9 @@ public class ProactiveClientServiceGUIImpl extends ProactiveClientServiceConnect public List getAllMonitors() { return getPAGateway().map(PAGateway::getMonitorsList).orElse(Collections.emptyList()); } + + @Override + public boolean deleteByonNode(String byonId) { + return getPAGateway().map(paGateway -> paGateway.deleteByonNode(byonId)).orElse(false); + } } diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/byon/ByonController.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/byon/ByonController.java index 15ab5cded76b678db44cf3a507edc9cb461a2525..3246e260fa5dcd4122def3dd8f2a9929a11a013a 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/byon/ByonController.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/byon/ByonController.java @@ -95,4 +95,12 @@ public class ByonController { log.info("GET request for byon enums"); return byonService.getByonEnums(); } + + @PutMapping("/cleanByon") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void cleanByonNodes() { + log.info("Put request for byon nodes purging"); + byonService.cleanByon(); + log.info("Put request for byon nodes purging finished"); + } } diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/byon/ByonService.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/byon/ByonService.java index 9ef14da976b927540efd5cc5eeaa9be9217efc31..111587778e4b34225ca66c7033be47a798b1b658 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/byon/ByonService.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/byon/ByonService.java @@ -199,4 +199,14 @@ public class ByonService { return byonNodes; } + + public void cleanByon() { + log.info("[ByonService]: cleanByon starting"); + List byonNodeList = getAllByonNodesList(); + for(ByonNode byonNode : byonNodeList) { + String byonId = byonNode.getId(); + log.info("[ByonService]: deletingByon for id: {}", byonId); + proactiveClientServiceGUI.deleteByonNode(byonId); + } + } } diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/internal/CloudType.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/internal/CloudType.java index 06dc85b9bb1698f6cc62377c11f9a7fa8ee36bb5..e427760cafacba2fd5bacad35a3ff74721cf75ba 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/internal/CloudType.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/internal/CloudType.java @@ -3,5 +3,6 @@ package eu.passage.upperware.commons.model.internal; public enum CloudType { PRIVATE, PUBLIC, - SIMULATION; + SIMULATION, + BYON; }