From dab29d16546183e280f41a1ff95ba76c02f232c7 Mon Sep 17 00:00:00 2001 From: gsavvas Date: Thu, 1 Feb 2024 13:51:49 +0200 Subject: [PATCH] Add docker library to image in Dockerfile Change-Id: I471df77ab8677d6311291cf86f39c8a294c811d1 --- charts/nebulous-exn-middleware/values.yaml | 4 +- .../.gradle/7.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/checksums/md5-checksums.bin | Bin 0 -> 18547 bytes .../7.5.1/checksums/sha1-checksums.bin | Bin 0 -> 18551 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 209579 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.5.1/fileHashes/fileHashes.bin | Bin 0 -> 22997 bytes .../.gradle/7.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../.gradle/7.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 18785 bytes exn-middleware-core/.gradle/file-system.probe | Bin 0 -> 8 bytes .../.gradle/vcs-1/gc.properties | 0 exn-middleware-core/Dockerfile | 35 +++ exn-middleware-core/build.gradle | 38 +++ .../sal/ExnMiddlewareApplication.class | Bin 0 -> 2543 bytes .../modules/sal/configuration/AppConfig.class | Bin 0 -> 2702 bytes .../sal/configuration/RestTemplateConf.class | Bin 0 -> 3143 bytes .../sal/configuration/SalConfiguration.class | Bin 0 -> 3105 bytes .../config/ConfigureEXNConnector.class | Bin 0 -> 6294 bytes .../middleware/consumers/StringConsumer.class | Bin 0 -> 6354 bytes .../connection/EXNConnectorHandler.class | Bin 0 -> 2734 bytes .../consumer/AMQPSalMessageHandler.class | Bin 0 -> 7704 bytes .../PropertiesPublisher$_send_closure1.class | Bin 0 -> 3950 bytes .../publishers/PropertiesPublisher.class | Bin 0 -> 3973 bytes .../modules/sal/model/base/Credentials.class | Bin 0 -> 2364 bytes .../exn/modules/sal/model/cloud/Cloud.class | Bin 0 -> 2863 bytes .../NodeAttributeRequirement.class | Bin 0 -> 2147 bytes .../nodecandidate/NodeCandidateRequest.class | Bin 0 -> 2603 bytes .../model/nodecandidate/NodeRequirement.class | Bin 0 -> 166 bytes .../nodecandidate/NodeTypeRequirement.class | Bin 0 -> 2132 bytes .../sal/processors/AbstractProcessor.class | Bin 0 -> 7994 bytes .../modules/sal/processors/Processor.class | Bin 0 -> 253 bytes .../CloudProcessor$_delete_closure3.class | Bin 0 -> 2358 bytes .../impl/CloudProcessor$_get_closure2.class | Bin 0 -> 2340 bytes .../impl/CloudProcessor$_post_closure1.class | Bin 0 -> 2350 bytes .../sal/processors/impl/CloudProcessor.class | Bin 0 -> 7438 bytes .../impl/JobProcessor$_delete_closure3.class | Bin 0 -> 2350 bytes .../impl/JobProcessor$_get_closure2.class | Bin 0 -> 2332 bytes .../impl/JobProcessor$_post_closure1.class | Bin 0 -> 2342 bytes .../impl/JobProcessor$_update_closure4.class | Bin 0 -> 2350 bytes .../sal/processors/impl/JobProcessor.class | Bin 0 -> 10121 bytes .../sal/processors/impl/NoOpProcessor.class | Bin 0 -> 1857 bytes .../impl/NodeCandidateProcessor.class | Bin 0 -> 5788 bytes .../impl/NodeProcessor$_delete_closure3.class | Bin 0 -> 2354 bytes .../impl/NodeProcessor$_get_closure2.class | Bin 0 -> 2336 bytes .../impl/NodeProcessor$_post_closure1.class | Bin 0 -> 2346 bytes .../impl/NodeProcessor$_update_closure4.class | Bin 0 -> 2354 bytes .../sal/processors/impl/NodeProcessor.class | Bin 0 -> 10366 bytes .../repository/AbstractSalRepository.class | Bin 0 -> 10949 bytes .../sal/repository/GatewayRepository.class | Bin 0 -> 3584 bytes .../repository/cloud/CloudRepository.class | Bin 0 -> 1897 bytes .../sal/repository/job/JobRepository.class | Bin 0 -> 1885 bytes .../deleteStrategies/IJobDeleteStrategy.class | Bin 0 -> 304 bytes .../deleteStrategies/JobDeleteStrategy.class | Bin 0 -> 3573 bytes .../deleteStrategies/JobKillStrategy.class | Bin 0 -> 3574 bytes .../deleteStrategies/JobStopStrategy.class | Bin 0 -> 3536 bytes .../node/AbstractNodeRepository.class | Bin 0 -> 3253 bytes .../repository/node/ByonNodeRepository.class | Bin 0 -> 1908 bytes .../repository/node/CloudNodeRepository.class | Bin 0 -> 2563 bytes .../repository/node/EdgeNodeRepository.class | Bin 0 -> 1908 bytes .../sal/repository/node/NodeRegistrar.class | Bin 0 -> 487 bytes .../NodeCandidateRepository.class | Bin 0 -> 2708 bytes exn-middleware-core/config/application.yml | 28 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + exn-middleware-core/gradlew | 240 ++++++++++++++++++ exn-middleware-core/pom.xml | 116 +++++++++ exn-middleware-core/settings.gradle | 6 + .../sal/ExnMiddlewareApplication.groovy | 12 + .../sal/configuration/AppConfig.groovy | 9 + .../sal/configuration/RestTemplateConf.groovy | 20 ++ .../sal/configuration/SalConfiguration.groovy | 16 ++ .../config/ConfigureEXNConnector.groovy | 68 +++++ .../consumers/StringConsumer.groovy | 38 +++ .../connection/EXNConnectorHandler.groovy | 16 ++ .../consumer/AMQPSalMessageHandler.groovy | 83 ++++++ .../publishers/PropertiesPublisher.groovy | 43 ++++ .../modules/sal/model/base/Credentials.groovy | 7 + .../exn/modules/sal/model/cloud/Cloud.groovy | 12 + .../NodeAttributeRequirement.groovy | 4 + .../nodecandidate/NodeCandidateRequest.groovy | 7 + .../nodecandidate/NodeRequirement.groovy | 5 + .../nodecandidate/NodeTypeRequirement.groovy | 4 + .../sal/processors/AbstractProcessor.groovy | 91 +++++++ .../modules/sal/processors/Processor.groovy | 14 + .../sal/processors/impl/CloudProcessor.groovy | 112 ++++++++ .../sal/processors/impl/JobProcessor.groovy | 164 ++++++++++++ .../sal/processors/impl/NoOpProcessor.groovy | 14 + .../impl/NodeCandidateProcessor.groovy | 54 ++++ .../sal/processors/impl/NodeProcessor.groovy | 172 +++++++++++++ .../repository/AbstractSalRepository.groovy | 146 +++++++++++ .../sal/repository/GatewayRepository.groovy | 31 +++ .../repository/cloud/CloudRepository.groovy | 14 + .../sal/repository/job/JobRepository.groovy | 12 + .../IJobDeleteStrategy.groovy | 8 + .../deleteStrategies/JobDeleteStrategy.groovy | 23 ++ .../deleteStrategies/JobKillStrategy.groovy | 26 ++ .../deleteStrategies/JobStopStrategy.groovy | 24 ++ .../node/AbstractNodeRepository.groovy | 32 +++ .../repository/node/ByonNodeRepository.groovy | 11 + .../node/CloudNodeRepository.groovy | 20 ++ .../repository/node/EdgeNodeRepository.groovy | 11 + .../sal/repository/node/NodeRegistrar.groovy | 13 + .../NodeCandidateRepository.groovy | 19 ++ java-spring-boot-demo/.gitignore | 33 --- java-spring-boot-demo/Dockerfile | 15 -- java-spring-boot-demo/pom.xml | 42 --- .../com/example/demo/DemoApplication.java | 13 - .../java/com/example/demo/DemoController.java | 14 - .../example/demo/DemoApplicationTests.java | 13 - zuul.d/jobs.yaml | 10 +- 116 files changed, 1832 insertions(+), 137 deletions(-) create mode 100644 exn-middleware-core/.gradle/7.5.1/checksums/checksums.lock create mode 100644 exn-middleware-core/.gradle/7.5.1/checksums/md5-checksums.bin create mode 100644 exn-middleware-core/.gradle/7.5.1/checksums/sha1-checksums.bin create mode 100644 exn-middleware-core/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock rename java-spring-boot-demo/src/main/resources/application.properties => exn-middleware-core/.gradle/7.5.1/dependencies-accessors/gc.properties (100%) create mode 100644 exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.bin create mode 100644 exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.lock create mode 100644 exn-middleware-core/.gradle/7.5.1/fileChanges/last-build.bin create mode 100644 exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.bin create mode 100644 exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.lock create mode 100644 exn-middleware-core/.gradle/7.5.1/gc.properties create mode 100644 exn-middleware-core/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 exn-middleware-core/.gradle/buildOutputCleanup/cache.properties create mode 100644 exn-middleware-core/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 exn-middleware-core/.gradle/file-system.probe create mode 100644 exn-middleware-core/.gradle/vcs-1/gc.properties create mode 100644 exn-middleware-core/Dockerfile create mode 100644 exn-middleware-core/build.gradle create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher$_send_closure1.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/Processor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_delete_closure3.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_get_closure2.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_post_closure1.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_delete_closure3.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_get_closure2.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_post_closure1.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_update_closure4.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_delete_closure3.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_get_closure2.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_post_closure1.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_update_closure4.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.class create mode 100644 exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.class create mode 100644 exn-middleware-core/config/application.yml create mode 100644 exn-middleware-core/gradle/wrapper/gradle-wrapper.jar create mode 100644 exn-middleware-core/gradle/wrapper/gradle-wrapper.properties create mode 100755 exn-middleware-core/gradlew create mode 100644 exn-middleware-core/pom.xml create mode 100644 exn-middleware-core/settings.gradle create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/Processor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.groovy create mode 100644 exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.groovy delete mode 100644 java-spring-boot-demo/.gitignore delete mode 100644 java-spring-boot-demo/Dockerfile delete mode 100644 java-spring-boot-demo/pom.xml delete mode 100644 java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java delete mode 100644 java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java delete mode 100644 java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java diff --git a/charts/nebulous-exn-middleware/values.yaml b/charts/nebulous-exn-middleware/values.yaml index 5f9cff5..b087ffe 100644 --- a/charts/nebulous-exn-middleware/values.yaml +++ b/charts/nebulous-exn-middleware/values.yaml @@ -5,8 +5,8 @@ replicaCount: 1 image: - repository: "quay.io/nebulous/exn-middleware-java-spring-boot-demo" - pullPolicy: IfNotPresent + repository: "quay.io/nebulous/exn-middleware-exn-middleware-core" + pullPolicy: Always # Overrides the image tag whose default is the chart appVersion. tag: "" diff --git a/exn-middleware-core/.gradle/7.5.1/checksums/checksums.lock b/exn-middleware-core/.gradle/7.5.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..0a427a0a7a45c701b1b3a401693c2856fcd46ece GIT binary patch literal 17 UcmZR+T)|nf(O7*d0|amZ04!VsdH?_b literal 0 HcmV?d00001 diff --git a/exn-middleware-core/.gradle/7.5.1/checksums/md5-checksums.bin b/exn-middleware-core/.gradle/7.5.1/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..a1ef6893b1b46b17a7cc65d0da312037b2970546 GIT binary patch literal 18547 zcmeI(t%^cH6ae7SD1sUUt5Hx{ux=3)jEmqqn5_E_{yfA6tHpuXDLx ze1%26fthodDd&83W(FZNs>ySN*Qmcz836(W2oNAZfB*pk1PBlyK!5-N0t5&UAn+~% zlh{ZpYo^gIrb*>HgpYDe3b(?~X?fWGX2+v`et(e1xZldotON)UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z<&_v#Uj$j{>^k&KX>cn cBDsG3jpyfkr@M)t1y;lT?2=Vlo5t9E0B~q7B>(^b literal 0 HcmV?d00001 diff --git a/exn-middleware-core/.gradle/7.5.1/checksums/sha1-checksums.bin b/exn-middleware-core/.gradle/7.5.1/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..e3d58968754f99d373a040d8a00e472249e1c9b4 GIT binary patch literal 18551 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%0AN0*EttUb}H|O4H>Dn2d=92ot*m9rAUTj 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

_~=*86+0tlLPtZCB_!i&EU7X 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 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.lock b/exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..6ab1827da0d302d425fc0f622214b38329e3f530 GIT binary patch literal 17 UcmZR6uR7=F=H>2B7$9IK06~BS%K!iX literal 0 HcmV?d00001 diff --git a/exn-middleware-core/.gradle/7.5.1/fileChanges/last-build.bin b/exn-middleware-core/.gradle/7.5.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.bin b/exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..f4440d7a60a08d689f12316d5badd69f9372b3aa GIT binary patch literal 22997 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 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.class new file mode 100644 index 0000000000000000000000000000000000000000..136f2ae8bb382780ba03af57c8d2f57479b999e0 GIT binary patch literal 3143 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 P!+aay_dy!wLu~pFHA3nf literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.class new file mode 100644 index 0000000000000000000000000000000000000000..6b4c73aaa3db2f6d4aac44ef712a2a5dd57f380d GIT binary patch literal 6294 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 G8u5Py8v+Ud literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.class new file mode 100644 index 0000000000000000000000000000000000000000..78c404ea47199ba9c873aa3c5d26f6dbbc829e05 GIT binary patch literal 6354 zcmcIodvqLC8UNj6li6;!ujz}5z!m~YHcb|`l}A&sX-Z2;`eM_TO@VZ>JK1bInOSCM z+XloZDyRs8f(R;z7!?(0p-rejeSzZJ`ato4h@ygT|Ky0jJ2Si4G@GP32hQ1ZXXf7T zyWjh@&;0MPCjgv>{|c2^>HE#tfR!#7dOnudjMzXnoi_A+nytrD zmYFXM=ypDqaO|v^Y4^Vs2!Ycp-juS4HwsrRuy8DHOUAaWy@LYPhLsUeJ1sjC%NuucOh&g`1?JY}9nHz6+6^tA-(dDx0#O$(Wu^6gt&op-m&9zn&(Kp&)-q!ySmG-^ zJ-lIKyMX8xs9lvcv(7~VoeiD4wY^%*(9Dc4QEP>riRHRPGpQQ8wY$4J=7dm%xfFbqzsEs0(8g`a(;4$C2p=`^w zPiy0bFy4$)LO2t=ka8%3bI3t9ms2ihj?^MBA0!ycK0R;^LA&U~Rd_cJb^3TI8q*=3nZbH0$09qgnW@!NlF(AT>5%Z@&tIR zymqxf$Ln>i&+Zy|FSFz6qlsmMVdxpnC`RCKv&Js8QF5}FR$Yv>-l)2~NT1>0u! z7=zho70h(R;`NdmQTkgVNvjaa_ge)c9kH3AT(S{olqHt|d7-KAi|l2&VjQ#tvHm#E z_kGt>?S>H6;ZlKsyhmVNXGM>mW?f|IsotZr45;HnhWT1cr)@n?YKoiJbX(wz%5>c- zTC6q#HI9|brpWBNt!p<4oITwVqhOoB{0a$L!49S|%Ur7)St^d4Z)tGLmzL8~{d(-` zTs9rc*_LCOyW_Exk)^p}Mc~#+cxS4j|#4$ z+;V&B{9ekayP(ZP4|*kSb}G%ADVxoiZZ0yIi*9DvFSG>LPmf0%dC8+ADb~oPRvrcMtoUh@XK)js00biWfrrfZ0Zy4^s!NQG`DLNSkllqCX7l)6f!8M z09mYvOt4YQyPNDbKY_bKn2);!X30UMge%Zg!4W1R6vn6UY1t><6Gjj-WHS8>+wO|~ zUtuaz@LBeSMOM9;>cVpJ9=D!#$IS^9E~H?e!%ztK z4&s2o`Q`FW7~|z8D+TK=JR-yFQBDZQ^Qz!5OM~0()Ge>8;4Wc&T*@E7V{8P9aHBOg zj3m0{@#6xs>twPnn;%ap^B)ekv4qvA2q1hxB^Wzew1>(oCBCQz493ux$qU`5O~zJLhxe5hkeAo{d_r zOWKsy>dcz@rouq4Zu>j@TZNvrU9+A9 zxmddT-d9XMFYW10R>y~N=26u5Bm`B&gcX>}zaUVMl<1IsC!3m;y z*Ls-AVDWv8eZZ)LNk0JOP3@Eh<>fK+X5DK=VO2Or|ui@MYPgYNO5})wof(cI=COnBvcrpWu zBKaJ{H<`a2|Ds^EbkthR!N2)_5#JylMJG1$OTKNwW}eHpEqtqT-?rj1Dn;%k==cl@ zzIE}fhVM+(p5u#?>Gr%0L(=g#HLE-02XN&GQdRt3ekV?CR?~7v?Q2#u@#qM4S78JL z0m28wj%L-2H@U!S&h^;b%D|EUx37*zmjsrLpb+3S(h*nIEUDrC-gvXR&%Z_;9LC#@ zVz61g&fjTP-|oLHsUi9>t{=hst3kXQd@^O04x{Q-#A(~r3cC=gqD2&~1`Du)e+_nE zF;X}Qci}WwWh;0BR(4-ye7g}JkSgQb2k{}Q>=ImsoA6;OXBS84o2f>rs9W$6Pf@%{ zego@$Mcq11QMb8@`dG7idj&<^QB+jDD|P)tyvlRg@q)-qT7xqvNS(`kMB0&ri_EWg z8I{bh_n4m>khR%obPciT0jQ52!Y9?L`w@%|-YX58}$GYZ>`p z??{P}c|?i4+rQ@_vkI`s!!->&|U>kaCUx!&sH-sa-o?&98|{)GDv zsy|H>iL!k8M3>UYlIex&FCIsI2UYjWBX};UR#AxGdP0QcKifWdyU%080X+W{=5alQ rKOH4P$J0=U@#l^scp*vDmk;9k=p*?17;P_j6|)sqK!N{|B5nSE&rvip literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..a263d4fd96e7aea42a68451b29532b86c6bc5e6a GIT binary patch literal 2734 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 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher$_send_closure1.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher$_send_closure1.class new file mode 100644 index 0000000000000000000000000000000000000000..6bebbaf2d9cd667e20e8cf3e4c41d6fa79f2628f GIT binary patch literal 3950 zcmb_e`&Sg#9sk^Aan^MN9KeXLBrT1wuuhy>f8cPIYTqH%?Zin3qj1Du~nOT&+ z(s!Fa(}zv9&$LZ#f3v0~*qk=~sX3>Alc)4^XJ=uA#S_oTIdJ#Rz4v>+-|y%1ecb>4 z?;rmH@HGA+FePiIE2nFYR}0DZn)6H7%H8-^9rFlxa(zilcS(RuN*xf|s!MdP8+r7F4Ui|R<(y&z^t$Y(0?i;&gEm&qP zv>kKYsvcSQ*XJuHh9H(f9^0@C?iwcSUi_L9|Ni6ex!1HE9kVx#rLs_J-OW?o3w7)oU;Rgi(?-i%j=?-XttHSS}6Tdm!yy%0b?U*0^3T;mO9tOyy7W$ z1r8vf(+ zC8IwMUxC&I%c+s<#~-v7XgJI65Y^HsAtvU0?}|0;NDb#$2-i01sx(Xp>}`~&uo3KQ zor1;1K&L7XuLvBxAODS@9d#M9Gget1(l8~^Q?Uc3zfxqjS1i9WE<-CSt_-_Al_(eS zsVpww(~8106JJqSsF7)xF?p`9VO-=+lGYvlmfgOr1R`I^3Y&Gd{8fvU+4O8p=@n}+g-P-=ZsE7ftrpR&E^;GJ4E`wMfb@^tEoR<7-Kk2G>Fq5i0o)&Lz@l@a`XP1UjJo6wM%49|6;o8z1OnnVkwfZbR| z&*5}#VDKI6%^z;9^&qYj`4591O3s@bFX2=~bZB__d68bh zey#`&#TDAzsv)J}eDwD+M_}uY73_&m;E$XPL#G4Xgl(sKaq@o`T~jr39eS@yaMbIDpzhd0P``9GZA1uUg9jp`BB1@im13om=wSVBbaXElQ*C*<1;s~ zK+H!1)C literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.class new file mode 100644 index 0000000000000000000000000000000000000000..9bd1da58fc219235610f03253de0964e4778c6c9 GIT binary patch literal 3973 zcmb_f`EwK39sfL8^2$Q^SdPS@1ZZ5aW$Xn*;uHe`M4(`sK;!^6X`PkyEU&%Z6}v0I zrL;}kv`O#7J(8Yjo1-^{)R;2u3HU8-|@XZ-_!s8&)@$E zpdSkYXJyH7WVU3xB|pa{Z^#>tG2`Y-w)73(w2c`npSR_8)00NAl(j8?QhL5|-gAr6 z3oPlMUp&+x1fHnNFXxiF=3#@tV|6(67ChIzHY?Czy9EJ#$n^?_Z%-VYGKSnjL3#rM ztsQ<~239U@o4$X>nQ#SC;k%rhmy>46H_A*5Pfpk}7g(-iRNsFy#w@-L)>SXkJHR5>KFG13r#V2%K0; zSTI{;06KY_v16Q+6K2T{MtC;jnT|i=8V;`lRG^zhGdC%Xt3@ks6g@X^ zovA(}XIpfr!Jy7fOHadjf&FV`MJDH2#o)wjAXSnc&zr?Skv%Vv$eDgH;;Ix8=wI8+ zu!7gC2T6?Jg#Xf|iA7MGe13*QW@o>`#qN0!BAHK0_t z2+DS{L4?(P9gvV}-$!i)8eU>&TWUb%G|-S0*rb|GCTw}bGB86R1lsAq+UTiXQF>f; zC)FKEyv)yK5R;fdA%PqwSy5E?tI`T|*YUz?f|8iRv_jraB910ijvax{y0K8F6>BK6 z4lb%%ZsbR5#V@*iy$sn;J@^S+1p{0$uG*EvHAr=Fo!}g10GC^SLuXeQG;s!i5>h*8 zoHBEP>&RpPp>f{s0=jrDU3)ApL7IDAC zfvV#`M;(7Bkyi#p@nwc_hpMYJlgIX&g3X!7$hZ?hZ3u7e$a&HXWV)7Ye80ff&MP&f zl{T#An`X;D$&s+|tYc29N%W*Nmh$Ez8l9j zZV2*p96w+pn%7M$$jBhD(K`*Y}%vqcrLuqFD&5F`?zo@)*j=d z%YE&!P=njls{!wEO(OCT2Q-++G*)AU!d6-yLmQrij$v%#>2AD=JvFGzRZ*G4D8@om z=5U2y5uD}Ui}*CLc!j8Z2IJ)QH*$?&duvox5WZH3pWunYa8GI;mL7Qv@zerlZr_1B z)cpZk)ae3BqeFM$cF*I6QdoovGlZKTVw1*78pkX?TjAGDdz5!}5N!QspMFdKLWsa% zN`E=T;N`p6nYyGzqgCKbRYlrJrU+xHd-#eHqvDAPTH%|n@a<3OkLzF0r1T#Bn_Tzl z-{RV@e~0UF{d-)`>fh%&sLye|tpAAXP5mdCvb==Kr3%AcVVD40^q>9%KOdykzkGl< zNA(Eh|8`M6|0ny9{LVXg`(J3|I*;GIPlCY@pfBJLgAefTC`tc#7jLKD!(WyGwfP~M YHRfsr^Rz2LmTCUprgQJ{H-gxI0YA%M6aWAK literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.class new file mode 100644 index 0000000000000000000000000000000000000000..af0300bd2838891a15e54318ea2e8935d0a2cd21 GIT binary patch literal 2364 zcmbVNZF3V<6n<{{vTfLwHhtr*f?92w78X!IEFdL9txc^qB{fv7o8%^4-0pUEH;n!2 zH-CuVD`@TL;P?q<{7sDGb9Xl{mGA*4lf9dJ&wb8$&U4Pm-~asnCxC0P1g^=t;mA_m zcI$qbkBT9`cZ?mkQn#gV_@=GirEQc?J(T4@ zLzlpbn&-NY_M-j8@V#-`BamtXxe!?j^woXoIp&V!d9DST4?N4M%?tGUvh2x#9;f`k z46Jh2Hhq7|sk#E0oa@z$GNar!>%I{?_hi*(K$hzmOfe{6s4>Qn=P~c>GrV&%9 zMe~R#r*K-KoY8R{L;ZYvL!dj@wtRu>x&Ns>S@tQCN(073?=8u~P5ONcZ>yN61TJ-y zCnlaRd)97nXD^USz=evr8%R&Xy8;6$=}jgAv*|W3Q9aGSnsyp9NlYW7;}~>BdrlzT zF^~>*qTzyo-e4G2+0AzM5y_d(l6C-OJ}%-?5(X|uz)fB{-d6${xFT@6A!4hrmK>(T zF>PjiJfdHcEIMOdm7c{`_FAJ;;ugEgfII5@styb9&3ADQ;>aM2qSugP+rB=ahR+11+p`hX%4Qp@ zW`0y>f1boDzRpp{7((qvz*dQ4( zF#eMRAMh(Mj~g+d;;jPg&CC)*(Tm8anrPe+xQSb_{V;E<0D9=|wsLobJC7DZ&WigH z=-VymI8U_Ac7(m#3HDxR*t;*mQg4+0Q>xJy7}Qwa0^5X0K>HW- C$W`nB literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.class new file mode 100644 index 0000000000000000000000000000000000000000..9444160f39a9e12ce4844d179be66737c684d3a6 GIT binary patch literal 2863 zcmbVOT~icC6g|BHBkQoj^5tg|4T;M_93*ODP!rrlB`kg|fgmPi*ll2Nn8BG@D!k?` zKP2x)jiHiCDo=QV&>bdUL zcC>#jd{0i>1@zGUbYvr-g_u({fqc1%RtY@IS)CB*36F1i?v_=P-VJj@3Ur2hv)h|| zKT!2#O*(;P+P=Vr@@o=VHhpQ7ny!r0J>&;wU{y=D>HAa8iYrhoyWXl%CG|D4?i(>J zPp;UcYPpWlu%*AYv_yoNl7P6&95-ZOhQ|Vf<<^4CBnR~AxM(?6a9LnqVR%m9SYjA> zrsJ=;-iC2aI?^)(SyQzbT9rY`wC#!&$VtyLx7oSE@M3zFbrxkq8dci+v^NsR2_1tt zltl)Ib@ZV>i#8k;=vCmAumX(?1r8U6lbpgXH;#yM9PcQUcXi~^+sU^R0&T&X#Xg*U z-9Ch!WEnY7B)DJkQ{`tm4BQ-taFZcFz=tZ`QvzpFI}>xRR6T1mxUwBc)w{`>xfw`L z!>~Y?s&|8gz(}DbN;ISsuVy@g(JYGiNJkC_6=Or7keW!!h-f&&;ZGPw19qu3d_;0M zy_+e3tjEVVo5eWJMZgVSI&U?5GmcLMjwbzU&eW8{ayX{ViVsBemnG-Tm{n6}@iOtC zKXqg^Tx2L;wwCZnA&IbOLexZOL%!^;y5N1gdKzDG9sAL#YI%j$L=I;`S@*ZrCN@@( zeFVbn-batgnx3<48O`)y@KhmJ1A?v_AK z<<$y&vGCTost~y$b+=oz;CRa{Q>2WFyAs@yE7FrrRkEjjLljGDNumU?gq$b8)FFPA zf`on(`}py|u1`SJBn=Ccr8fuEuqbe$!vaMqiO z@e+Rx%amF6cJCaXiBdx@_s3=~?EoEoaq(5_~7>!<^+?+?aG6SE;n?P$j!4*wy^|&hw10Y@4%vSb%Cz-W0>sJrb1{8 RR^JQcG+s`DI=3^>{s&^!&&L1& literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.class new file mode 100644 index 0000000000000000000000000000000000000000..aee18b7471933c98394231b38c77067c0f942b2f GIT binary patch literal 2147 zcmbVNTUQ%Z6#h=248(zwKud45UZUiJOj~WMrmb?Z7)go}45p~8VRE2ThZ&ribjho4 z{t(}>Rb=VXphd$S(O75QD=_T`RrLk&V; z^nv-%G#u02HkLOZNQ<|90t+wg=!pFj0%x{;&wIERd01?mTYfZwOUGfGiPVTM6@+GJ zTl0}V#zhf*)SNhCtjnawKwhZS@$0^&Pob`Qk zPvB}gv)&tJ-3{#>X;_pGC~veB^E$>b9!CtPbc`YqM?WS6#+31LBLi)O0%y~i7N$n! z+E27{7Uz_e^EyUwa)_r%f&TEm9SAHJU%ITl_`}!-Rp_cRL`qB@E;TNR<~6*oB6&mL zO3$J-(^0m3dpDfh3#BUSY|Y#arLW;lfnimOc62j#pGN zasug|Kzgu8!`lLSE5e9-x4PX&L1uavx`#pL!@%V@W^g4k+>T4fJF09mcvs+jtF#@u z63eTlm9{xujMfQ=DqGlJBC%f{^ z9y7|`R=6U!q%U1d((ic6@+DiLMdW4&TqhlRCi=JrXz1npIO=d@DwR37+-(iB?5Yt1u8=fVU1ls&t4Kp7Cn}Bv>JaDuEvb*R{Z&5K#r_0*8@Tz2v>=Z*Dk$=q$q#>-yax8xn$k?iLf+c|~-45EKD zuG$J1{Si8bx&NSM4)?f99}794N{IyJtNeA1yQ=R54oTzeZ#a`Zz=hIucH>uEoL>96 zQTcmZb*cfUaS5+-U+1R`C26={jW?c^xjCAPai5}+b1E-Ysk-_Y1%m&w1D?T; QKf{PdiU@p76EO_^2g2A(g#Z8m literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..4926825ff87393a5dfe890c502787f8c1eed26d1 GIT binary patch literal 2603 zcmb_eTUQ%Z6#h=Q48%YoQ0NWo1tkfz(^gwAp;d?$k)xM%3L z;neion|Gzj-420MHP3bL?S}hvjdgU|C2+Q#wTqz&Eh^8-h2_a@=>$HviVZLIz_RtC zcm2%L)q1J7{$s_Sj* zbJCF>si;tTaJ(jif??YwE08muXY2}G$z<2tqpUlDwJmj%@;>GDNHL$nFis|sz(@*% zNGH*WQvyTEc&U+rLxcjSGua4JgY3g2S~-KW%F4MEPGF#yt5*d&gDs29Exb4_N6U?I z_o%QHD?~{=tmT>;riO3+E!~}9Fyn>WU#FRj$Es!>qqv4`JDvB_yyX$fHVUXGOB)2ihd|bli zBy?N}4Ijpp!n=wx9ani7BU)RfHt#SUj$t$7BVqWPl4Ynbt75cxC3$eNZ6#~?fUbNQ zPvMzNtiA!`s0X(nnbh!DfH_{ zcV8MJWxan~UD?4hbBqzh;rYG4Vq6^;a4A+>rwng}?#?a8q zckso)Qw_cpc$QPs@HxB9^BdGq6qq<((Ce|NLJ#@uifTx=l32v;6h6gG#m$$j)z*za z7QcoPyC=(ud59_{_AK!-e1(-Hma&?`96nPGtIRTvQ2>a`$=kKoH zVxyNKe8)$iWYruasC$x~vA}v~jTc?gyJC2jv1!X?HL%Mrg`BKdzQv6h$8l97b{$@d zKK5ku`$c1?DVr?0be~k867r6{vC~ zXeRojcn&Bsi$YW7DHk)L zi;$d8;yNURbxBR-W~@Oc-KFRM!otFzSS+U#WaEp5ON#R4Zi*^53Q^`hmL6e{<38^E mLxqLMNFQL0%FAV{e)9lJ1Z}i(#2gPlLBGZt6{yif0^0waVadS& literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.class new file mode 100644 index 0000000000000000000000000000000000000000..6cb0a7c4af278e348ab09d4296cee0dd65544115 GIT binary patch literal 166 zcmZ9GF%H5o6hr+Bv=S2&$Ka1#05O6DCrFd8Dpi`ONmIeq7&rijLZmAmo@~p5Ki}6I zz!44MB$>Um*@c{Rfnj-g9)ihE5+~&rFOGeoR^C{nCgDp-HyN{yGKilV5MkG=S+P^T n<7?ZCF71l2|C=7V7{dG{Z0{jQEobYbCRA9LM~et`VTH{Pm25GO literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.class new file mode 100644 index 0000000000000000000000000000000000000000..de442981f3a094d10e8f5c1e65e8fd4bc5a00e30 GIT binary patch literal 2132 zcmbVN-%}e^7(F*o7UDulprxgy{)&29Sb@}Fq%XHCv*%Wl|(Pb1V&WwO0xrp2n9}Ob1|kSX@{Q} zAJv$J%ReohgpHU6V?pIYSQV5c8+6rnO63Cl)OBM09z=f`S zwK`F;e0wLH+YO~+bhc*hgwogWj=-Q|;jlD;scc7N@ zy8`JV91ZUY=y8RS?5=gDkBZE7=eSEi_QSyWBxZ0S3Vc|Xj`tN~Gx$K@Ow4LqX(gBK za7~9DKN*$3DXBtZMQPFI0Q19%u0q!EAyWmivxVc?IKwl#Q92*WC{=c-c%q}<9518d z)x%|3m%el@$-JW(%a@#jSi>#xU#1+oHu^={Z~7H_c(>umT~rBu+uhPI%Yl0NfEqaT zlh2d3-cePQp^#fuGxu2%^SGhoDy}KL+$0}uRXckUkxS4%f*;WLOnb8$;{^c)_FR?nn64p5IMb45yy6lnCRnxc4O-HV% zg_p;2#KWo`*gTkZT~FOFp36xdC?MTjZg5#V(ANtWdoK#~4 z4F3cjgWP{q*A4fiY9ER0Q&b{F`zn83;;#4|!vSTS{~f3D`#8Hao!|Hk=cdoRk%5ZOK_iLluSDDGy3xf$nQPGbb0Ctj;qrHT&$KK zVR~vGm-c8X@HJQRI`kAH8plnjxog2QxU0Nl`CoCa`WU@?Yxybx5}Z0|`x8t_!$(bE zL#&9vaGB2)J^~-3&9zAsMM;d{BLNP7MWI=W*?&T7%8s%xbqJk7M~z}fG_C0Sf%UABa{gKt2THRKl&6y N8YLp|4MQX_@IT~-ML+-m literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..845b08d72de4a80e2817c9b43c7498bf024c0bb0 GIT binary patch literal 7994 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 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_delete_closure3.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_delete_closure3.class new file mode 100644 index 0000000000000000000000000000000000000000..d3e933a4e5810fa3d88ed40506712916cd1014e1 GIT binary patch literal 2358 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 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_get_closure2.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_get_closure2.class new file mode 100644 index 0000000000000000000000000000000000000000..659face38c096b3e0472345496cecf089ea4f203 GIT binary patch literal 2332 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 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_update_closure4.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_update_closure4.class new file mode 100644 index 0000000000000000000000000000000000000000..b6deaf850c2ca05f74b6aad785b932059558f9da GIT binary patch literal 2350 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 F@IQVH0SEv9 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..b9e72d86063e55c1295dfbdd44faa7052d7d362d GIT binary patch literal 5788 zcmcIo33n6M75<(qTe29yjDgf7G!8M~1v5cyfnXptrZEO%Q)CPdG-ND|At3=%a6$E>Gx(NS(aoBJ%{6S-so-jes{mm z&;0j^Cjo50e*}7soMsuLxs082lN?f-aj&IK*r{B`a5Y!YXj#Wj8m?POC)|i>jIX+K;?zxF3OK)h2G7^%kRLEWyY;NV!u})r zFp}ClRX*Tb^EL_TcF*y zLXr^2^_;5(j-@%qSjI^DdM}>k{m9|Nq_De3K-?uzx7oBzZ>vB}Yum8EP5t@H6w`9Y zY-d92H7tXw3~bhtHoP7^lS!DK(d{@o9V_12cCb4CoaLDlhL+@cdZD2eE_Nwch8trD z;U)z);3YAH@lt`XH*UHDeRC`6>f)EO))1~lIMXm)m4<06J5j@A0y!`Rbjt9oQ0{EP zMX*ZXMk#ZzAK!zcM`(mzLnei+;ds>8syrUwGlKoDJb=Y$lWHIFo0Fy3`Wmw&M+P zWk-G`f>#PCN!|5^>>zCCwpc#A6>LLK4BgnyF!i%TN$^K-rO(*)Oo}N+Kqbj+yngo$w6lxZNo|%W@LIfIuveOiC=U z;mX?g(?)gI+=ExgFo?ZUq=-Ph%X-QTZ>FNyC)c8Ks25lBWl37ru)SMfIA&JbBgCcP2tk|WU z68@D4Oa<}4C`TD#qju^<6cf})(lMAd{Zi4=dayE@%2SR48(FE-*9t@@3{T&#dju?) z-_?@ac~_fOd0&b-eLQd)dTP~zT<%;tcN2>5 z2m(#5ZH4;aJ9cqP(&L5vu|^)7_Wr<$6x@e5#E`-p1?J0=Q@ktCQN{MNF;eg*yjg1L zEeaa3SX%mRY@w>gLY4X#!P^l-+TE!;O&p3+;Az0F$8s%%(r9oBD zfJHJaKTDCyO){G2=Gca{#ASk0umZQr?(-40Y=!kInNPt< z8OmXNg+--BHc=)0@A8sd$Cg`5*kj&aV~npi%YU;iZ3!wtPwBP8>-dP9Q5EueT|x|- z?CPWV7VA>RPNxkgic?(8x$@U(z5=;wT2Va4tSc8Sz8Rx9%UPCB0=^zugeTcNY;K|d z6k3Ottx-I|j#y7|_dAq>wqa-C8J6GuMDZjGLHC|L{e3;%Lw$n-hj%6h2co#hlVhfp zDrPPg$?rvF$qx zSY4UbON($(-SP$UvlyPm&lP+PUzeWyOM1g}{i?8O1izxxggJoO zK4GRUb~p~JeYl6&LiQ9k9eG%HOr58P0+L6WQ}Xjz!p=EK z<4!YU;1po_;BQ{e{j~yS%}{lCb7J~{Tyz7lrw?L92I`qh@zQjQKa4E?=$$hOA6u; zQAfCTSyCA2R9oVm>dJWg6gomsJ3H02@s2613t`O^UQvtvo$C5{`(xPHsopNXUH-XF zb@TLO3U`D_>s1%gyD8ih=8YY3b>|dzlitorBram-rrM@jt`EhVYSrPUuz!Q|{hW8I z2jc2oKF2A%rbaTnThhK~4bP7H7}Qap%IK!Lrn>!+3rLOBsAGwdaHpCk_VKuSB!4{< zLSm#=wGtydnV5ugigJeVPmU`PMJ@HR3M+Ad9dwqOydQ1&DAwRC*5WBX9iuns5iI@C3UW%>*>%?DD*x7F(Qv$$Uk zJ%VWaB;I=JG#=>hxP*mrbrSC$=|6)9I?m!D30B}=92uAkUPNPr4VA$A@P1N}wwE|0 zl3J-AdAi)lAHWCmN7X#*y7rF8agTJ7^0ObphpUj?SdHvQsHFhG46+-mk^LAxUWIH| zHL{<;C##X|sz&xx_%#1TQLcoC1F}IheWuLgKZnofugpOGa6mq|^M%qo4FX>*L(EhJ$c7lIBr&_IPOr-a~x7HaNMtcm*WBTDUNrm-{+WCf535EeLCTTXKG-^%`>`% zjwl%|QGa{^y}RgPKRJ(QN7N8=!!HWB_%EpZ@t!=c*3)?IX)NM+7Qem73%f2soy6~V uoyYSdy!xjzc#dxNH%X!Bl#5@)f(SEk2><4Ch>rgPzw>xNCc=n|=>Gtsq>SGH literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_delete_closure3.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_delete_closure3.class new file mode 100644 index 0000000000000000000000000000000000000000..dec9e100b943714b5d98cd0a763c1045775d89db GIT binary patch literal 2354 zcmbtVYgZdp6x}z04umO>K&#lIRbwFmJAG)e(xMRCiiAfAq7*d_$xWC#%&=xARepj$ z#P7B3qAXoLKH0VWOE{J}A{-CEO@zTum;vE#W_>HDtd8`k!YZ7jMqx!l^zRcg|ffvnKhZ+h~I1|cxm z@Lc!)u3?)_!ze~48qxw2uGcWC1lTg0z7gN@noeMCOXIe5q-O@Qc3{ydFm&X(3z3OH z|M7PPre7`+4c!7KqG$vzkCpD3_f4Z2ShlfX?o36?FraeaSx#drf9!^i9_aKe=LcqB zRg1Ri`*Tj+6)2Pv!&Rj-gATkZ z&=G7|zQCQ*%aQ$@Y#4ZN#cc-Cn{&vYQ>8SsZJfvP3G`Hy2hmdH%T*2woKK)9PEb2z z0x2t?KEvFG2di72`@OkoOAT*PZDWZ>XG^hE1J88)y6bHpij_pYfpdze^8{Ahm&5!o z$iNKqDlkmc_KG+-V$}VIu0%m;C{=@`y{}CZC+ZyBUn*g21IjZN+IVS3PSd znB5JeD!Q4PxkH9ETogE|bami}z<45o$zJQYj4K&j!h1S;(bvt`uL_JMI+7rA4Ic>T ztq7wMxzYZ76l6YGunBvBqHUus zs#d33QziUa26LF#F@sr^u?2xMhuV8Ceho_kX(ma>9po}t#)^(2K2btn6*$$NuY=~J zo>^0OzYyp&qt#X`6dvm<*D_M?Q zY;JE#FWwnmiBhs=`4&xP9LH6q={hVcea_+ECZtSq*>}@Xe=zoSYG=!>31rG{)2qr` zmMy9D6x$!$4buG?C3&F#NAzQW-;5%ZsXf7S_DPOkb2W`LEdU++cxACLKJf&@KZgSN zhT}P&g1?K`aE4zsJBtxos@dzDr8s9(iLsXWRrk9U)`EC|Ke$Mv!cm9#7aAu*!`t|l z6XixH8c@%iCJ=bsdPc*W;WG+6$1~++*ChP}@)sNot} zq_$$bk&tU(AbayS+@AjxbL-hu;R#C0QW4G{Q+%~Z9+Zn?53%?c1~~4a{3i|OpCY@D v&uP58PSYMV^-LSzV}i0EQgtNeCw=Ok*JrJ(%>1&4p< literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_get_closure2.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_get_closure2.class new file mode 100644 index 0000000000000000000000000000000000000000..a0abcd39fd4c922f32c522ae5bc2156d8bf87d92 GIT binary patch literal 2336 zcmb_dT~`}b6x}z04umNmfmX3atHweCc3RY8O^edlRwM)@h$3nnCO0rO%&=xARepj$ z#CL4FC`*?gPj)STQ@HDtd8}`m_)2O(0x!m5%)wX0%qoLpOVxZcjOM#<7kxS&|NNMJ>LHBA1Z49qa8 z0;5FjEQF&YMm>1!N)(iafpcM{((xMP41eOMT^(!aFKrtV3U(Y#3Fy5v<6D^d#lS z)QsdTPqGcQ>me?rt4v5@sQ*?+pJ2*>+^5wX-R`cxQAa zO2(S)+ccST99I>k>#(5od56E3kSxjNz%57pve?e4nr)ZA!A#X{d6v9wHzhTmV%KA% zL3%Kw#10I8hd~VSn^9CUsi%0(_Q>&bu4a*@1)$>)&s7SOQ;#tELzwz6I9}i>$m_yH}oU@(8SWEn>`@ITlQS9SaF4FjtqYm*GG){zuS5f0cxzSCB)H7!Z z1Rl4a(eQHki~`T`OgWn8SKaDU;N^li!1z9wA_O3OcoYGA#kqoijZt@Df~HZdH)DwL z!U2qI>U;DQ4)NCheaw_6A7eo69^%G&`2l7o5Aa?Due_%K`=4M~!!@!JO0qw+h3I38f-HySKFM)nY^G+th(=_e0R lDLll+iML0dpkJfT(l7~;A&?@Xhgsd^w~ITcVR4p%_BWQ6c|ZUF literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_post_closure1.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_post_closure1.class new file mode 100644 index 0000000000000000000000000000000000000000..9f2c061f18be0fbdba29b9ce466faa48d25457b5 GIT binary patch literal 2346 zcmbtVT~`}b6x}z04umNmfmX3atHweCc1qP^O^ZToE0O>bL@8<s{90h zi0|0CC`*?gPj)STQ1{2PE7NP&`U8jjp**4?IW zai|*dJIB~{tIfLf4d1LA4bQct@4KFF*t?CovE)|eN^37uX}Eq+p{3vSZb26I5k%wSL_(FtktCz*seo*;=6ePtx_REsURTk37olUJ9aQDFdjP;da%58pO)=D z#XH$`fuYQ{3<_qwUbX`{=XvIy3MaeS*@>8Ui}!urH(G{y9V0lGLIUS?q%oXA7hWVi z!H(?QjPY*!>l^8AxxzA$yKRNv7KvkE0XltEl&*CCRC}%3XoW9mt8()6SPb z!e(xV!_0;UYdfC%t+`c~8eXH$COR5jEXE=YJk#-OuD5$EQ_}PbE-9KW6Id}{4zpj9 zff;61V3erswQzLAs0WW-iGtFQ6X;P1RFWX%375i6J~@RqQ<%gRf$5IQij!KlJi8Ih z?*&qo+g#ObkYNp11;R{Qf&klD_1?EpwV-a|fx8@L$(AH}6(7Fl)hKJ}GR5^pPsu{M2qvSyUsTCgf> z(vy@QQ!|pWJjqVfDu}p}t}`JWL;b%(3hnYqc3Paschp5R++lS-JD`S-PW6O{w#~Mv zT77C=74XL?EMQT`9OhNVN&**-wfCR+H7pAxnIs*bAd|uhR&^Bcp%VI#(f!1&9BckTS{Tz->qUyV%vKogKF-kSe=P&ysiS zx}?$*Y<_GvNDiiy<0CXJUg{9o&)MJeP7z*Gk zj+b}}{w!X?1%B1+BF1Q`W-oJ=;G9h*##-iA-S1UcC9#j+xk#eIQHS^k8Ye=->-d@z z7ZEG#ov?#>3BH^V3QHmOu%?)f_b~C%1DnG#) z|Ayad>rh6=mrr)a-_%i`ySsrvVZY4!0?ghF2p7R z{m0)Gn0~QHG;|A`h@%m>JYKqI-Zza#XgkJ&Sue!PD4=ra+wN8&ckG6a9_aKe8-!+P zTSdnVf;qS53FJ#{!Z)ItDS6K?hzI z=m@v%K;Ta4#mIg}HVnMC;x$6)&$;B!wJ6QO7S5CS1bQmUgLp}Ls-ALK;Cvf;k_5Ff zCXlj2>NCo1bg;VZd*7Oyj@0l5)i&PN=xiyGYUrD8Q1kqqL$Q*m*Kke|b)LYA`*M{3 z1sR%AUIj*o+FB6@M~u4v(3LnS4S9hsl|m&7LLPA`+T@dycsqj$ToAa_R$ED0%a(7~ z!`a>NPt*H|JB!fB3>zKi;%GiRynM3V86TgNffi#n(;|{VJEMrAS5g#d`uL_)M&DTNm zQO~TYyPpYknsMv7`23A$9e2Cw>jv9Rk+M~tz+>*#Oy5?Ox~c{$n001-!`_^%`%1Pe z7aKd9(oc3qR^pVb*?~=y8Q1kxX?iZpN}qH2w}~i|T=v~`)gO#~o!Z&+(Mg`Jj*lXXpUcXt4D#C@?sBT54aQ&0O6yf7{KIQ!N0|* zJ1|buIM&$&Vl2N0V=(n2y7K#Y_rXI5z`)?m-*9{WSIn&srt*(bQkIHv{+N=hMe?9r9Dj(#zc9dY59L2;F#iOD w`}mZ`%j-1#{1F!OKjVudZx263uST7vu}O#wffNy4%&Nt22X{`Q%2^89e^0-FPXGV_ literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..eb0c83fcf55aa14708d95e8041bc77f95665f344 GIT binary patch literal 10366 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 abM#TMi#a$)yXkpaqKRG%jAFQswBG_ICmc)w literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..b17bd359f8984d11c2d3457f0a19503065b28b09 GIT binary patch literal 3584 zcmb7H`*#z^75+w+yt2F)vp`xUkT$6bvW(fFCKzlW72+9Wpq4Quv~}0g*j`xgs`~(( zKGLR5L)tWbzu)cY?`hIQ?B=wGpPF;}H*tFU%}O@HUeo%QSW;fBz?d zQT$opxQt9!&PI+G1r07uQ{HjSMXwn-GB5+nF@4$c0z35lCG)Hm%G=h`d@WpErY+Z@cqzzO^WCd;U!`2&FH*aH%ED zhoZ&>1`9!Gg?6LrSV3^!o$~}rv4DoxlnYiAm~FYVY|fF5(Dqz&jh6h{%nT(=R0YJ# z0=>s<*A7nz^c07t1$GqXWmvTwr*4O`;`02I=WSX|6Jk>)3{Y z98%aW(ATo&+m6j*hrsS)?S^&BG9AmEH|wFYd3m*&2wScs>VN0`@ZL&zSEE`5Rec!kR&b&ZO5$H?oHX8h@8-#wwy>#SS<~E1x6IdhRAN_cnu#D*skJH z^;{w`Y7p20`??))Y4!$DF+S8~Zs$nHGkCTiAIB%ivZD~ zWkscFwTNpC`vr0hD+s5&DI#28G(p8K4PyW&>pX-~4n+(r7c*V6Q6PPnNtDGwVoCWz z;HAe)@7Uk<-s7C~91bZbmDPhOKGxCreEf6X(Ud~CYDg8jh5k;O> zOGe;gXIM?V!E54(MAos-lcKskG^3k!X0XOPFMF zTA)7$ROI_ayg;*9>lBzch0n%CY}3a!`gG$-A{5W!oKon#z}Vy9rRw8?!&?t0u9CS+*E`67@n4m}dAwJUOW z8P$%ShU-MLs{g99P$Zcj8s5%89iPV+a`+r(1h%Qpu_lpiEFsA@dtQfyS(Ua89U8KI zY!xg5#l%P_v@s3yjO(hZ?Iw7<`}x&+@&5{B$FgxFhXveh3tqEJ$0A-<7i=U?1rc+u zP%b1mTgNp;m&TU_1_~-;x?1SoE=RI0n{{t4oRo8H@NPpg7Ecri8#c*mH`~l1UKFo) zv35|V8uj*L1*T}wDe;99S=?q1x0r6IW_e=Py?#r)JJv znw*$9Rhg<}@m1DH4nR!wR|R$@sUdKfKuC1tW^E`Q9L7~C(R4((r6z%Iagf-$5DniJ z*uOEdiC$4d#N8a;z?(V(gbGyOWzZgCc!TRTe2-ouj%fQMXz$cB9pA?fa(Ej*)bS0x zrtJ9fx)G*B*&bnjs%U@4$-`=oPS0(9aQX#)*+&z8#kf@2Fd1o%2J&LGI4k`rYu4e3 zQS*qeY0J0OzH^vcn?0Di+gJ%2H#tMBUe>+HZ^$#YV$V;u<2G#vHu)>A>#4dyG_n7u zh+y`x!JJAR85Ltz;PQWA|UVPvN&*dr6hS z0Dc!!2(JBj0w3X*<1q51QZgQpM&tLcl5ugw*i$y1UO^!RW8X3k+{eDLbUuA`#26{( z(}p>`f={Kv?el7T_`vFRv}_!0a~+Mjj*eyW8Ip~a^O+H2ylfm_!KYJLLA6J5pDLG( zGx>Brvx1j0eE9NxOpf*Dd#~nu-=QvT{hy{@8SKPf?8X6VK2ELc)cXdW#Ov4-+jW9g zD&5<5sb2?4qins47x*hhS{GBeLcdO*`iTQyC*r{P*P@uIY zZwIfHPMOmC@D;TRC=;{u+$ehD>*12I$GB5386(CkT%V8E(fDM{_zF+PjjwS%WqiG^ zqO624D>_1+iR}P(8{hl~CNEIo*FV4;*Nhb3{Lbo|{9Di=uXf%nzKgg1g&kb);Yat$ waN$E3%lOHK5AgOivi|%%yjA)ee*K7zyB=UbW0s`wN2-ycNB_jH!W*OUUjzXDE&u=k literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..71889a7d4470e5c0fee3efa339d8dbf03dca5696 GIT binary patch literal 1897 zcmbtUU31$+6g_JvQKBe`?WBcJLisSncAzQ&Qow1!5fn<47UE(i^r5p>)~;Gb@<^*f zegZ#)_fnWN0|UcTJHv14Fx-`7$7$S$3@@wE?!9O4J?Gs0=ilG|0&of6F*HPM`l20s zK^!@>?3&_7-`op!V^2h8#62?Fx>Bp?D%unEk}Mff>x|$YG9dNQjLlQDit%vG4Nx-1NBL zHJeg3T(7naOk-Zh7#0}Dmw^jdR0k%*xhU?5u)JCxp^8D`7MUPE?V8seWU zZZ?CC+!h@g7T*yh;X>I71(%|4#>~ZQB-}_!o@e4Dub!v31jl@l+E&9yG#RG{)IcRJ zpQQKJP*=wWlx;3*B960y|xH%^0r4iB|9LI zTRe2tf3`V8gX`Se;=Sx&Zw7Jbh^wy3Slmu!Yq^n2DGlEb)R+f;M01cM=K%SFuEqf< z{Ddj!^wkxKbTUqYPQ#$}8~R(L_#Ax=9HL;?N~K3Q^9%jwuuba(MU7K-Gl^idPU9?I zAha=M(hOrG!&t5z;Cw0fGbU??c=N$SEZZwjFsF78@y?F@E0$LdaPa}bFx;e-B%OVV zc@5P9y&VI*A|0!{#%qu8o{Cn*lU~_%OVpq`E|xz06CZE>f%TnIjzT}_htlhtg<8lb zp_PYdJVue$1AOr}C2T%H=@8c_+1jC0Dy>ob4PPHCZQ&_qHPSAJZ|Sxi5z(TrqGSU2 E52ktz-2eap literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..c896829b5c028b6f386517542c2bb9259bf990fb GIT binary patch literal 1885 zcmb7EU31$+6g_JvQKBe`?W8~`p?nx(J5ZGXDd42VF%;S;EyTr4=tF0%tX-vw)+4P7 z`3d|G-b-Q93>_Gr+8KURhvBX*J2r72^0FH3-h1}mbI#p={{7=G0GIJS!-k0MKr~`s z#*s_Qo-KX~>;t(M`y#R*+~2ZszRjtpCN)DFF%)eQN8_)&)U?MR7GNOjm2_6baxA(M|3SDst-c@$j_ znv$W^0dVD>xX0tj?&4BcO<%amlY!ljrF`S=T|(HdGO!;QCf2>cQ&$+$g<_o{n{NqK z<-T9@l&FLur}9<{#XF-fhy&#v2-~H2qEFbp#Il7M%$i7Hj$w=_jV6(0I9G7?`2%kI zJZRZ9rQ0nR>lUUlZ(TaA6<&A_V+lbQ}qG(l4GNla&x`g{#bCeGt^h7Yuer!+_?s=1-pR-1=P=!nW5 zZ-sx7>Qw@ti>yafZ3Q$+Z?426+}j4*?N0)y4-uxq7_ z!RxzC7DtOe0+9G9VZ}rd?{$IueOb7OMSWm1oR8wR2=lA?5gJ)|MaPX{m0>oojWuAz zr2+oQ+;&Yi)sAS=m;|mM2^aEiD7X?m8z%l;BjH9;@*?|o^2%v?KQQEru4N5;N;7eG zKm%0b@@abS40JU#6dNYiamB(%_*g6ZIWc$Qzf=7i*rXvQF^PvErzRe<@CCj!QN=Y2 zYq+e3^XvbOWY2A#k-VW}w;0BG_Z7Hw_BUV~H>aqDTQt{Iay`SG;|1boe9#c#ZQk%{ zC+A2Kxz0mR|0kO>G`Q~lZQf4)&6WkMU%CQUFl6O8535iaCXzhJU-jCUSB!m_jS40C$-81L^ozhQah2$vob48v_& zNz&Qpm^V<&(A&|+%hIvFYrOOrAL?jbJn5BOw?qx<<81DeKk?bt6Rhv%QWSc%7fSDL z5?V#N6IytL%2Q-%J;GOiQ^M9WIvN~KjwzvG*s(iWa$)*$Ut_>OK%5fOFz JYDy-6{{U)}2&n)7 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..5e44111d28fab6f59f6045d139aec765ffd9c8a4 GIT binary patch literal 304 zcmZvYJx&8b429o>kOf3R%MGBxCB?P~1%yPgJ<{xsnd~wdujVJPSEJwn911Z}3L=r_ zllA=kZ29}=^9#T&P8Ax?^O0gf=+Dv z;(2(K_HJLCDkz1EL2ooU?JYgG19z#yk;3JF_l*rAn@Qn(rM+>y%Tjo`diskf`+9Hd z1BwJoaol!agI@Eygg08HG}5wQ$=Yy;_4VH1?wVTRtdSf#zV96`6lR#0p8#sEut2q~ Ja8fwK@h?-&V7CAO literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..64b614d8b384fdc599c0143f9508ea99d8602635 GIT binary patch literal 3573 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 Z3LoL$_y{c;Tdo1$(PIPFREjYI{0l4(+}HpB literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..e394722984b3fdf9ac334ac55e448b5af9146961 GIT binary patch literal 3253 zcmbtWTXz#x6#h<{bkcO_WoWBVDxeW^p$tR?q+D!+Ky6yEDQH2cljJ0wGMR}plR~}U zZ~wp_;5&i~iY#3|$y)vS%^)^P1)8u4S*Nrd8tVc)@XPt?16sVzzZAfiaA4MOjl% zUNhR&bTFLSiW<+ShA$OecxFq8FpMF6^6dJ<7%#6%o>{GOqykjA(gZ2 zidv+w7PY#gHf~b*WrG)8-7?kI-7yAfVSzMEXBpTPhRzeZsk^5b1{1j@ZCO(d&8(<- z*VfI-Sn@JMf4suotY#Q_-R0x9t&t0vMDl8|$-3$4RjwB4J|WN5rr?;29`wc#LZ1v7 z+hPbqVF$wBE^-ECV?^G$K%3hP*8@V{DB=a`)C3@9TdVS$ zmVHBAblsYIo`&;WD{FU|&1OJJ7-r}e_+{(1%}tk~l*suR z^>TC0s{`N0MypS=6X2|j5xmfiUD(YKS+WX~CCX00Dp9tj#YT(_`<@O9swyf?y69(IN_}LR z5|RvZ!LkglnU~Chb?ZOf;A5Sos>` z#pQw&$4gp`8eYOVhHZlGT8=QJ1Cq3v*D@yYRt)DcB_oQiE@HE3hD4wv0o*I$0@YbF z!Ul7nY&YKsG8xRQ0SXC^w=o;TMdTZbTXD&_gg3+i5%{oEuW>t`i3j9J#%XacjCqEh zxG38;mLF-upWYHRZbc|*F+HqpCD-st!jg<@xGtV0 z>etNHRZB1#_HWE#VEp3YtHog90~uHGo+uxx^Wn83-vF|NIzdGhLx`+v2cJ!3+{CRI zma!tEf<+O>N1JfhWnujjaraXqculEbqOzXLW;z_mUG~diFZe(H9eK0`&cW7`o{{CgLW} z>7sM`2%zyRTAd~d!9?9yMgMdveIMI@p=AhP)7VLuA|(C|&4*|YG#|hq{fpTUo}+Vy z=dr_Ac8zXF=xk6ZJ09Kww=uqT4sbg-tj6TP0=6!|Lznra8J*HbI@UZj~Y zI*6ALCodUZeuAleo0}SV22=Zy@T2;XViHbfL{u~BRUG^Y!=s9tNsTIpGD;@>07p7- z-~nC_Jd;vR_$!j?z_&C;!5$+n;gpA~Li!@uNog3Sz;@B^1<%7hUMeyzFfuJL zG9Cn>zOdj7->(S*N5Hc`bq{Bi(9ejbR*}1X2Q#_!BlL>hRm{!j?qVi=5AO*4ndb}@ zf6rrVmvFI<;oX+LemZ7!DU!O6E8@1O8R}5qT-wV3usfyfRNl|0lzmEpMpY@%ct|PJ zc%0^E>)UWt*U0ef?(IZh;F?>gEgdqJ3)+B79 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..90a6a1279e0b2bb8523cccbb8e4499f52af1f6c5 GIT binary patch literal 1908 zcmb7EU31$+6g_JvQKBe`?W8~`;nNV?fo^Fb1)LTf)0Pq?g}9gredw%}wX0TpJlA#P#w=MZ`VP%F)K2k!tPSq1p zbi;2345c`MLoM7Dorw4HQkzXrI?4@vKEP7Eapw+Y*se0L9~h=KT;Ek!7}AAeogtfV zNmUh|S96uDgrT7FE)`iP5-hVgpw!e1wm+vR@E$$Nn4X-@qn~GKon%oN#L5Aq!vPs);JD zSy;ylC3TDZUmX z7_GB-2`^K&32o9O$7YgawRDI#a;aZ1T{^2K8|^_sO65Z0iX&_HrqLe%^=D z>zhEUNXO8^BUJuDmexaD|C<7~o+5XI8x&mKqfjcXQu-a=oG5MS8RiYrE`{&twiFRj Kr(aFU6!1T?XA$H8 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..413e9409f73323861bcb2a1060fb8387d22f37e7 GIT binary patch literal 2563 zcmb7GZBrXn6n<_9Y*?1J1*%Z1qOl~QbPKgqo3;w6yhxx*Di*NC&E^so!fs~wrpiz7 zhxom=4xk+!KiL_7Q^)b#%@RUcobu)F?mh44Jm*RN`Sl||dkmv_*DD)-)w7-Qrf2T*A6#$8@CEm{EB30~IL<7~(3A9qDQqiOF@1mD z*>o8)fdh+b*fMLrQTI!QZdSM@Y}cV0LtV00Ha5t^Vvd2WF|^&b9b4RGXi2447;=4#Ko5FGtA`A-Ta6KQ?YGSw_PS&JdOx`I+@5pYza{{ z=IEH?W{G=#Hr-@+zqn03&bAQ#z%V8Ud1?-4wMoH6h7Q@iT+Q>iBN$4ld^o+JN3#J! z!WgHczR68QvKlVo-448i_h>rXZgIZEpf~vnCqvUHx+MaDvQ;mf;qsd`h@ns7s1V?E zkqa}xAH!fOeWJXENW%IU8TEPy*)mKL9wIw^*182TgH0uNZ-QGrsDdR8vzU{t^%arc`CThm zW*9j=zsLe5={-I{>w=|k#fS>B3f>mN^LJM`|#43a!)v%85RIK5Vh6Uth z9UHGv?h%{=$~C2Kkr=?N)BLsblY9xhol4lGY2|3G7`pSe!3(r2AAstT(NzdOr{*il|14)K8C5LI1z12k1F>K z==lllQ0b}4CXysUB-{aw&Mo?yB>fmYH5{TRpV9RL4E#dhG1zprkyb1HP;CbqjLr^R zz+3cW66&FkN2JqAcLUPLt@vPEADYOFUK#rh@3-P9367n$K@Xf|f+Pn*XVP>SACNow z_94B=lm?K*M^s2$E?gLDnj}&-lG(?Y9{U-I%ptBneTEzP(U<6!w};5C=AYxn=sxbs z;0!x-5_-B`p-;ih9)`~v{(4C)qqb%aFeSA?;^{_Z{gkHcW5((o+tx4fqdV*}rZ8 literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..51038f65ab1814ef538d39d6b56e00ba16a09870 GIT binary patch literal 1908 zcmb7E(Q?~F6g_JvQKBe`?W8~`0a{FBJ5ZGtQow1!F=;7L(l&0*gg$iE^4e9aNFHfb z$S3e2yqChH89FdL(HXv}!*ExY9jA65^0Kye&%Jx^Ip^-b|NZe7fXn!vp(-NN6OG9A zqtK?MX^NjbbI)%^t_aPLyJjFde&|R)*f%}DDa?&#TWr&xo<C#&G?_i7Jgy2Hcjf zCQCCc4qtM<9r*s^eTEgw587tf2^_E83izJ*(GMP(p%j7e<$gz)M}?IcGWk$)>DX15 zhv5yc(&osUN17TAf$j)MB=_gyb;`Bt@ZUB^1S# z^p6y|M+M$&JS6rsyv;DFNKtfCN(w&0#GBOZJ6O_j8t*cEqNE&BA|a|~2Tn(>?@OT& zl_u|y#v0ydm{BV93n5DkQq`@b{JN?QoW%z^&LD3@H_M zdVLdU73mmSc#6tD$kKX%>wiLRZ73(*0ItSUSd`w?NYc)x21@P LI{hk2CV>9|JxUQ+ literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.class new file mode 100644 index 0000000000000000000000000000000000000000..2807a4180119f5c45cfdc89845feffecaeda4a7c GIT binary patch literal 487 zcmbVJ%Sr=55UhzwHm=Wu9}zFkQE)-fgG5*q%w3r5wByFf&eAg*-Cy(I2l!FqWFx4M zQ!Z8gs-m0z{CfWYaE>E^OKN0Av&Oo{7ZJ3iw@NOYZY+7}m6c4j^JQ?{%F1bycM%@Q zls>TH1VZ3=u9iw#RT+6dn^O@I>OQer(5vGY`5ZzmClMy3G_lW4{|MJhWCBCweQBx~7z$U`3S5ly?d_82a^2o)fqc{E z+Z(5vECpJ7r&HH(K{utPp+FD)_$pw~k5?c8B9DG}7ipL8VZY;p6+_@KVh@9FS4)$> literal 0 HcmV?d00001 diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..f4529564376e3ba8426f0f1eff8149b26cff43ce GIT binary patch literal 2708 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/exn-middleware-core/pom.xml b/exn-middleware-core/pom.xml new file mode 100644 index 0000000..af652ea --- /dev/null +++ b/exn-middleware-core/pom.xml @@ -0,0 +1,116 @@ + + 4.0.0 + + eu.nebulouscloud + 0.0.1-SNAPSHOT + exn-middleware-core + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + + 11 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.codehaus.groovy + groovy-all + 3.0.19 + pom + + + org.springdoc + springdoc-openapi-ui + 1.7.0 + + + org.springdoc + springdoc-openapi-groovy + 1.7.0 + + + commons-io + commons-io + 2.6 + + + eu.nebulouscloud + exn-connector-java + 1.0-SNAPSHOT + + + org.slf4j + slf4j-simple + + + + + org.apache.qpid + protonj2-client + 1.0.0-M16 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.6.2 + + + + addSources + compile + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.18 + + + + + + + central + https://repo.maven.apache.org/maven2 + + + sonatype-snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots/ + + + + diff --git a/exn-middleware-core/settings.gradle b/exn-middleware-core/settings.gradle new file mode 100644 index 0000000..f83700e --- /dev/null +++ b/exn-middleware-core/settings.gradle @@ -0,0 +1,6 @@ +pluginManagement { + repositories { + gradlePluginPortal() + } +} +rootProject.name = 'eu.nebulouscloud.exn.middleware.core' \ No newline at end of file diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.groovy new file mode 100644 index 0000000..2ca35c4 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.groovy @@ -0,0 +1,12 @@ +package eu.nebulouscloud.exn.modules.sal + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + +@SpringBootApplication +class ExnMiddlewareApplication { + + static void main(String[] args) { + SpringApplication.run(ExnMiddlewareApplication, args) + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.groovy new file mode 100644 index 0000000..afc22de --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.groovy @@ -0,0 +1,9 @@ +package eu.nebulouscloud.exn.modules.sal.configuration + +class AppConfig { + + String url + Integer port + String username + String password +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.groovy new file mode 100644 index 0000000..33d9f4d --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.groovy @@ -0,0 +1,20 @@ +package eu.nebulouscloud.exn.modules.sal.configuration + +import org.springframework.boot.web.client.RestTemplateBuilder +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.client.RestTemplate + +import java.time.Duration + +@Configuration +class RestTemplateConf { + + @Bean + RestTemplate restTemplateInit(RestTemplateBuilder builder){ + + builder.setReadTimeout(Duration.ofMinutes(3)) + .setConnectTimeout(Duration.ofMinutes(1)) + .build() + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.groovy new file mode 100644 index 0000000..1d20451 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.groovy @@ -0,0 +1,16 @@ +package eu.nebulouscloud.exn.modules.sal.configuration + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration + +@Configuration +@ConfigurationProperties(prefix = 'application.sal') +class SalConfiguration{ + + String protocol + String host + String port + String api + String username + String password +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.groovy new file mode 100644 index 0000000..e5eb87b --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.groovy @@ -0,0 +1,68 @@ +package eu.nebulouscloud.exn.modules.sal.middleware.config + + +import eu.nebulouscloud.exn.modules.sal.middleware.handlers.connection.EXNConnectorHandler +import eu.nebulouscloud.exn.Connector +import eu.nebulouscloud.exn.core.Consumer +import eu.nebulouscloud.exn.core.Publisher +import eu.nebulouscloud.exn.modules.sal.configuration.AppConfig +import eu.nebulouscloud.exn.modules.sal.middleware.handlers.consumer.AMQPSalMessageHandler +import eu.nebulouscloud.exn.settings.StaticExnConfig +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +@ConfigurationProperties(prefix='application.exn') +class ConfigureEXNConnector { + + AppConfig config + + @Autowired + AMQPSalMessageHandler amqpSalMessageHandler + + @Bean + Connector configEXNConnector(){ + + Connector c = new Connector( + "exn.sal", + new EXNConnectorHandler(), + [ + new Publisher("cloud.post","cloud.post.reply",true,false), + new Publisher("cloud.get","cloud.get.reply",true,false), + new Publisher("cloud.delete","cloud.delete.reply",true,false), + new Publisher("nodecandidate.post","nodecandidate.post.reply",true,false), + new Publisher("nodecandidate.get","nodecandidate.get.reply",true,false), + new Publisher("node.post","node.post.reply",true,false), + new Publisher("node.update","node.update.reply",true,false), + new Publisher("node.get","node.get.reply",true,false), + new Publisher("node.delete","node.delete.reply",true,false), + new Publisher("job.get","job.get.reply",true,false), + new Publisher("job.update","job.update.reply",true,false), + new Publisher("job.post","job.post.reply",true,false), + new Publisher("job.delete","job.delete.reply",true,false) + ], + [ + new Consumer("cloud","cloud.>", amqpSalMessageHandler,true,false), + new Consumer("nodecandidate","nodecandidate.>", amqpSalMessageHandler,true,false), + new Consumer("node","node.>", amqpSalMessageHandler,true,false), + new Consumer("job","job.>", amqpSalMessageHandler,true,false) + ], + false, + false, + new StaticExnConfig( + config.url, + config.port, + config.username, + config.password + ) + ) + + c.start() + + return c + + } + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.groovy new file mode 100644 index 0000000..ee849ff --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.groovy @@ -0,0 +1,38 @@ +package eu.nebulouscloud.exn.modules.sal.middleware.consumers + +import eu.nebulouscloud.exn.modules.sal.middleware.handlers.consumer.AMQPSalMessageHandler +import eu.nebulouscloud.exn.core.Consumer +import eu.nebulouscloud.exn.core.Context +import eu.nebulouscloud.exn.core.Handler +import groovy.util.logging.Slf4j +import org.apache.qpid.protonj2.client.Delivery +import org.apache.qpid.protonj2.client.Message + +@Slf4j +class StringConsumer extends Consumer{ + + StringConsumer(String key, String address, Handler handler, boolean topic, boolean FQDN) { + super(key, address, handler, topic, FQDN) + } + + @Override + protected void onDelivery(Delivery delivery, Context context){ + log.debug("Overridden UI on delivery for delivery for {}",this.linkAddress) + Message message = delivery.message() + + String body = this.processStringMessage(message, context) + (this.handler as AMQPSalMessageHandler).onStringMessage( + this.key, + this.address, + body, + message, + context + ) + delivery.accept() + } + + protected String processStringMessage(Message message, Context context){ + log.debug("Processing message for{}",this.linkAddress) + return message.body() as String + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.groovy new file mode 100644 index 0000000..7824101 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.groovy @@ -0,0 +1,16 @@ +package eu.nebulouscloud.exn.modules.sal.middleware.handlers.connection + +import eu.nebulouscloud.exn.core.Context +import eu.nebulouscloud.exn.handlers.ConnectorHandler +import groovy.util.logging.Slf4j + +@Slf4j +class EXNConnectorHandler extends ConnectorHandler{ + + @Override + void onReady(Context context){ + log.info('Exn connector handler is ready') + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.groovy new file mode 100644 index 0000000..db1fa5c --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.groovy @@ -0,0 +1,83 @@ +package eu.nebulouscloud.exn.modules.sal.middleware.handlers.consumer + +import com.fasterxml.jackson.databind.ObjectMapper +import eu.nebulouscloud.exn.modules.sal.processors.Processor +import eu.nebulouscloud.exn.core.Context +import eu.nebulouscloud.exn.core.Handler +import eu.nebulouscloud.exn.core.Publisher +import groovy.util.logging.Slf4j +import org.apache.commons.lang3.StringUtils +import org.apache.qpid.protonj2.client.Message +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component + +@Component +@Slf4j +public class AMQPSalMessageHandler extends Handler { + + @Autowired + Map processors + + @Autowired + ObjectMapper mapper + + @Value('${application.jms.topic}') + String baseQueue + + @Override + void onMessage(String key, String address, Map body, Message message, Context context) { + + log.info("Received by custom handler {} => {} = {}", key, address, String.valueOf(body)) + + try { + String destination = StringUtils.substringAfter(message.to(), '://') ?: message.to() + + log.trace('Got destination {}', destination) + + if (destination.contains('.reply')) { + return + } + + def processor = destination.replaceAll(context.base + ".", "") + + //Remove component from destination + processor = StringUtils.substringBefore(processor, '.') + processor = processor + "Processor" + + def p = processors.containsKey(processor) ? + processors.get(processor) : processors.get('noOpProcessor') + + Map response = p.process(destination, message) + + Map amqpProperties = + ['correlation-id': message.correlationId()?.toString(), + 'reply-to' : message.replyTo()] + + if (message.replyTo()) { + + log.debug("Reply to Queue={} -> Correlation ID = {} ", message.replyTo(), message.correlationId()) + String tempKey = message.replyTo() + message.correlationId() + Publisher tempPublisher = new Publisher(tempKey, message.replyTo(), true, true) + + tempPublisher.send(response, null, amqpProperties) + context.unregisterPublisher(tempKey) + + return + + } + + //Async reply to ".reply" topic + log.trace("Publishing default .reply with optional correlation {}", message.correlationId()) + +// Publisher publisher = context.getPublisher(StringUtils.substringAfter(destination,context.base+'.')) as StringPublisher + Publisher publisher = context.getPublisher(StringUtils.substringAfter(destination, context.base + '.')) + + publisher.send(response, null, amqpProperties) + } catch (Exception e) { + log.error('Pre Sent caught exception', e) + } + + } + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.groovy new file mode 100644 index 0000000..0456526 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.groovy @@ -0,0 +1,43 @@ +package eu.nebulouscloud.exn.modules.sal.middleware.publishers + +import eu.nebulouscloud.exn.core.Publisher +import groovy.util.logging.Slf4j +import org.apache.qpid.protonj2.client.Message +import org.apache.qpid.protonj2.client.Tracker + +@Slf4j +class PropertiesPublisher extends Publisher{ + + PropertiesPublisher(String key, String address, boolean Topic, boolean FQDN) { + super(key, address, Topic, FQDN) + } + + public send(Map body, Map amqpProperties){ + + log.debug("{} Sending {}", this.address, body) + def message = this.prepareMessage(body) + amqpProperties.each { + String property, String value -> + if(!value){ + return + } + switch (property) { + case 'reply-to': + message.replyTo(value) + break + case 'correlation-id': + message.correlationId(value) + break + default: + //this method does not work for the two above as + // it sets the application properties of the AMQP message, + // which reply and correlation are not part of in the AMQP spec + message.property(key,value) + } + } + Tracker tracker = this.link.send(message) + tracker.awaitSettlement() + + } + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.groovy new file mode 100644 index 0000000..cf5389d --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.groovy @@ -0,0 +1,7 @@ +package eu.nebulouscloud.exn.modules.sal.model.base + +class Credentials { + + String username + String secret +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.groovy new file mode 100644 index 0000000..dfe2ee3 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.groovy @@ -0,0 +1,12 @@ +package eu.nebulouscloud.exn.modules.sal.model.cloud + +import eu.nebulouscloud.exn.modules.sal.model.base.Credentials + +class Cloud { + + String cloudId + String cloudProviderName + String cloudType + Credentials credentials + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.groovy new file mode 100644 index 0000000..edd9fd9 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.groovy @@ -0,0 +1,4 @@ +package eu.nebulouscloud.exn.modules.sal.model.nodecandidate + +class NodeAttributeRequirement implements NodeRequirement{ +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.groovy new file mode 100644 index 0000000..92cf9c9 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.groovy @@ -0,0 +1,7 @@ +package eu.nebulouscloud.exn.modules.sal.model.nodecandidate + +class NodeCandidateRequest { + + List nodeRequirements + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.groovy new file mode 100644 index 0000000..aa7ee23 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.groovy @@ -0,0 +1,5 @@ +package eu.nebulouscloud.exn.modules.sal.model.nodecandidate + +interface NodeRequirement { + +} \ No newline at end of file diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.groovy new file mode 100644 index 0000000..e139f65 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.groovy @@ -0,0 +1,4 @@ +package eu.nebulouscloud.exn.modules.sal.model.nodecandidate + +class NodeTypeRequirement implements NodeRequirement{ +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.groovy new file mode 100644 index 0000000..9d6106f --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.groovy @@ -0,0 +1,91 @@ +package eu.nebulouscloud.exn.modules.sal.processors + +import com.fasterxml.jackson.databind.ObjectMapper +import org.apache.commons.lang3.StringUtils +import org.apache.qpid.protonj2.client.impl.ClientMessage +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpStatus +import org.springframework.web.client.HttpServerErrorException + +/** + * If no license is here then you can whatever you like! + * and of course I am not liable + *

+ * Created by fotis on 21/02/20. + */ +abstract class AbstractProcessor implements Processor { + + Logger logger = LoggerFactory.getLogger(getClass()) + + @Autowired + ObjectMapper mapper + + @Override + Map process(String destination, ClientMessage message) { + + //Maybe move it to message property(?) and don't blend with application's payload + Map payload = message.body() as Map + Map metaData = payload.metaData as Map + String o = payload.body + + Map ret = [:] + + logger.debug("[{}] Processing {}", metaData, o) + String method = destination.substring(destination.lastIndexOf(".") + 1) + try { + + switch (method) { + case 'get': + ret = get(metaData, o) + break; + case 'search': + ret = search(metaData, o) + break; + case 'update': + ret = update(metaData, o) + break; + case 'delete': + ret = delete(metaData, o) + break; + default: + ret = post(metaData,o) + } + + } catch (HttpServerErrorException e) { + logger.error("[{} -> {}] Exception during gateway request for {}", metaData.user, method, o, e) + ret.status = HttpStatus.BAD_GATEWAY.value() + ret.body = ["key": "gateway-exception-error", "message": 'Gateway exception while handling request with reason' + StringUtils.substring(e.getMessage(),0,50)] + } catch (Exception e) { + logger.error("[{} -> {}] Exception for {}", metaData.user, method, o, e) + ret.status = HttpStatus.INTERNAL_SERVER_ERROR.value() +// ret.body = ["key": "generic-exception-error", "message": 'Generic exception while handling request for user ' + metaData.user + ' and reason:\n' + StringUtils.left(e.getMessage(),100)] + ret.body = ["key": "generic-exception-error", "message": 'Generic exception while handling request for user ' + StringUtils.substring(e.getMessage(),0,50)] + } + + metaData.status = ret.status +// metaData.protocol = 'HTTP' + ret.remove('status') + ret.metaData = metaData + ret.body = mapper.writeValueAsString(ret.body) + + return ret + + } + + Map post(Map metaData, String body) { return noop(metaData, body) } + + Map search(Map metaData, String body) { return noop(metaData, body) } + + Map update(Map metaData, String body) { return noop(metaData, body) } + + Map get(Map metaData, String body) { return noop(metaData, body) } + + Map delete(Map metaData, String body) { return noop(metaData, body) } + + Map noop(Map metaData, String body) { + return ["status": HttpStatus.ACCEPTED.value(), "body": metaData.user + " { " + body + "}"] + } + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/Processor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/Processor.groovy new file mode 100644 index 0000000..e41ee92 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/Processor.groovy @@ -0,0 +1,14 @@ +package eu.nebulouscloud.exn.modules.sal.processors + +import org.apache.qpid.protonj2.client.impl.ClientMessage + +/** + * If no license is here then you can whatever you like! + * and of course I am not liable + * + * Created by fotis on 21/02/20. + */ +interface Processor { + + Map process(String queue, ClientMessage message) +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.groovy new file mode 100644 index 0000000..0d835c3 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.groovy @@ -0,0 +1,112 @@ +package eu.nebulouscloud.exn.modules.sal.processors.impl + + +import eu.nebulouscloud.exn.modules.sal.processors.AbstractProcessor +import eu.nebulouscloud.exn.modules.sal.repository.GatewayRepository +import eu.nebulouscloud.exn.modules.sal.configuration.SalConfiguration +import eu.nebulouscloud.exn.modules.sal.repository.cloud.CloudRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.stereotype.Service + +@Service +class CloudProcessor extends AbstractProcessor{ + + @Autowired + CloudRepository cloudRepository + + @Autowired + GatewayRepository gatewayRepository + + @Autowired + SalConfiguration salConfiguration + + @Override + Map post(Map metaData, String o){ + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Registering cloud {}',metaData.user, o) + +// User Credentials for connecting to ProActive Server. +// SAL is a REST interface to PWS. Get it from UI or store in middleware db? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + +// Deserialization should happen from calling component e.g. UI and not the proxying one +// We just proxy the json payload, which has already been serialized by the calling component + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + headers.setContentType(MediaType.APPLICATION_JSON) + + Integer response = cloudRepository.save(o,headers,Integer.class) + + return [ + "status": HttpStatus.OK.value(), + "body": ["success": response == 0] + ] + + } + + @Override + Map get(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Getting clouds {}',metaData.user, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + + //Check jobId mentioned above + List response = cloudRepository.getAll(headers, List.class) + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + @Override + Map delete(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Deleting clouds {}',metaData.user, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + headers.setContentType(MediaType.APPLICATION_JSON) + + //Check jobId mentioned above + Boolean response = cloudRepository.deleteByIds('remove',o,headers,Boolean.class) + + return [ + "status": HttpStatus.OK.value(), + "body": ["success":response] + ] + + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.groovy new file mode 100644 index 0000000..2b086ac --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.groovy @@ -0,0 +1,164 @@ +package eu.nebulouscloud.exn.modules.sal.processors.impl + +import eu.nebulouscloud.exn.modules.sal.configuration.SalConfiguration +import eu.nebulouscloud.exn.modules.sal.processors.AbstractProcessor +import eu.nebulouscloud.exn.modules.sal.repository.GatewayRepository +import eu.nebulouscloud.exn.modules.sal.repository.cloud.CloudRepository +import eu.nebulouscloud.exn.modules.sal.repository.job.JobRepository +import eu.nebulouscloud.exn.modules.sal.repository.job.deleteStrategies.IJobDeleteStrategy +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.stereotype.Service + +@Service +class JobProcessor extends AbstractProcessor{ + + @Autowired + JobRepository jobRepository + + @Autowired + GatewayRepository gatewayRepository + + @Autowired + SalConfiguration salConfiguration + + @Autowired + Map deleteStrategies + + @Override + Map post(Map metaData, String o){ + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Creating job {}',metaData.user, o) + +// User Credentials for connecting to ProActive Server. +// SAL is a REST interface to PWS. Get it from UI or store in middleware db? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + +// Deserialization should happen from calling component e.g. UI and not the proxying one +// We just proxy the json payload, which has already been serialized by the calling component + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + headers.setContentType(MediaType.APPLICATION_JSON) + + def response = jobRepository.save(o,headers,Object.class) + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + @Override + Map get(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Getting clouds {}',metaData.user, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + + //Check jobId mentioned above + String jobId = metaData.jobId + def response + if(!jobId){ + response = jobRepository.getAll(headers, List.class) + }else{ + response= jobRepository.getById(jobId, headers) + } + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + @Override + Map delete(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + String jobId = metaData.jobId + String action = metaData.action + + logger.info('{} - [{}] job {} and payload {}',metaData.user, action, jobId, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + headers.setContentType(MediaType.APPLICATION_JSON) + + IJobDeleteStrategy deleteStrategy = deleteStrategies.get('job'+action.capitalize()+'Strategy') + + if(!deleteStrategy){ + return [ + "status": HttpStatus.NOT_IMPLEMENTED.value(), + "body": ["key":"action-not-support","message":"Delete type "+ action +" is not supported"] + ] + } + + + //Check jobId mentioned above + def response = deleteStrategy.handleDelete(jobId, o, headers) + + return [ + "status": HttpStatus.OK.value(), + "body": ["success":response] + ] + + } + + //submit job + @Override + Map update(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Submitting job {} with body {}',metaData.user, metaData.jobId, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + headers.setContentType(MediaType.APPLICATION_JSON) + + //Check jobId mentioned above + Object response = jobRepository.save((metaData.jobId as String)+'/submit',o,headers, Object.class) + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.groovy new file mode 100644 index 0000000..da0dc9d --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.groovy @@ -0,0 +1,14 @@ +package eu.nebulouscloud.exn.modules.sal.processors.impl + +import eu.nebulouscloud.exn.modules.sal.processors.AbstractProcessor +import org.springframework.stereotype.Service + +/** + * If no license is here then you can whatever you like! + * and of course I am not liable + * + * Created by fotis on 21/02/20. + */ +@Service +class NoOpProcessor extends AbstractProcessor{ +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.groovy new file mode 100644 index 0000000..51d5c4a --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.groovy @@ -0,0 +1,54 @@ +package eu.nebulouscloud.exn.modules.sal.processors.impl + + +import eu.nebulouscloud.exn.modules.sal.processors.AbstractProcessor +import eu.nebulouscloud.exn.modules.sal.repository.GatewayRepository +import eu.nebulouscloud.exn.modules.sal.repository.node.NodeRegistrar +import eu.nebulouscloud.exn.modules.sal.repository.nodecandidate.NodeCandidateRepository +import eu.nebulouscloud.exn.modules.sal.configuration.SalConfiguration +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.stereotype.Service + +@Service('nodecandidateProcessor') +class NodeCandidateProcessor extends AbstractProcessor{ + + @Autowired + NodeCandidateRepository nodeCandidateRepository + + @Autowired + GatewayRepository gatewayRepository + + @Autowired + SalConfiguration salConfiguration + + @Autowired + Map nodeRegistrarMap + + @Override + Map get(Map metaData, String o) { + + logger.info('{} - Getting node candidates {}',metaData.user, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + headers.setContentType(MediaType.APPLICATION_JSON) + + //Check jobId mentioned above + List response = nodeCandidateRepository.findCandidates(o,headers,List.class) + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.groovy new file mode 100644 index 0000000..2b9f006 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.groovy @@ -0,0 +1,172 @@ +package eu.nebulouscloud.exn.modules.sal.processors.impl + + +import eu.nebulouscloud.exn.modules.sal.processors.AbstractProcessor +import eu.nebulouscloud.exn.modules.sal.repository.GatewayRepository +import eu.nebulouscloud.exn.modules.sal.repository.node.NodeRegistrar +import eu.nebulouscloud.exn.modules.sal.configuration.SalConfiguration +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.stereotype.Component + +@Component +class NodeProcessor extends AbstractProcessor{ + + @Autowired + GatewayRepository gatewayRepository + + @Autowired + SalConfiguration salConfiguration + + @Autowired + Map nodeRegistrarMap + + @Override + Map post(Map metaData, String o){ + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Registering node {}',metaData.user, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store in middleware db? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + String nodeType = metaData.type + NodeRegistrar nodeRegistrarRepository = nodeRegistrarMap.get(nodeType+'NodeRepository') + + if(!nodeRegistrarRepository){ + return [ + "status": HttpStatus.NOT_IMPLEMENTED.value(), + "body": ["key":"type-not-support","message":"Node type "+ nodeType +"is not supported"] + ] + } + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + + def response = nodeRegistrarRepository.register(metaData.jobId as String, o, headers) + + return [ + "status": HttpStatus.OK.value(), + "body": ["success": response == 0] + ] + + } + + @Override + Map get(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Getting node for Job {}',metaData.user, metaData.jobId) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + String nodeType = metaData.type + + NodeRegistrar nodeRegistrarRepository = nodeRegistrarMap.get(nodeType+'NodeRepository') + + if(!nodeRegistrarRepository){ + return [ + "status": HttpStatus.NOT_IMPLEMENTED.value(), + "body": ["key":"type-not-support","message":"Node type "+ nodeType +"is not supported"] + ] + } + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + + Object response = nodeRegistrarRepository.getById(metaData.jobId as String, headers) + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + @Override + Map delete(Map metaData, String o) { + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Deleting nodes for Job {}',metaData.user, metaData.jobId) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store behind the scenes ? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + String nodeType = metaData.type + + NodeRegistrar nodeRegistrarRepository = nodeRegistrarMap.get(nodeType+'NodeRepository') + + if(!nodeRegistrarRepository){ + return [ + "status": HttpStatus.NOT_IMPLEMENTED.value(), + "body": ["key":"type-not-support","message":"Node type "+ nodeType +"is not supported"] + ] + } + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + + Object response = nodeRegistrarRepository.deleteById(metaData.jobId as String, headers) + + return [ + "status": HttpStatus.OK.value(), + "body": response + ] + + } + + @Override + Map update(Map metaData, String o){ + + def ret =[ + "status": HttpStatus.OK.value(), + "body": {} + ] + + logger.info('{} - Assigning node {} to job with payload: {}',metaData.user, metaData.jobId, o) + + //User Credentials for connecting to ProActive Server. + //SAL is a REST interface to PWS. Get it from UI or store in middleware db? + String sessionId = gatewayRepository.login(salConfiguration.username,salConfiguration.password) + + String nodeType = metaData.type + NodeRegistrar nodeRegistrarRepository = nodeRegistrarMap.get(nodeType+'NodeRepository') + + if(!nodeRegistrarRepository){ + return [ + "status": HttpStatus.NOT_IMPLEMENTED.value(), + "body": ["key":"type-not-support","message":"Node type "+ nodeType +"is not supported"] + ] + } + + HttpHeaders headers = new HttpHeaders() + headers.add('sessionid',sessionId) + + def response = nodeRegistrarRepository.assign(metaData.jobId as String, o, headers) + + return [ + "status": HttpStatus.OK.value(), + "body": ["success": response == 0] + ] + + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.groovy new file mode 100644 index 0000000..b853156 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.groovy @@ -0,0 +1,146 @@ +package eu.nebulouscloud.exn.modules.sal.repository + +import com.fasterxml.jackson.databind.ObjectMapper +import eu.nebulouscloud.exn.modules.sal.configuration.SalConfiguration +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpEntity +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpMethod +import org.springframework.http.RequestEntity +import org.springframework.web.client.HttpStatusCodeException +import org.springframework.web.client.RestTemplate + +abstract class AbstractSalRepository{ + + protected final String resource + + AbstractSalRepository(String resource){ + this.resource = resource + } + + @Autowired + RestTemplate restTemplate + + @Autowired + ObjectMapper mapper + + @Autowired + SalConfiguration configuration + + //POST + //For session token + protected String post(String url, Map body, HttpHeaders headers) throws HttpStatusCodeException{ + + HttpEntity entity = new HttpEntity(body, headers) + + return restTemplate.postForEntity(baseUrl+'/'+resource+(url?'/'+url:''), entity, String.class).getBody() + + } + + //Not tested -> Created FOR NODES and JOBS that we dont know the payload + protected T post(String url, String body, HttpHeaders headers) throws HttpStatusCodeException{ + + post(url, body, headers, Object.class) + + } + + protected Map post(String body, HttpHeaders headers) throws HttpStatusCodeException{ + + post(null,body,headers,Map.class) + + } + + protected T post(String body, HttpHeaders headers, Class responseType) throws HttpStatusCodeException{ + + return post(null,body,headers,responseType) + + } + + protected T post(String url, String body, HttpHeaders headers, Class responseType) throws HttpStatusCodeException{ + + HttpEntity entity = new HttpEntity(body, headers) + + return restTemplate.postForEntity(baseUrl+'/'+resource+(url?'/'+url:''), entity, responseType).getBody() as T + + } + + //Delete + protected def delete(String url, HttpHeaders headers){ + delete(url, null,headers, Object.class) + } + + protected def delete(String url, String body, HttpHeaders headers, Class responseType) throws HttpStatusCodeException{ + + RequestEntity entity = new RequestEntity(body,headers,HttpMethod.DELETE,new URI(baseUrl+'/'+resource+(url? '/'+url:''))) + + return restTemplate.exchange(entity, responseType).getBody() + + } + + //PUT + protected Object put(String url, String body, HttpHeaders headers) throws HttpStatusCodeException{ + + RequestEntity entity = new RequestEntity(body, headers, HttpMethod.PUT, new URI(baseUrl+'/'+resource+(url? '/'+url:''))) + + return restTemplate.exchange(entity, Object.class).getBody() + + } + + //GET + + protected T get(HttpHeaders headers, Class responseType) throws HttpStatusCodeException{ + get(null, headers, responseType) + } + + protected T get(String url, HttpHeaders headers, Class responseType) throws HttpStatusCodeException{ + + RequestEntity entity = new RequestEntity(headers, HttpMethod.GET, new URI(baseUrl+'/'+resource+(url? '/'+url:''))) + + return restTemplate.exchange(entity, responseType).getBody() as T + + } + + def getById(String id, HttpHeaders headers){ + return get(id, headers, Map.class) + } + + + def getAll(HttpHeaders headers){ + return getAll(headers,Map.class) + } + + def getAll(HttpHeaders headers, Class responseType){ + return get(headers,responseType) + } + + def save(String body, HttpHeaders headers){ + return save(body, headers, Map.class) + } + + def save(String url, String body, HttpHeaders headers){ + return post(url, body,headers, Map.class) + } + + def save(String body, HttpHeaders headers, Class responseType){ + return post(null,body, headers, responseType) + } + + def save(String url, String body, HttpHeaders headers, Class responseType){ + return post(url, body, headers, responseType) + } + + def update(String url, String body, HttpHeaders headers){ + return put(url, body, headers) + } + + String getBaseUrl(){ + return "${configuration.protocol}://${configuration.host}:${configuration.port}/${configuration.api}" +// return "${configuration.protocol}://${configuration.host}/${configuration.api}" + } + + def deleteByIds(String url, String body, HttpHeaders headers, Class responseType){ + return delete(url,body,headers,responseType) + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.groovy new file mode 100644 index 0000000..dbb2fd3 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.groovy @@ -0,0 +1,31 @@ +package eu.nebulouscloud.exn.modules.sal.repository + +import org.springframework.http.HttpHeaders +import org.springframework.http.MediaType +import org.springframework.stereotype.Repository +import org.springframework.util.LinkedMultiValueMap +import org.springframework.util.MultiValueMap +import org.springframework.web.client.HttpClientErrorException + +@Repository +class GatewayRepository extends AbstractSalRepository{ + + GatewayRepository() { + super('pagateway') + } + + String login(String username, String password) throws HttpClientErrorException.Unauthorized{ + + MultiValueMap credentials = new LinkedMultiValueMap() + + credentials.add('username',username) + credentials.add('password',password) + + HttpHeaders headers = new HttpHeaders() + headers.setContentType(MediaType.MULTIPART_FORM_DATA) + String sessionId = post('connect', credentials, headers) + + return sessionId + + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.groovy new file mode 100644 index 0000000..8c4135d --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.groovy @@ -0,0 +1,14 @@ +package eu.nebulouscloud.exn.modules.sal.repository.cloud + +import eu.nebulouscloud.exn.modules.sal.repository.AbstractSalRepository +import org.springframework.stereotype.Repository + +@Repository +class CloudRepository extends AbstractSalRepository{ + + CloudRepository() { + super('clouds') + } + + +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.groovy new file mode 100644 index 0000000..f3bb3f4 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.groovy @@ -0,0 +1,12 @@ +package eu.nebulouscloud.exn.modules.sal.repository.job + +import eu.nebulouscloud.exn.modules.sal.repository.AbstractSalRepository +import org.springframework.stereotype.Repository + +@Repository +class JobRepository extends AbstractSalRepository{ + + JobRepository() { + super('jobs') + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.groovy new file mode 100644 index 0000000..50c68b8 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.groovy @@ -0,0 +1,8 @@ +package eu.nebulouscloud.exn.modules.sal.repository.job.deleteStrategies + +import org.springframework.http.HttpHeaders + +interface IJobDeleteStrategy { + + def handleDelete(String jobId, String body, HttpHeaders headers) +} \ No newline at end of file diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.groovy new file mode 100644 index 0000000..df36b11 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.groovy @@ -0,0 +1,23 @@ +package eu.nebulouscloud.exn.modules.sal.repository.job.deleteStrategies + +import eu.nebulouscloud.exn.modules.sal.repository.job.JobRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.stereotype.Component + +@Component +class JobDeleteStrategy implements IJobDeleteStrategy{ + + @Autowired + JobRepository jobRepository + + @Override + def handleDelete(String jobId, String body, HttpHeaders headers) { + + if(jobId){ + return jobRepository.update('remove/'+jobId,body,headers) + } + + return jobRepository.update('remove',body,headers) + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.groovy new file mode 100644 index 0000000..4130bf6 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.groovy @@ -0,0 +1,26 @@ +package eu.nebulouscloud.exn.modules.sal.repository.job.deleteStrategies + +import eu.nebulouscloud.exn.modules.sal.repository.job.JobRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.stereotype.Component + +@Component +class JobKillStrategy implements IJobDeleteStrategy{ + + @Autowired + JobRepository jobRepository + + @Override + def handleDelete(String jobId, String body, HttpHeaders headers) { + + //Kill all + if(!jobId){ + return jobRepository.update('kill',body,headers) + } + + //Kill by id + return jobRepository.update(jobId+'/kill',body,headers) + + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.groovy new file mode 100644 index 0000000..2563ead --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.groovy @@ -0,0 +1,24 @@ +package eu.nebulouscloud.exn.modules.sal.repository.job.deleteStrategies + +import eu.nebulouscloud.exn.modules.sal.repository.job.JobRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.stereotype.Component + +@Component +class JobStopStrategy implements IJobDeleteStrategy{ + + @Autowired + JobRepository jobRepository + + @Override + def handleDelete(String jobId, String body, HttpHeaders headers) { + + if(!jobId){ + return + } + + return jobRepository.update(jobId+'/stop',body,headers) + + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.groovy new file mode 100644 index 0000000..27a6022 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.groovy @@ -0,0 +1,32 @@ +package eu.nebulouscloud.exn.modules.sal.repository.node + + +import eu.nebulouscloud.exn.modules.sal.repository.AbstractSalRepository +import org.springframework.http.HttpHeaders + +abstract class AbstractNodeRepository extends AbstractSalRepository implements NodeRegistrar { + + AbstractNodeRepository(String resource) { + super(resource) + } + + @Override + def register(String jobId, String body, HttpHeaders headers){ + post(jobId, body, headers) + } + + @Override + def assign(String jobId, String body, HttpHeaders headers){ + put(jobId, body, headers) + } + + @Override + def deleteById(String jobId, HttpHeaders headers){ + //Payload not clear enough if this work for other type of nodes, if not override this in the derived class + if(jobId) { + return delete('remove/job/' + jobId, headers) + } + + return delete('remove',headers) + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.groovy new file mode 100644 index 0000000..0928f30 --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.groovy @@ -0,0 +1,11 @@ +package eu.nebulouscloud.exn.modules.sal.repository.node + +import org.springframework.stereotype.Repository + +@Repository +class ByonNodeRepository extends AbstractNodeRepository{ + + ByonNodeRepository() { + super('byon') + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.groovy new file mode 100644 index 0000000..3e671ee --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.groovy @@ -0,0 +1,20 @@ +package eu.nebulouscloud.exn.modules.sal.repository.node + +import org.springframework.http.HttpHeaders +import org.springframework.stereotype.Repository + +//Not sure but probably this is the cloud only [before byon and edge was supported?], +//that needs to be provided with a candidateId fetched through nodecandidates repository +//Ask Michael +@Repository +class CloudNodeRepository extends AbstractNodeRepository{ + + CloudNodeRepository() { + super('nodes') + } + + @Override + def assign(String jobId, String body, HttpHeaders headers){ + post(jobId, body, headers) + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.groovy new file mode 100644 index 0000000..77f914b --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.groovy @@ -0,0 +1,11 @@ +package eu.nebulouscloud.exn.modules.sal.repository.node + +import org.springframework.stereotype.Repository + +@Repository +class EdgeNodeRepository extends AbstractNodeRepository{ + + EdgeNodeRepository() { + super('edge') + } +} diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.groovy new file mode 100644 index 0000000..ebc04ea --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.groovy @@ -0,0 +1,13 @@ +package eu.nebulouscloud.exn.modules.sal.repository.node + +import org.springframework.http.HttpHeaders + +interface NodeRegistrar { + + def register(String jobId, String body, HttpHeaders headers) + def assign(String jobId, String body, HttpHeaders headers) + def getAll(HttpHeaders headers) + def getById(String jobId, HttpHeaders headers) + def deleteById(String jobId, HttpHeaders headers) + +} \ No newline at end of file diff --git a/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.groovy b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.groovy new file mode 100644 index 0000000..a689b6f --- /dev/null +++ b/exn-middleware-core/src/main/groovy/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.groovy @@ -0,0 +1,19 @@ +package eu.nebulouscloud.exn.modules.sal.repository.nodecandidate + +import eu.nebulouscloud.exn.modules.sal.repository.AbstractSalRepository +import org.springframework.http.HttpHeaders +import org.springframework.stereotype.Repository + +@Repository +class NodeCandidateRepository extends AbstractSalRepository{ + + NodeCandidateRepository() { + super('nodecandidates') + } + + List findCandidates(String body, HttpHeaders headers, Class responseType){ + post('filter',body,headers,responseType) + } + + +} diff --git a/java-spring-boot-demo/.gitignore b/java-spring-boot-demo/.gitignore deleted file mode 100644 index 549e00a..0000000 --- a/java-spring-boot-demo/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/java-spring-boot-demo/Dockerfile b/java-spring-boot-demo/Dockerfile deleted file mode 100644 index 427e30e..0000000 --- a/java-spring-boot-demo/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -# -# Build stage -# -FROM docker.io/library/maven:3.9.2-eclipse-temurin-17 AS build -COPY src /home/app/src -COPY pom.xml /home/app -RUN mvn -f /home/app/pom.xml clean package - -# -# Package stage -# -FROM docker.io/library/eclipse-temurin:17-jre -COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar -EXPOSE 8080 -ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"] diff --git a/java-spring-boot-demo/pom.xml b/java-spring-boot-demo/pom.xml deleted file mode 100644 index 76e0f0e..0000000 --- a/java-spring-boot-demo/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.1.0 - - - com.example - demo - 0.0.1-SNAPSHOT - demo - Demo project for Spring Boot - - 17 - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java b/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java deleted file mode 100644 index 094d95b..0000000 --- a/java-spring-boot-demo/src/main/java/com/example/demo/DemoApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DemoApplication { - - public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); - } - -} diff --git a/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java b/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java deleted file mode 100644 index 61a5075..0000000 --- a/java-spring-boot-demo/src/main/java/com/example/demo/DemoController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.demo; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class DemoController { - - @RequestMapping("/") - public Object root() { - return null; - } - -} diff --git a/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java b/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java deleted file mode 100644 index eaa9969..0000000 --- a/java-spring-boot-demo/src/test/java/com/example/demo/DemoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DemoApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index 5490ad3..aa46e0b 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -8,15 +8,15 @@ - nebulous-exn-middleware-container-images description: Build the container images. files: &image_files - - ^java-spring-boot-demo/ + - ^exn-middleware-core vars: &image_vars promote_container_image_job: nebulous-exn-middleware-upload-container-images container_images: - - context: java-spring-boot-demo + - context: exn-middleware-core registry: quay.io - repository: quay.io/nebulous/exn-middleware-java-spring-boot-demo + repository: quay.io/nebulous/exn-middleware-exn-middleware-core namespace: nebulous - repo_shortname: exn-middleware-java-spring-boot-demo + repo_shortname: exn-middleware-exn-middleware-core repo_description: "" - job: @@ -44,7 +44,7 @@ description: Run Hadolint on Dockerfile(s). vars: dockerfiles: - - java-spring-boot-demo/Dockerfile + - exn-middleware-core/Dockerfile - job: name: nebulous-exn-middleware-helm-lint