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 0000000..0a427a0 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/checksums/checksums.lock differ 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 0000000..a1ef689 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/checksums/md5-checksums.bin differ 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 0000000..e3d5896 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/checksums/sha1-checksums.bin differ diff --git a/exn-middleware-core/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/exn-middleware-core/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000..9ebd27c Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock differ diff --git a/java-spring-boot-demo/src/main/resources/application.properties b/exn-middleware-core/.gradle/7.5.1/dependencies-accessors/gc.properties similarity index 100% rename from java-spring-boot-demo/src/main/resources/application.properties rename to exn-middleware-core/.gradle/7.5.1/dependencies-accessors/gc.properties diff --git a/exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.bin b/exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000..ce32461 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.bin differ 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 0000000..6ab1827 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/executionHistory/executionHistory.lock differ 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 0000000..f76dd23 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/fileChanges/last-build.bin differ 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 0000000..f4440d7 Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.bin differ diff --git a/exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.lock b/exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000..6a12c3c Binary files /dev/null and b/exn-middleware-core/.gradle/7.5.1/fileHashes/fileHashes.lock differ diff --git a/exn-middleware-core/.gradle/7.5.1/gc.properties b/exn-middleware-core/.gradle/7.5.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/exn-middleware-core/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/exn-middleware-core/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..84f1007 Binary files /dev/null and b/exn-middleware-core/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/exn-middleware-core/.gradle/buildOutputCleanup/cache.properties b/exn-middleware-core/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..1adacfd --- /dev/null +++ b/exn-middleware-core/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Feb 05 14:24:01 EET 2024 +gradle.version=7.5.1 diff --git a/exn-middleware-core/.gradle/buildOutputCleanup/outputFiles.bin b/exn-middleware-core/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..382ecb2 Binary files /dev/null and b/exn-middleware-core/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/exn-middleware-core/.gradle/file-system.probe b/exn-middleware-core/.gradle/file-system.probe new file mode 100644 index 0000000..0fb3ac0 Binary files /dev/null and b/exn-middleware-core/.gradle/file-system.probe differ diff --git a/exn-middleware-core/.gradle/vcs-1/gc.properties b/exn-middleware-core/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/exn-middleware-core/Dockerfile b/exn-middleware-core/Dockerfile new file mode 100644 index 0000000..a4f8558 --- /dev/null +++ b/exn-middleware-core/Dockerfile @@ -0,0 +1,35 @@ +#Builder stage for maven +FROM docker.io/library/openjdk:11 AS builder + +RUN apt-get update && \ + apt-get install --no-install-recommends -y maven=3.6.3-5 + +#Set the working directory +WORKDIR /app + +#Copy application POM +COPY pom.xml . + +#Download dependencies in local repo +RUN mvn dependency:go-offline + +#Copy source code +COPY src ./src + +#Build the app +RUN mvn clean package + +#Main stage +FROM docker.io/library/openjdk:11-jre-slim + +#Set the working directory +WORKDIR /app + +#Copy compiled jar from builder stage +COPY --from=builder /app/target/exn-middleware-core-0.0.1-SNAPSHOT.jar ./exn-middleware-core-0.0.1-SNAPSHOT.jar + +#Copy application configuration +COPY config ./ + +#Run java app on container start +CMD ["java", "-jar", "exn-middleware-core-0.0.1-SNAPSHOT.jar"] diff --git a/exn-middleware-core/build.gradle b/exn-middleware-core/build.gradle new file mode 100644 index 0000000..4de4eb2 --- /dev/null +++ b/exn-middleware-core/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'groovy' + id 'java-library' + id 'org.springframework.boot' version '2.7.18' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' +} + +group 'eu.nebulouscloud.exn.middleware' +version '1.0-SNAPSHOT' +sourceCompatibility = '1.11' + +repositories { + mavenCentral() + maven { + url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' + } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.codehaus.groovy:groovy-all:3.0.19' + implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.7.0' + implementation group: 'org.springdoc', name: 'springdoc-openapi-groovy', version: '1.7.0' + implementation group: 'commons-io', name: 'commons-io', version: '2.6' + implementation (group: 'eu.nebulouscloud','name':'exn-connector-java', version: '1.0-SNAPSHOT') { + exclude group: 'org.slf4j', module: 'slf4j-simple' + } + + implementation group: 'org.apache.qpid', name: 'protonj2-client', version: '1.0.0-M16' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + + +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.class new file mode 100644 index 0000000..9758804 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/ExnMiddlewareApplication.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.class new file mode 100644 index 0000000..c1d07d8 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/AppConfig.class differ 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 0000000..136f2ae Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/RestTemplateConf.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.class new file mode 100644 index 0000000..b7987cd Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/configuration/SalConfiguration.class differ 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 0000000..6b4c73a Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/config/ConfigureEXNConnector.class differ 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 0000000..78c404e Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/consumers/StringConsumer.class differ 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 0000000..a263d4f Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/connection/EXNConnectorHandler.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.class new file mode 100644 index 0000000..5fd6dba Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/handlers/consumer/AMQPSalMessageHandler.class differ 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 0000000..6bebbaf Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher$_send_closure1.class differ 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 0000000..9bd1da5 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/middleware/publishers/PropertiesPublisher.class differ 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 0000000..af0300b Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/base/Credentials.class differ 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 0000000..9444160 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/cloud/Cloud.class differ 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 0000000..aee18b7 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeAttributeRequirement.class differ 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 0000000..4926825 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeCandidateRequest.class differ 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 0000000..6cb0a7c Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeRequirement.class differ 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 0000000..de44298 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/model/nodecandidate/NodeTypeRequirement.class differ 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 0000000..845b08d Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/AbstractProcessor.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/Processor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/Processor.class new file mode 100644 index 0000000..2749c0e Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/Processor.class differ 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 0000000..d3e933a Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_delete_closure3.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_get_closure2.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_get_closure2.class new file mode 100644 index 0000000..32cc0f4 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_get_closure2.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_post_closure1.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_post_closure1.class new file mode 100644 index 0000000..d2083e3 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor$_post_closure1.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.class new file mode 100644 index 0000000..b1f7241 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/CloudProcessor.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_delete_closure3.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_delete_closure3.class new file mode 100644 index 0000000..6ed616a Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_delete_closure3.class differ 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 0000000..659face Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_get_closure2.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_post_closure1.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_post_closure1.class new file mode 100644 index 0000000..3f7dc7d Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_post_closure1.class differ 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 0000000..b6deaf8 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor$_update_closure4.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.class new file mode 100644 index 0000000..24d1a46 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/JobProcessor.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.class new file mode 100644 index 0000000..1fe93f4 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NoOpProcessor.class differ 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 0000000..b9e72d8 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeCandidateProcessor.class differ 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 0000000..dec9e10 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_delete_closure3.class differ 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 0000000..a0abcd3 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_get_closure2.class differ 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 0000000..9f2c061 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_post_closure1.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_update_closure4.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_update_closure4.class new file mode 100644 index 0000000..770998f Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor$_update_closure4.class differ 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 0000000..eb0c83f Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/processors/impl/NodeProcessor.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.class new file mode 100644 index 0000000..86708b9 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/AbstractSalRepository.class differ 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 0000000..b17bd35 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/GatewayRepository.class differ 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 0000000..71889a7 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/cloud/CloudRepository.class differ 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 0000000..c896829 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/JobRepository.class differ 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 0000000..5e44111 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/IJobDeleteStrategy.class differ 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 0000000..64b614d Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobDeleteStrategy.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.class new file mode 100644 index 0000000..6349724 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobKillStrategy.class differ diff --git a/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.class b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.class new file mode 100644 index 0000000..7373ac0 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/job/deleteStrategies/JobStopStrategy.class differ 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 0000000..e394722 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/AbstractNodeRepository.class differ 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 0000000..90a6a12 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/ByonNodeRepository.class differ 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 0000000..413e940 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/CloudNodeRepository.class differ 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 0000000..51038f6 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/EdgeNodeRepository.class differ 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 0000000..2807a41 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/node/NodeRegistrar.class differ 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 0000000..f452956 Binary files /dev/null and b/exn-middleware-core/build/classes/groovy/main/eu/nebulouscloud/exn/modules/sal/repository/nodecandidate/NodeCandidateRepository.class differ diff --git a/exn-middleware-core/config/application.yml b/exn-middleware-core/config/application.yml new file mode 100644 index 0000000..f222ff6 --- /dev/null +++ b/exn-middleware-core/config/application.yml @@ -0,0 +1,28 @@ +logging: + level: + eu.nebulouscloud.exn.modules: TRACE + +spring: + profiles: default + main: + web-application-type: none + jms: + pub-sub-domain: true + +application: + exn: + config: + url: 'nebulous-nebulous-activemq' + port: 5672 + username: 'admin' + password: 'admin' + sal: + protocol: 'http' +# host: 'fa84-194-219-170-2.ngrok-free.app/' + host: 'sal' + port: '8080' + api: 'sal' + username: 'admin' + password: 'admin' + jms: + topic: 'eu.nebulouscloud' \ No newline at end of file diff --git a/exn-middleware-core/gradle/wrapper/gradle-wrapper.jar b/exn-middleware-core/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/exn-middleware-core/gradle/wrapper/gradle-wrapper.jar differ diff --git a/exn-middleware-core/gradle/wrapper/gradle-wrapper.properties b/exn-middleware-core/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ae04661 --- /dev/null +++ b/exn-middleware-core/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/exn-middleware-core/gradlew b/exn-middleware-core/gradlew new file mode 100755 index 0000000..a69d9cb --- /dev/null +++ b/exn-middleware-core/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + 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