diff --git a/.github/workflows/00-run-unit-tests.yml b/.github-disabled/workflows/00-run-unit-tests.yml similarity index 100% rename from .github/workflows/00-run-unit-tests.yml rename to .github-disabled/workflows/00-run-unit-tests.yml diff --git a/.github/workflows/01-run-intergration-tests.yml b/.github-disabled/workflows/01-run-intergration-tests.yml similarity index 100% rename from .github/workflows/01-run-intergration-tests.yml rename to .github-disabled/workflows/01-run-intergration-tests.yml diff --git a/.github/workflows/02-run-sonar-analysis.yml b/.github-disabled/workflows/02-run-sonar-analysis.yml similarity index 100% rename from .github/workflows/02-run-sonar-analysis.yml rename to .github-disabled/workflows/02-run-sonar-analysis.yml diff --git a/.github/workflows/03-build-docker-image.yml b/.github-disabled/workflows/03-build-docker-image.yml similarity index 100% rename from .github/workflows/03-build-docker-image.yml rename to .github-disabled/workflows/03-build-docker-image.yml diff --git a/.github/workflows/git-sync.yml b/.github-disabled/workflows/git-sync.yml similarity index 100% rename from .github/workflows/git-sync.yml rename to .github-disabled/workflows/git-sync.yml diff --git a/.gitignore b/.gitignore index 1c0e74995ff5448ddb62960a00e23b5dd7629e09..9dfd5b23349a192e5090e229a2916eacd4323b5d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ out/ /build/ .idea/ /src/main/resources/git.properties +/src/test/shell/tmp/* +!/src/test/shell/tmp/README.md \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..9db186fd1186b6b0dc72bdf49e643adc59843044 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,50 @@ +stages: + - test + - sonar + - build + +test: + stage: test + image: openjdk:11-jdk-slim + tags: + - docker + script: + - chmod +x ./gradlew + - ./gradlew -Dorg.gradle.daemon=false test + +sonar: + stage: sonar + image: openjdk:11-jdk-slim + only: + - develop + script: + - chmod +x ./gradlew + - ./gradlew integrationTest jacocoTestCoverageVerification + - ./gradlew -Dsonar.host.url=${SONAR_HOST} -Dsonar.projectKey=${SONAR_PROJECT_KEY} -Dsonar.projectName=${SONAR_PROJECT_NAME} -Dsonar.branch.name=develop -Dsonar.login=${SONAR_LOGIN_TOKEN} sonarqube + +build_and_push_latest_image: + stage: build + only: + - develop + variables: + IMAGE_TAG: "latest" + script: + - | + docker image prune -f + docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD $DOCKER_REPOSITORY + docker build -t $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG . + docker push $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG + docker logout $DOCKER_REPOSITORY + +build_and_push_release_image: + stage: build + only: + - tags + script: + - | + export IMAGE_TAG=$(echo $CI_COMMIT_TAG | cut -c 2-) + docker image prune -f + docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD $DOCKER_REPOSITORY + docker build -t $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG . + docker push $DOCKER_REPOSITORY_LOCAL:$IMAGE_TAG + docker logout $DOCKER_REPOSITORY \ No newline at end of file diff --git a/NOTICE b/NOTICE index 077703a2e2e012e4bee28dd7fb7a75dfd9de1fdf..93fafe44cbccd99420d824e0eb4417513ac1d43a 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ -Copyright 2023 GÉANT Association +Copyright 2024 GÉANT Association Contributions to this work were made on behalf of the GÉANT project, a project that has received funding from the European Union’s Horizon 2020 research and innovation programme under Grant Agreement No. 731122 (GN4-2) diff --git a/README.md b/README.md index fb9a52a9e538c8b354d579ab637750b460dc21a3..cc6263f2f14f4fd0d5aec47e87f3db0d0cc1543a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ <img src="docs/nmaas-logo-blue.png" alt="Logo" width="206" height="48"> </a> - <h3 align="center">NMaaS Platform (Back-end)</h3> + <h3 align="center">nmaas Platform (Back-end)</h3> <h4 align="center">Open-source multi-tenant platform for effortless, orchestrated deployment of software tools and applications on top of Kubernetes</h4> @@ -17,13 +17,13 @@ </p> </div> -NMaaS is an open-source framework developed within the GÉANT project for orchestration of on-demand deployment of applications in a multi-tenant Kubernetes-based cloud environment. +nmaas is an open-source framework developed within the GÉANT project for orchestration of on-demand deployment of applications in a multi-tenant Kubernetes-based cloud environment. -With a simple self-service web interface, NMaaS applications are easily deployed within an isolated tenant environment assigned to a given user institution or team. +With a simple self-service web interface, nmaas applications are easily deployed within an isolated tenant environment assigned to a given user institution or team. An application’s lifecycle (configuration updates and re-deployments) is fully managed following a GitOps approach: a specific Git repository is tightly associated with every deployed application and a set of CI/CD pipelines ensure proper re-deployments of the applications following every update on the Git master branch. -NMaaS applications are containerized and deployed using [Helm charts](https://helm.sh/). +nmaas applications are containerized and deployed using [Helm charts](https://helm.sh/). ## Screenshots @@ -41,18 +41,18 @@ NMaaS applications are containerized and deployed using [Helm charts](https://he  -## NMaaS Platform Component +## nmaas Platform Component -[NMaaS Platform](https://github.com/nmaas-platform/nmaas-platform) is the central NMaaS component, exposing a REST API consumed by the NMaaS Portal. It stores the application catalog, the users, as well as information about any deployed applications. Upon a new request for an application deployment, it connects to the NMaaS Helm component and executes the necessary Helm command via an SSH connection. It also communicates with a self-hosted instance of GitLab, in order to provision boilerplate configuration files for the deployed application instances by the users, allowing them to make any additional configuration changes exclusively through Git. +[nmaas Platform](https://github.com/nmaas-platform/nmaas-platform) is the central nmaas component, exposing a REST API consumed by the nmaas Portal. It stores the application catalog, the users, as well as information about any deployed applications. Upon a new request for an application deployment, it connects to the nmaas Helm component and executes the necessary Helm command via an SSH connection. It also communicates with a self-hosted instance of GitLab, in order to provision boilerplate configuration files for the deployed application instances by the users, allowing them to make any additional configuration changes exclusively through Git. -### NMaaS Platform Development +### nmaas Platform Development -Explore the NMaaS Platform [development and deployment](docs/DEVELOPMENT.md) documentation. +Explore the nmaas Platform [development and deployment](docs/DEVELOPMENT.md) documentation. ## Get in Touch -Interested users can use the following mailing lists to subscribe to news about NMaaS, get in touch with the NMaaS development team, or other NMaaS users: +Interested users can use the following mailing lists to subscribe to news about nmaas, get in touch with the nmaas development team, or other nmaas users: -- [nmaas-announce@lists.geant.org](mailto:nmaas-announce@lists.geant.org) - public mailing list for announcements shared by the NMaaS team with the community ([subscribe here](https://lists.geant.org/sympa/info/nmaas-announce)) -- [nmaas@lists.geant.org](mailto:nmaas@lists.geant.org) - private mailing list for contacting the NMaaS core team members -- [nmaas-users@lists.geant.org](mailto:nmaas-users@lists.geant.org) - public mailing lists for discussions related to NMaaS usage and development ([subscribe here](https://lists.geant.org/sympa/info/nmaas-users)) +- [nmaas-announce@lists.geant.org](mailto:nmaas-announce@lists.geant.org) - public mailing list for announcements shared by the nmaas team with the community ([subscribe here](https://lists.geant.org/sympa/info/nmaas-announce)) +- [nmaas@lists.geant.org](mailto:nmaas@lists.geant.org) - private mailing list for contacting the nmaas core team members +- [nmaas-users@lists.geant.org](mailto:nmaas-users@lists.geant.org) - public mailing lists for discussions related to nmaas usage and development ([subscribe here](https://lists.geant.org/sympa/info/nmaas-users)) diff --git a/build.gradle b/build.gradle index b75e57293f7a875f9aa74de8b94547c8e1631bd8..3a0d07daa528b359046eeb9a763d3397dd99b823 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ repositories { mavenCentral() } -version = '1.6.1-SNAPSHOT' +version = '1.7.0-SNAPSHOT' group = 'net.geant.nmaas' java { diff --git a/build_and_publish.sh b/build_and_publish.sh deleted file mode 100644 index 019e1af2d3001abbfab18fd8317c3ebc2ad46dde..0000000000000000000000000000000000000000 --- a/build_and_publish.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -TAG=1.6.0 -PACKAGE=nmaas-platform -REPOSITORY=artifactory.geant.net/nmaas-docker-local -sudo docker build --rm -t $REPOSITORY/$PACKAGE:$TAG -f ./Dockerfile .. -sudo docker push $REPOSITORY/$PACKAGE:$TAG diff --git a/docker/nmaas-platform.properties.template b/docker/nmaas-platform.properties.template index 3c434e1be813daab3874b88d2f71325ae379b2e6..c2ee26de2e1cf827bcd130df2fcfecc5f0764359 100644 --- a/docker/nmaas-platform.properties.template +++ b/docker/nmaas-platform.properties.template @@ -51,7 +51,7 @@ notifications.from-address=${SMTP_FROM} # Database # # ---------------- # # Standalone PostgreSQL -db.standalone.jdbc-url=jdbc:postgresql://${POSTGRESQL_HOST}:5432/${POSTGRESQL_DBNAME} +db.standalone.jdbc-url=jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/${POSTGRESQL_DBNAME} db.standalone.username=${POSTGRESQL_USERNAME} db.standalone.password=${POSTGRESQL_PASSWORD} # FlywayDB settings @@ -68,7 +68,7 @@ spring.jpa.show-sql=true spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration # -------------------------------------------------------- # -# NMaaS application deployment and configuration processes # +# nmaas application deployment and configuration processes # # -------------------------------------------------------- # nmaas.service.deployment.check.interval=${DEPLOYMENT_CHECK_INTERVAL} nmaas.service.deployment.max.duration=${DEPLOYMENT_CHECK_TIMEOUT} @@ -83,7 +83,7 @@ nmaas.portal.domains.namespace.pattern=[a-z0-9-]{0,64} nmaas.platform.webhooks.baseurl=${PLATFORM_BASEURL}/api/gitlab/webhooks -# NMaaS Platform is running within the Kubernetes cluster +# nmaas Platform is running within the Kubernetes cluster nmaas.kubernetes.incluster=true nmaas.domains.create.namespace=${NAMESPACE_CREATION_ENABLED:false} @@ -101,10 +101,11 @@ spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl upload.dir=/nmaas/files/upload jwt.tokenValidFor=3600000 jwt.refreshTokenValidFor=13600000 -jwt.issuer=NMaaS +jwt.issuer=nmaas jwt.signingKey=${API_KEY} jwt.resetSigningKey=testResetKey jwt.resetTokenValidFor=1800000 +jwt.resetTokenRegistrationValid=86400000 captcha.secret=${CAPTCHA_SECRET} spring.data.web.pageable.default-page-size=1000 spring.mvc.favicon.enabled=false @@ -141,8 +142,7 @@ janitor.port=${JANITOR_PORT} # -------------------- # # GitLab configuration # # -------------------- # -gitlab.address=${GITLAB_ADDRESS} -gitlab.port=${GITLAB_PORT} +gitlab.apiUrl=${GITLAB_API_URL} gitlab.token=${GITLAB_TOKEN} # ------------------------ # @@ -166,6 +166,7 @@ kubernetes.deployment.smtpServerHostname=${SMTP_HOST} kubernetes.deployment.smtpServerPort=${SMTP_PORT} kubernetes.deployment.smtpServerUsername=${SMTP_LOGIN} kubernetes.deployment.smtpServerPassword=${SMTP_PASSWORD} +kubernetes.deployment.smtpFromDefaultDomain=${SMTP_FROM_DEFAULT_DOMAIN} kubernetes.deployment.defaultStorageClass=${K8S_DEPLOYMENT_DEFAULT_STORAGE_CLASS} kubernetes.deployment.forceDedicatedWorkers=false diff --git a/docker/run_platform.sh b/docker/run_platform.sh index 8c67a0dec9d71527dc2e93125371fc258b9bbb73..440f7965465c9a20e000f7e9d62eaad03afc26e0 100644 --- a/docker/run_platform.sh +++ b/docker/run_platform.sh @@ -15,15 +15,15 @@ chmod 600 /root/.ssh/id_rsa mkdir -p /nmaas/files/upload mkdir -p /nmaas/files/log -until PGPASSWORD=${POSTGRESQL_PASSWORD} psql -h "${POSTGRESQL_HOST}" -U "${POSTGRESQL_USERNAME}" -d "postgres" -c '\l'; do +until PGPASSWORD=${POSTGRESQL_PASSWORD} psql -h "${POSTGRESQL_HOST}" -p ${POSTGRESQL_PORT} -U "${POSTGRESQL_USERNAME}" -d "postgres" -c '\l'; do sleep 1s done -if PGPASSWORD=${POSTGRESQL_PASSWORD} psql -h "${POSTGRESQL_HOST}" -U "${POSTGRESQL_USERNAME}" -lqt | cut -d \| -f 1 | grep -qw ${POSTGRESQL_DBNAME}; then +if PGPASSWORD=${POSTGRESQL_PASSWORD} psql -h "${POSTGRESQL_HOST}" -p ${POSTGRESQL_PORT} -U "${POSTGRESQL_USERNAME}" -lqt | cut -d \| -f 1 | grep -qw ${POSTGRESQL_DBNAME}; then echo "Database is already setup" else echo "Database is being created..." - PGPASSWORD=${POSTGRESQL_PASSWORD} createdb ${POSTGRESQL_DBNAME} -h "${POSTGRESQL_HOST}" -U "${POSTGRESQL_USERNAME}" ${POSTGRESQL_DBNAME} + PGPASSWORD=${POSTGRESQL_PASSWORD} createdb ${POSTGRESQL_DBNAME} -h "${POSTGRESQL_HOST}" -p ${POSTGRESQL_PORT} -U "${POSTGRESQL_USERNAME}" ${POSTGRESQL_DBNAME} fi java -Djava.security.egd=file:/dev/./urandom -Dlog4j.configurationFile=config/log4j2-spring.json -jar $FILE --spring.config.name=nmaas-platform diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index a28d1356dd03d1b685f00349937141bcfff31bb2..8bf324f38d2bcbda6cf91362df83ff597bf145f6 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1,4 +1,4 @@ -# NMaaS Platform +# nmaas Platform ### Technologies @@ -10,51 +10,51 @@ * Flyway * Kubernetes API client from fabric8 -### Running NMaaS Platform on local machine +### Running nmaas Platform on local machine #### Prerequisites Install Java 11 jdk #### Running the software -In order to build and run the NMaaS Platform software locally execute *./gradlew bootRun* in project root directory. +In order to build and run the nmaas Platform software locally execute *./gradlew bootRun* in project root directory. By default, the REST API will be exposed at *http://localhost:9000/api*. -### Running NMaaS Platform on dedicated server machine +### Running nmaas Platform on dedicated server machine -In order to run the NMaaS Platform on dedicated machine perform the following steps: -+ Build the NMaaS Platform with *./gradlew clean build* command project root directory. +To run the nmaas Platform on a dedicated machine, perform the following steps: ++ Build the nmaas Platform with *./gradlew clean build* command project root directory. + Retrieve the output executable *nmaas-platform-x.x.x.jar* file from *build/libs* directory. -+ Run the NMaaS Platform with *java -jar nmaas-platform-x.x.x.jar* and optional arguments: ++ Run the nmaas Platform with *java -jar nmaas-platform-x.x.x.jar* and optional arguments: + *--Dlog4j.configurationFile* specifying the name of logger (Log4j2) configuration file (located in the same directory as the jar file) to be loaded instead of the built-in one. Please be advised that you have to add that parameter before the *-jar* parameter. + *--spring.config.name* specifying the name of the properties file (located in the same directory as the jar file) to be loaded instead of the built-in one. -### Swagger documentation of the NMaaS Platform REST API +### Swagger documentation of the nmaas Platform REST API -NMaaS Platform by default exposes two endpoints documenting the REST API: +nmaas Platform by default exposes two endpoints documenting the REST API: + */api-docs/spec* - Open API specification of the API + */api-docs/ui.html* - Swagger UI The Swagger endpoint can be disabled in properties file. -### Populating NMaaS Platform database with initial data +### Populating nmaas Platform database with initial data -To initialize the NMaaS Platform database with a default set of data run *src/test/shell/init.sh* script. +To initialize the nmaas Platform database with a default set of data run *src/test/shell/init.sh* script. Script will load the following data: + set of content translation data (from *src/test/shell/data/i18n*) + set of default email templates (from *src/test/shell/data/mails*) + set of default contact form templates (from *src/test/shell/data/form_types*) -+ set of test NMaaS user domains (from *src/test/shell/data/domains*) -+ set of NMaaS-compatible application definitions with test subscriptions and comments (from *src/test/shell/data/apps*) ++ set of test nmaas user domains (from *src/test/shell/data/domains*) ++ set of nmaas-compatible application definitions with test subscriptions and comments (from *src/test/shell/data/apps*) ### Complete deployment environment setup for Kubernetes -A dedicated Helm chart has been developed to ease the NMaaS installation inside a Kubernetes cluster. -This way both the supported network management applications and the NMaaS core components can be installed within a single K8s cluster. -For more information please contact the [NMaaS Team](mailto:nmaas-team@lists.geant.org). +A dedicated Helm chart has been developed to ease the nmaas installation inside a Kubernetes cluster. +This way both the supported network management applications and the nmaas core components can be installed within a single K8s cluster. +For more information please contact the [nmaas Team](mailto:nmaas-team@lists.geant.org). -### Building and uploading NMaaS Platform Docker image +### Building and uploading nmaas Platform Docker image -In order to build the NMaaS Platform Docker image first alter the *build_and_publish.sh* with custom *REPOSITORY*, *PACKAGE* and *TAG* values and execute *build_and_publish.sh* to automatically build and publish *nmaas-platform* image to selected Docker repository. +In order to build the nmaas Platform Docker image first alter the *build_and_publish.sh* with custom *REPOSITORY*, *PACKAGE* and *TAG* values and execute *build_and_publish.sh* to automatically build and publish *nmaas-platform* image to selected Docker repository. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661ee733431762e7ccf8ab9b7409ed44960c..068cdb2dc260b6b72d7b19eaebd2abd5ca012b19 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/integrationTest/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterControllerIntTest.java b/src/integrationTest/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterControllerIntTest.java index 17975870c7d090b178ee01d03057daacf7970ae5..9ca59982176993b4fe71e3f3bd1c1e47a44e076e 100644 --- a/src/integrationTest/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterControllerIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterControllerIntTest.java @@ -44,6 +44,7 @@ public class KubernetesClusterControllerIntTest { "\"smtpServerPort\":587," + "\"smtpServerUsername\":\"\"," + "\"smtpServerPassword\":\"\"," + + "\"smtpFromDefaultDomain\":\"\"," + "\"forceDedicatedWorkers\":false" + "}" + "}"; @@ -55,7 +56,7 @@ public class KubernetesClusterControllerIntTest { private KubernetesClusterIngressManager clusterIngressManager; @Test - public void shouldFetchKubernetesCluster() throws Exception { + void shouldFetchKubernetesCluster() throws Exception { MockMvc mvc = MockMvcBuilders .standaloneSetup(new KubernetesClusterController(clusterIngressManager, clusterDeploymentManager)) .setControllerAdvice(new ApiExceptionHandler()) diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java index 91c5ce2e755727cb08afba37996a49a426940710..a1a7fd31592143be4c744c9e6a6b9b8ad47da2e1 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java @@ -65,7 +65,7 @@ public class ConfigurationControllerTest extends BaseControllerTestSetup { @Test void shouldAddNewConfiguration() throws Exception { repository.deleteAll(); - ConfigurationView configuration = new ConfigurationView(true, false, "en", false, false, new ArrayList<>()); + ConfigurationView configuration = new ConfigurationView(true, false, "en", false, false, new ArrayList<>(), true, true); mvc.perform(post(URL_PREFIX) .contentType(MediaType.APPLICATION_JSON) .header("Authorization","Bearer " + getValidTokenForUser(user)) @@ -81,7 +81,7 @@ public class ConfigurationControllerTest extends BaseControllerTestSetup { @Test void shouldUpdateConfiguration() throws Exception { Long id = repository.findAll().get(0).getId(); - ConfigurationView configuration = new ConfigurationView(true, false, "en", false, false, new ArrayList<>()); + ConfigurationView configuration = new ConfigurationView(true, false, "en", false, false, new ArrayList<>(), true, true); configuration.setId(id); mvc.perform(put(URL_PREFIX+"/{id}",id) .contentType(MediaType.APPLICATION_JSON) diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/market/ApplicationControllerIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/market/ApplicationControllerIntTest.java index feaf7ea264c915c46f0240b828bc53a747d1c504..f2f9b6b7ffaa5b3e0f43fbd100b2a2cc08fe3bd6 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/api/market/ApplicationControllerIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/api/market/ApplicationControllerIntTest.java @@ -20,6 +20,7 @@ import net.geant.nmaas.portal.api.domain.AppConfigurationSpecView; import net.geant.nmaas.portal.api.domain.AppDeploymentSpecView; import net.geant.nmaas.portal.api.domain.AppStorageVolumeView; import net.geant.nmaas.portal.api.domain.ApplicationBaseView; +import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS; import net.geant.nmaas.portal.api.domain.ApplicationDTO; import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest; import net.geant.nmaas.portal.api.domain.ApplicationView; @@ -101,8 +102,16 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup { this.testApp1Base = this.applicationBaseService.create(getDefaultApplicationBase(APP_1_NAME)); this.testApp1 = this.applicationService.create(getDefaultApplication(APP_1_NAME, "1.1.0", ApplicationState.ACTIVE)); - this.testApp1Base.getVersions().add( - new ApplicationVersion(this.testApp1.getVersion(), this.testApp1.getState(), this.testApp1.getId()) + this.testApp1Base.getVersions().addAll( + List.of( + new ApplicationVersion(this.testApp1.getVersion(), this.testApp1.getState(), this.testApp1.getId()), + new ApplicationVersion("1.1.1", + ApplicationState.ACTIVE, + this.applicationService.create(getDefaultApplication(APP_1_NAME, "1.1.1", ApplicationState.ACTIVE)).getId()), + new ApplicationVersion("1.1.2", + ApplicationState.DISABLED, + this.applicationService.create(getDefaultApplication(APP_1_NAME, "1.1.2", ApplicationState.DISABLED)).getId()) + ) ); this.testApp1Base = this.applicationBaseService.update(this.testApp1Base); @@ -122,12 +131,13 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup { @Test void shouldGetActiveApplications() throws Exception { + log.debug("Test = {} {}", this.applicationBaseRepository.findAll().size(), this.applicationBaseRepository.findAllSmall().size()); MvcResult result = mvc.perform(get("/api/apps/base") .header("Authorization", "Bearer " + getValidTokenForUser(UsersHelper.ADMIN)) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); - ApplicationBaseView[] resultView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationBaseView[].class); + ApplicationBaseViewS[] resultView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationBaseViewS[].class); assertEquals(1, resultView.length); assertEquals(APP_1_NAME, resultView[0].getName()); } @@ -248,6 +258,18 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup { assertEquals(APP_1_NAME, app.getName()); } + @Test + void shouldGetAppBaseByName() throws Exception { + String name = this.testApp1Base.getName(); + MvcResult result = mvc.perform(get("/api/apps/base/name/" + name) + .header("Authorization", "Bearer " + getValidTokenForUser(UsersHelper.ADMIN)) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + ApplicationBaseView app = objectMapper.readValue(result.getResponse().getContentAsString(), ApplicationBaseView.class); + assertEquals(APP_1_NAME, app.getName()); + } + @Test void shouldGetLatestAppVersion() throws Exception { this.applicationService.create(getDefaultApplication(APP_1_NAME, "1.3.0", ApplicationState.DISABLED)); @@ -301,6 +323,14 @@ class ApplicationControllerIntTest extends BaseControllerTestSetup { .andReturn(); ApplicationView applicationView = objectMapper.readValue(result.getResponse().getContentAsByteArray(), ApplicationView.class); assertEquals(ApplicationState.DISABLED, applicationView.getState()); + + //reverse state to active again + mvc.perform(patch("/api/apps/state/" + id) + .header("Authorization", "Bearer " + getValidTokenForUser(UsersHelper.ADMIN)) + .content(objectMapper.writeValueAsString(new ApplicationStateChangeRequest(ApplicationState.ACTIVE, "reason", false))) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); } @Test diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java index 8d9139741cdbea4b1c57a7764f481805b5497698..4a19c870755f0d0d5ce88a6eb8ea43c98a542537 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java @@ -12,7 +12,6 @@ import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; -import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.entity.UserRole; import net.geant.nmaas.portal.persistent.entity.UsersHelper; @@ -316,8 +315,8 @@ public class UsersControllerIntTest extends BaseControllerTestSetup { user.setRoles(Stream.of(userRole1, userRole2).collect(Collectors.toList())); user.setEnabled(true); - UserRoleView userRole3 = new UserRoleView(ROLE_TOOL_MANAGER, 1L); - UserRoleView userRole4 = new UserRoleView(ROLE_USER, 1L); + UserRoleView userRole3 = new UserRoleView(ROLE_TOOL_MANAGER, 1L, ""); + UserRoleView userRole4 = new UserRoleView(ROLE_USER, 1L, ""); UserRequest userRequest = new UserRequest(2L, "user2", "password"); userRequest.setFirstname("FirstName1"); diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java index aafa1f5e4aaee4c346e98b5e6b82f9a6c5e579c4..391174b4992d9c03d239b53d169c7594e3bc4c0a 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java @@ -3,17 +3,21 @@ package net.geant.nmaas.portal.service.impl; import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.bulk.CsvDomain; +import net.geant.nmaas.portal.api.configuration.ConfigurationView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; -import net.geant.nmaas.portal.persistent.entity.User; +import net.geant.nmaas.portal.persistent.entity.Configuration; import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository; +import net.geant.nmaas.portal.persistent.repositories.ConfigurationRepository; +import net.geant.nmaas.portal.persistent.repositories.UserRepository; import net.geant.nmaas.portal.persistent.repositories.UserRoleRepository; import net.geant.nmaas.portal.service.BulkDomainService; import net.geant.nmaas.portal.service.UserService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -22,11 +26,9 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import javax.transaction.Transactional; import java.util.List; -import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) @SpringBootTest @@ -40,34 +42,88 @@ public class BulkDomainServiceIntTest { @Autowired private BulkDomainService bulkDomainService; - @MockBean + @Autowired private UserService userService; + @Autowired + private UserRepository userRepository; + + @Autowired + private ConfigurationRepository configurationRepository; + + @Autowired + private ModelMapper modelMapper; + @MockBean private UserRoleRepository userRoleRepository; @AfterEach void cleanup() { bulkDeploymentRepository.deleteAll(); + userRepository.deleteAll(); } @Test - void shouldHandleBulkCreationOfDomainWithUniqueCodenames() { - CsvDomain csvDomain1 = new CsvDomain("Test.Domain.100", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain2 = new CsvDomain("Test.Domain.101", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain3 = new CsvDomain("Test.Domain.102", "user1", "user1@test.com", null, "group1"); + void shouldHandleBulkCreationOfUsersWithSsoEnabledFlag() { + CsvDomain csvDomain1 = new CsvDomain("test1", "user1", "user1@test.com", null, "group1", true); + CsvDomain csvDomain2 = new CsvDomain("test2", "user2", "user2@test.com", null, "group1", false); + CsvDomain csvDomain3 = new CsvDomain("test3", "user3", "user3@test.com", null, "group1", true); List<CsvDomain> input = List.of(csvDomain1, csvDomain2, csvDomain3); + UserViewMinimal creator = new UserViewMinimal(); creator.setId(1L); - creator.setUsername("testuser"); - User user = new User("admin"); - user.setId(1L); - user.setEmail("test@test.com"); - when(userService.findByUsername(any())).thenReturn(Optional.of(user)); - when(userService.registerBulk(any(), any(), any())).thenReturn(user); + creator.setUsername("admin"); BulkDeploymentViewS result = bulkDomainService.handleBulkCreation(input, creator); + assertEquals(BulkDeploymentState.COMPLETED, result.getState()); + List<BulkDeployment> bulkDeployments = bulkDeploymentRepository.findAll(); + assertEquals(1, bulkDeployments.size()); + BulkDeployment bulkDeployment = bulkDeployments.get(0); + assertEquals(1, bulkDeployment.getCreatorId()); + assertEquals(BulkType.DOMAIN, bulkDeployment.getType()); + assertEquals(6, bulkDeployment.getEntries().size()); + assertThat(userRepository.findByEmail("user1@test.com").orElseThrow().getSamlToken()).isEqualTo("user1@test.com"); + assertThat(userRepository.findByEmail("user2@test.com").orElseThrow().getSamlToken()).isNull(); + assertThat(userRepository.findByEmail("user3@test.com").orElseThrow().getSamlToken()).isEqualTo("user3@test.com"); + } + + @Test + void shouldHandleBulkCreationOfUsersWithSsoEnabledFlagWhenDisabledGlobally() { + CsvDomain csvDomain1 = new CsvDomain("test4", "user1", "user1@test.com", null, "group1", true); + CsvDomain csvDomain2 = new CsvDomain("test5", "user2", "user2@test.com", null, "group1", false); + List<CsvDomain> input = List.of(csvDomain1, csvDomain2); + configurationRepository.save(modelMapper.map( + ConfigurationView.builder().id(1L).defaultLanguage("en").bulkDomainsAllowForSsoAccounts(false).build(), Configuration.class)); + UserViewMinimal creator = new UserViewMinimal(); + creator.setId(1L); + creator.setUsername("admin"); + + BulkDeploymentViewS result = bulkDomainService.handleBulkCreation(input, creator); + + assertEquals(BulkDeploymentState.COMPLETED, result.getState()); + List<BulkDeployment> bulkDeployments = bulkDeploymentRepository.findAll(); + assertEquals(1, bulkDeployments.size()); + BulkDeployment bulkDeployment = bulkDeployments.get(0); + assertEquals(1, bulkDeployment.getCreatorId()); + assertEquals(BulkType.DOMAIN, bulkDeployment.getType()); + assertEquals(4, bulkDeployment.getEntries().size()); + assertThat(userRepository.findByEmail("user1@test.com").orElseThrow().getSamlToken()).isNull(); + assertThat(userRepository.findByEmail("user2@test.com").orElseThrow().getSamlToken()).isNull(); + } + + @Test + void shouldHandleBulkCreationOfDomainWithUniqueCodenames() { + CsvDomain csvDomain1 = new CsvDomain("Test.Domain.100", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain2 = new CsvDomain("Test.Domain.101", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain3 = new CsvDomain("Test.Domain.102", "user1", "user1@test.com", null, "group1", null); + List<CsvDomain> input = List.of(csvDomain1, csvDomain2, csvDomain3); + + UserViewMinimal creator = new UserViewMinimal(); + creator.setId(1L); + creator.setUsername("admin"); + BulkDeploymentViewS result = bulkDomainService.handleBulkCreation(input, creator); + assertEquals(BulkDeploymentState.COMPLETED, result.getState()); List<BulkDeployment> bulkDeployments = bulkDeploymentRepository.findAll(); assertEquals(1, bulkDeployments.size()); @@ -82,28 +138,26 @@ public class BulkDomainServiceIntTest { @Test void shouldHandleBulkCreationOfDomainWithManyUniqueCodenames() { - CsvDomain csvDomain1 = new CsvDomain("Test2.Domain#User154", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain2 = new CsvDomain("Test2.Domain#User324", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain3 = new CsvDomain("Test2.Domain#User453", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain4 = new CsvDomain("Test2.Domain#User236", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain5 = new CsvDomain("Test2.Domain#User753", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain6 = new CsvDomain("Test2.Domain#User823", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain7 = new CsvDomain("Test2.Domain#User156", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain8 = new CsvDomain("Test2.Domain#User754", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain9 = new CsvDomain("Test2.Domain#User865", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain10 = new CsvDomain("Test2.Domain#User933", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain11 = new CsvDomain("Test2.Domain#User944", "user1", "user1@test.com", null, "group1"); - CsvDomain csvDomain12 = new CsvDomain("Test2.Domain#User966", "user1", "user1@test.com", null, "group1"); + CsvDomain csvDomain1 = new CsvDomain("Test2.Domain#User154", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain2 = new CsvDomain("Test2.Domain#User324", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain3 = new CsvDomain("Test2.Domain#User453", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain4 = new CsvDomain("Test2.Domain#User236", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain5 = new CsvDomain("Test2.Domain#User753", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain6 = new CsvDomain("Test2.Domain#User823", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain7 = new CsvDomain("Test2.Domain#User156", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain8 = new CsvDomain("Test2.Domain#User754", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain9 = new CsvDomain("Test2.Domain#User865", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain10 = new CsvDomain("Test2.Domain#User933", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain11 = new CsvDomain("Test2.Domain#User944", "user1", "user1@test.com", null, "group1", null); + CsvDomain csvDomain12 = new CsvDomain("Test2.Domain#User966", "user1", "user1@test.com", null, "group1", null); List<CsvDomain> input = List.of(csvDomain1, csvDomain2, csvDomain3, csvDomain4, csvDomain5, csvDomain6, csvDomain7, csvDomain8, csvDomain9, csvDomain10, csvDomain11, csvDomain12); - User user = new User("admin"); - user.setId(1L); - user.setEmail("test@test.com"); - when(userService.findByUsername(any())).thenReturn(Optional.of(user)); - when(userService.registerBulk(any(), any(), any())).thenReturn(user); - bulkDomainService.handleBulkCreation(input, new UserViewMinimal()); + UserViewMinimal creator = new UserViewMinimal(); + creator.setId(1L); + creator.setUsername("admin"); + bulkDomainService.handleBulkCreation(input, creator); BulkDeployment bulkDeployment = bulkDeploymentRepository.findAll().get(0); assertEquals(24, bulkDeployment.getEntries().size()); diff --git a/src/integrationTest/resources/application.properties b/src/integrationTest/resources/application.properties index e87552e2800c17661de78801a64d0fefb68aa705..5164bcec624b472718e1c2c26d944615775b2502 100644 --- a/src/integrationTest/resources/application.properties +++ b/src/integrationTest/resources/application.properties @@ -1,7 +1,7 @@ # --------------- # # Active profiles # # --------------- # -# profiles are used to customise platform operations in following areas +# profiles are used to customise platform operations in the following areas # - container orchestrator (options: env_kubernetes) # - database (options: db_memory, db_standalone) spring.profiles.active=env_kubernetes, db_memory @@ -44,7 +44,7 @@ spring.flyway.locations=classpath:/db/migration/common spring.flyway.enabled=false # -------------------------------------------------------- # -# NMaaS application deployment and configuration processes # +# nmaas application deployment and configuration processes # # -------------------------------------------------------- # nmaas.service.deployment.check.interval=10 nmaas.service.deployment.max.duration=30 @@ -77,10 +77,12 @@ spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl upload.dir=/tmp jwt.tokenValidFor=3600000 jwt.refreshTokenValidFor=13600000 -jwt.issuer=NMaaS +jwt.issuer=nmaas jwt.signingKey=testKey jwt.resetSigningKey=testResetKey jwt.resetTokenValidFor=1800000 +jwt.resetTokenRegistrationValid = 86400000 + # bypass captcha on integration tests # https://developers.google.com/recaptcha/docs/faq#id-like-to-run-automated-tests-with-recaptcha-v2-what-should-i-do @@ -97,7 +99,7 @@ sso.key=sso_shared_secret_key # ------------------ # # Helm configuration # # ------------------ # -helm.update.async.enabled=true +helm.update.async.enabled=false helm.update.async.cron=0 * * * * ? helm.address=10.134.241.6 helm.username=nmaas @@ -106,7 +108,7 @@ helm.repositoryName=nmaas-test helm.repositoryUrl=https://nmaas-test.helm.repository helm.chartsDirectory=/home/nmaas/charts helm.enableTls=false -# possible values for Helm version are v2 and v3 (if none is provided v3 is used by default) +# possible values for a Helm version are v2 and v3 (if none is provided, v3 is used by default) helm.version=v2 # --------------------- # @@ -118,8 +120,7 @@ janitor.port=5000 # -------------------- # # GitLab configuration # # -------------------- # -gitlab.address=nmaas-gitlab-unicorn -gitlab.port=8080 +gitlab.apiUrl=http://nmaas-gitlab-unicorn:8080 gitlab.token=test_gitlab_token # ------------------------ # @@ -144,6 +145,7 @@ kubernetes.deployment.smtpServerHostname=test-postfix kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerPassword= +kubernetes.deployment.smtpFromDefaultDomain= kubernetes.deployment.defaultStorageClass=storageClass # -------------------- # @@ -155,5 +157,5 @@ portal.config.defaultLanguage=en portal.config.testInstance=false portal.config.sendAppInstanceFailureEmails=false portal.config.showDomainRegistrationSelector=true -# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +# string - list of emails with ':' as a separator, e.g., admin1@nmaas.eu;admin2@nmaas.eu portal.config.appInstanceFailureEmailList=admin@nmaas.eu diff --git a/src/main/java/net/geant/nmaas/RestAuthenticationEntryPoint.java b/src/main/java/net/geant/nmaas/RestAuthenticationEntryPoint.java index a907988e438ba267ebd8f3874cd00586fddd76f3..2c2b38bae3d826445fe271b1def36758f9758956 100644 --- a/src/main/java/net/geant/nmaas/RestAuthenticationEntryPoint.java +++ b/src/main/java/net/geant/nmaas/RestAuthenticationEntryPoint.java @@ -17,6 +17,6 @@ public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { HttpServletResponse response, AuthenticationException authException) throws IOException { - response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Not authorized to invoke NMaaS REST API operations" ); + response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Not authorized to invoke nmaas REST API operations" ); } } diff --git a/src/main/java/net/geant/nmaas/externalservices/gitlab/GitLabManager.java b/src/main/java/net/geant/nmaas/externalservices/gitlab/GitLabManager.java index f763eff5655241556b5973edf1795d09d1cb082d..a833ba2ef14981fdaeb4967eceda955fecccd8a5 100644 --- a/src/main/java/net/geant/nmaas/externalservices/gitlab/GitLabManager.java +++ b/src/main/java/net/geant/nmaas/externalservices/gitlab/GitLabManager.java @@ -22,21 +22,16 @@ import static com.google.common.base.Preconditions.checkArgument; @Log4j2 public class GitLabManager { - @Value("${gitlab.address}") - private String gitLabAddress; + private static final String GITLAB_API_NAMESPACE = "/api/v4"; - @Value("${gitlab.port}") - private Integer gitLabPort; + @Value("${gitlab.apiUrl}") + private String gitLabApiUrl; @Value("${gitlab.token}") private String gitLabToken; - public String getGitlabServer() { - return this.gitLabAddress; - } - - public int getGitlabPort() { - return this.gitLabPort; + public String getGitLabApiUrl() { + return this.gitLabApiUrl; } public GroupApi groups() { @@ -59,19 +54,20 @@ public class GitLabManager { return new GitLabApi(GitLabApi.ApiVersion.V4, getApiUrl(), this.gitLabToken); } - private String getApiUrl(){ - return String.format("http://%s:%d", this.gitLabAddress, this.gitLabPort); + String getApiUrl() { + return gitLabApiUrl.endsWith(GITLAB_API_NAMESPACE) + ? gitLabApiUrl.substring(0, gitLabApiUrl.length() - GITLAB_API_NAMESPACE.length()) + : gitLabApiUrl; } public void validateGitLabInstance() { - checkArgument(this.gitLabAddress != null && !this.gitLabAddress.isEmpty(), "GitLab address is null or empty"); - checkArgument(this.gitLabPort != null, "GitLab port is null"); + checkArgument(this.gitLabApiUrl != null && !this.gitLabApiUrl.isEmpty(), "GitLab api URL is null or empty"); checkArgument(this.gitLabToken != null && !this.gitLabToken.isEmpty(), "GitLab token is null or empty"); try { api().getVersion(); log.trace("GitLab instance is running"); - } catch (GitLabApiException e){ - throw new GitLabInvalidConfigurationException("GitLab instance is not running -> " + e.getMessage()); + } catch (GitLabApiException e) { + throw new GitLabInvalidConfigurationException("GitLab instance doesn't respond -> " + e.getMessage()); } } diff --git a/src/main/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterDeploymentManager.java b/src/main/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterDeploymentManager.java index 692a3194dca0af37c58ec83e3cec9115ee31c2ed..9a108829db23b6396be5aeecfbcfa47f5bfcb52f 100644 --- a/src/main/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterDeploymentManager.java +++ b/src/main/java/net/geant/nmaas/externalservices/kubernetes/KubernetesClusterDeploymentManager.java @@ -46,6 +46,9 @@ public class KubernetesClusterDeploymentManager implements KubernetesClusterName @Value("${kubernetes.deployment.smtpServerPassword:}") private String smtpServerPassword; + @Value("${kubernetes.deployment.smtpFromDefaultDomain}") + private String smtpFromDefaultDomain; + @Value("${kubernetes.deployment.forceDedicatedWorkers:false}") private Boolean forceDedicatedWorkers; @@ -101,6 +104,8 @@ public class KubernetesClusterDeploymentManager implements KubernetesClusterName return Optional.ofNullable(smtpServerPassword); } + public String getSMTPFromDefaultDomain() { return smtpFromDefaultDomain; } + KClusterView.KClusterDeploymentView getKClusterDeploymentView() { KClusterView.KClusterDeploymentView kClusterDeploymentView = new KClusterView.KClusterDeploymentView(); kClusterDeploymentView.setNamespaceConfigOption(this.namespaceConfigOption); @@ -110,6 +115,7 @@ public class KubernetesClusterDeploymentManager implements KubernetesClusterName kClusterDeploymentView.setSmtpServerPort(this.smtpServerPort); kClusterDeploymentView.setSmtpServerUsername(this.smtpServerUsername); kClusterDeploymentView.setSmtpServerPassword(this.smtpServerPassword); + kClusterDeploymentView.setSmtpFromDefaultDomain(this.smtpFromDefaultDomain); kClusterDeploymentView.setForceDedicatedWorkers(this.forceDedicatedWorkers); return kClusterDeploymentView; } diff --git a/src/main/java/net/geant/nmaas/externalservices/kubernetes/model/KClusterView.java b/src/main/java/net/geant/nmaas/externalservices/kubernetes/model/KClusterView.java index ced722665b2c183485ea38f7294490c3db02017f..ce62c2088f4c1f1bc10682dca44ec692bffd63a1 100644 --- a/src/main/java/net/geant/nmaas/externalservices/kubernetes/model/KClusterView.java +++ b/src/main/java/net/geant/nmaas/externalservices/kubernetes/model/KClusterView.java @@ -33,6 +33,8 @@ public class KClusterView { private String smtpServerPassword; + private String smtpFromDefaultDomain; + private Boolean forceDedicatedWorkers; } diff --git a/src/main/java/net/geant/nmaas/metrics/BasicApplicationMetricsService.java b/src/main/java/net/geant/nmaas/metrics/BasicApplicationMetricsService.java index 0031faabffc1210d60b99c647d024995ea3411a4..75774b83cba257d87c4ced91a8302bb1848f4911 100644 --- a/src/main/java/net/geant/nmaas/metrics/BasicApplicationMetricsService.java +++ b/src/main/java/net/geant/nmaas/metrics/BasicApplicationMetricsService.java @@ -13,16 +13,16 @@ import org.springframework.stereotype.Component; public class BasicApplicationMetricsService extends BaseMetricService { private static final String APPLICATION_COUNT_METRIC_NAME = "nmaas_applications_count"; - private static final String APPLICATION_COUNT_METRIC_DESCRIPTION = "Total NMaaS applications"; + private static final String APPLICATION_COUNT_METRIC_DESCRIPTION = "Total nmaas applications"; private static final String APPLICATION_INSTANCE_RUNNING_ALL_COUNT_METRIC_NAME = "nmaas_application_instances_all_count"; - private static final String APPLICATION_INSTANCE_RUNNING_ALL_COUNT_METRIC_DESCRIPTION = "Total NMaaS running application instances"; + private static final String APPLICATION_INSTANCE_RUNNING_ALL_COUNT_METRIC_DESCRIPTION = "Total nmaas running application instances"; private static final String APPLICATION_INSTANCE_RUNNING_COUNT_METRIC_NAME = "nmaas_application_instances_count"; - private static final String APPLICATION_INSTANCE_RUNNING_COUNT_METRIC_DESCRIPTION = "NMaaS running application instances"; + private static final String APPLICATION_INSTANCE_RUNNING_COUNT_METRIC_DESCRIPTION = "nmaas running application instances"; private static final String APPLICATION_SUBSCRIPTIONS_COUNT_METRIC_NAME = "nmaas_application_subscriptions_count"; - private static final String APPLICATION_SUBSCRIPTIONS_COUNT_METRIC_DESCRIPTION = "Total NMaaS application subscriptions"; + private static final String APPLICATION_SUBSCRIPTIONS_COUNT_METRIC_DESCRIPTION = "Total nmaas application subscriptions"; private static final String BASE_UNIT_NUMBER = "number"; diff --git a/src/main/java/net/geant/nmaas/metrics/BasicUserMetricsService.java b/src/main/java/net/geant/nmaas/metrics/BasicUserMetricsService.java index 640ef14af3b5ca2b9a69d82e39708ae766c65652..50ee2351a6b3c6b3fe03e7061e6074b07b8f2be4 100644 --- a/src/main/java/net/geant/nmaas/metrics/BasicUserMetricsService.java +++ b/src/main/java/net/geant/nmaas/metrics/BasicUserMetricsService.java @@ -12,13 +12,13 @@ import org.springframework.stereotype.Component; public class BasicUserMetricsService extends BaseMetricService { private static final String USER_COUNT_METRIC_NAME = "nmaas_users_count"; - private static final String USER_COUNT_METRIC_DESCRIPTION = "Total NMaaS users"; + private static final String USER_COUNT_METRIC_DESCRIPTION = "Total nmaas users"; private static final String USER_WITHOUT_DOMAIN_COUNT_METRIC_NAME = "nmaas_user_no_domain_count"; - private static final String USER_WITHOUT_DOMAIN_COUNT_METRIC_DESCRIPTION = "NMaaS users without domain"; + private static final String USER_WITHOUT_DOMAIN_COUNT_METRIC_DESCRIPTION = "nmaas users without domain"; private static final String DOMAIN_COUNT_METRIC_NAME = "nmaas_domains_count"; - private static final String DOMAIN_COUNT_METRIC_DESCRIPTION = "Total NMaaS domains"; + private static final String DOMAIN_COUNT_METRIC_DESCRIPTION = "Total nmaas domains"; private static final String BASE_UNIT_NUMBER = "number"; diff --git a/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandler.java b/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandler.java index 1ae22d4c96ef0bd1975b28de4655bbcd1fa319ff..646309ed57fd872851bf36787ae1380beea50bc7 100644 --- a/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandler.java +++ b/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandler.java @@ -201,8 +201,8 @@ public class GitLabConfigHandler implements GitConfigHandler { String getHttpUrlToRepo(Integer gitLabProjectId) throws GitLabApiException { String[] urlFromGitlabApiParts = gitLabManager.projects().getProject(gitLabProjectId).getHttpUrlToRepo().split("//"); String[] urlParts = urlFromGitlabApiParts[1].split("/"); - urlParts[0] = gitLabManager.getGitlabServer() + ":" + gitLabManager.getGitlabPort(); - return urlFromGitlabApiParts[0] + "//" + String.join("/", urlParts); + urlParts[0] = gitLabManager.getGitLabApiUrl(); + return String.join("/", urlParts); } @Override @@ -261,8 +261,8 @@ public class GitLabConfigHandler implements GitConfigHandler { * * @param deploymentId unique identifier of service deployment * @param configIds list of identifiers of configuration files that should be loaded from database and uploaded to the git repository - * @throws InvalidDeploymentIdException if a service for given deployment identifier could not be found in database - * @throws ConfigFileNotFoundException if any of the configuration files for which an identifier is given could not be found in database + * @throws InvalidDeploymentIdException if a service for given deployment identifier could not be found in the database + * @throws ConfigFileNotFoundException if any of the configuration files for which an identifier is given could not be found in the database * @throws FileTransferException if any error occurs during communication with the git repository API */ @Override diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesDeploymentParametersProvider.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesDeploymentParametersProvider.java index e0daab4bcb4fd671407b33bab6522975ede94585..a24f6eaa4e8e491c38b9b9ed2264b32fa34ff5e1 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesDeploymentParametersProvider.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesDeploymentParametersProvider.java @@ -16,7 +16,9 @@ import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubern import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.BASE_URL; import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.DOMAIN_CODENAME; import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.RELEASE_NAME; +import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.SMTP_FROM_DEFAULT_DOMAIN; import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.SMTP_HOSTNAME; +import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.SMTP_HOST_WITH_PORT; import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.SMTP_PASSWORD; import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.SMTP_PORT; import static net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ParameterType.SMTP_USERNAME; @@ -35,13 +37,15 @@ public class KubernetesDeploymentParametersProvider implements AppDeploymentPara Map<String, String> parametersMap = new HashMap<>(); parametersMap.put(SMTP_HOSTNAME.name(), deploymentManager.getSMTPServerHostname()); parametersMap.put(SMTP_PORT.name(), deploymentManager.getSMTPServerPort().toString()); + parametersMap.put(SMTP_HOST_WITH_PORT.name(), deploymentManager.getSMTPServerHostname() + ":" + deploymentManager.getSMTPServerPort().toString()); + parametersMap.put(SMTP_FROM_DEFAULT_DOMAIN.name(), deploymentManager.getSMTPFromDefaultDomain()); deploymentManager.getSMTPServerUsername().ifPresent(username -> { - if(!username.isEmpty()) { + if (!username.isEmpty()) { parametersMap.put(SMTP_USERNAME.name(), username); } }); deploymentManager.getSMTPServerPassword().ifPresent(value -> { - if(!value.isEmpty()) { + if (!value.isEmpty()) { parametersMap.put(SMTP_PASSWORD.name(), value); } }); diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java index 6af4e24cb1a1c2c26ad9030e2988ab5eb0fed244..2b7d57c4fb15b39d0aab8dd1ac27c3d6fb246532 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java @@ -46,11 +46,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkArgument; @@ -131,10 +127,10 @@ public class KubernetesManager implements ContainerOrchestrator { .collect(Collectors.toSet()); } - private Map<String, String> createAdditionalParametersMap(Identifier deploymentId, Map<String, String> deployParameters){ + private Map<String, String> createAdditionalParametersMap(Identifier deploymentId, Map<String, String> deployParameters) { Map<String, String> additionalParameters = new HashMap<>(); Map<String, String> deploymentParameters = deploymentParametersProvider.deploymentParameters(deploymentId); - deployParameters.forEach((k,v) -> { + deployParameters.forEach((k, v) -> { switch (ParameterType.fromValue(k)) { case SMTP_HOSTNAME: additionalParameters.put(v, deploymentParameters.get(ParameterType.SMTP_HOSTNAME.name())); @@ -142,6 +138,12 @@ public class KubernetesManager implements ContainerOrchestrator { case SMTP_PORT: additionalParameters.put(v, deploymentParameters.get(ParameterType.SMTP_PORT.name())); break; + case SMTP_HOST_WITH_PORT: + additionalParameters.put(v, deploymentParameters.get(ParameterType.SMTP_HOST_WITH_PORT.name())); + break; + case SMTP_FROM_DEFAULT_DOMAIN: + additionalParameters.put(v, deploymentParameters.get(ParameterType.SMTP_FROM_DEFAULT_DOMAIN.name())); + break; case SMTP_USERNAME: if (deploymentParameters.containsKey(ParameterType.SMTP_USERNAME.name())) { additionalParameters.put(v, deploymentParameters.get(ParameterType.SMTP_USERNAME.name())); @@ -325,7 +327,7 @@ public class KubernetesManager implements ContainerOrchestrator { buildServiceId(service.getDescriptiveDeploymentId(), m.getDeployParameters()), service.getDomain()); String ipWithPortString = getIpAddressWithPort(lbServiceIp, m.getDeployParameters()); - m.setUrl(getUserAtIpAddressUrl(ipWithPortString, m.getProtocol())); + m.setUrl(getUserAtIpAddressUrl(ipWithPortString, m.getProtocol(), m.getDeployParameters())); } return m; }) @@ -350,8 +352,16 @@ public class KubernetesManager implements ContainerOrchestrator { } } - private String getUserAtIpAddressUrl(String ipAddress, String protocol) { - return "SSH".equals(protocol) ? DEFAULT_INTERNAL_SSH_ACCESS_USERNAME + "@" + ipAddress : ipAddress; + private String getUserAtIpAddressUrl(String ipAddress, String protocol, Map<HelmChartIngressVariable, String> deployParameters) { + String username; + if (deployParameters != null + && deployParameters.containsKey(HelmChartIngressVariable.ACCESS_USER) + && !deployParameters.get(HelmChartIngressVariable.ACCESS_USER).isEmpty()) { + username = deployParameters.get(HelmChartIngressVariable.ACCESS_USER); + return username + "@" + ipAddress; + } else { + return "SSH".equals(protocol) ? DEFAULT_INTERNAL_SSH_ACCESS_USERNAME + "@" + ipAddress : ipAddress; + } } private Identifier getDeploymentIdForJanitorStatusCheck(String releaseName, String componentName) { @@ -367,7 +377,10 @@ public class KubernetesManager implements ContainerOrchestrator { if (m.isOfType(LOCAL) && StringUtils.isEmpty(m.getUrl())) { Identifier serviceName = buildServiceId(service.getDescriptiveDeploymentId(), m.getDeployParameters()); janitorService.checkServiceExists(serviceName, service.getDomain()); - m.setUrl(serviceName.value()); + String username; + username = m.getDeployParameters().get(HelmChartIngressVariable.ACCESS_USER); + m.setUrl(username != null && !username.isEmpty()? + username + "@" + serviceName.value(): serviceName.value()); } return m; }) diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartIngressVariable.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartIngressVariable.java index 456291ea7a0445ca4a3e32518c4931507b42d7fc..6e0a39e2795c3b909738112240982be114e1b697 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartIngressVariable.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartIngressVariable.java @@ -9,5 +9,6 @@ public enum HelmChartIngressVariable { INGRESS_ENABLED, INGRESS_TLS_HOSTS, K8S_SERVICE_SUFFIX, - K8S_SERVICE_PORT + K8S_SERVICE_PORT, + ACCESS_USER } diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartUpdateListener.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartUpdateListener.java index 62ebe235f1867da26bdbfcb55b697c47c5bf50fa..e5fc014caf700dde105b122a4136e5a5b63b9104 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartUpdateListener.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmChartUpdateListener.java @@ -1,6 +1,7 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.helm; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.portal.events.ApplicationListUpdatedEvent; import net.geant.nmaas.utils.logging.LogLevel; import net.geant.nmaas.utils.logging.Loggable; @@ -17,6 +18,7 @@ import static net.geant.nmaas.portal.events.ApplicationListUpdatedEvent.Applicat @Component @AllArgsConstructor +@Slf4j public class HelmChartUpdateListener { @Autowired diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/ParameterType.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/ParameterType.java index ceb8c379c79271048db944f746ebd7433d2c5563..117420b6a0da7c7ce530f0279da2a51eea1e71f7 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/ParameterType.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/ParameterType.java @@ -5,8 +5,10 @@ import java.util.Arrays; public enum ParameterType { SMTP_HOSTNAME, SMTP_PORT, + SMTP_HOST_WITH_PORT, SMTP_USERNAME, SMTP_PASSWORD, + SMTP_FROM_DEFAULT_DOMAIN, DOMAIN_CODENAME, BASE_URL, RELEASE_NAME, @@ -19,4 +21,4 @@ public enum ParameterType { .orElseThrow(IllegalArgumentException::new); } -} +} \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/notifications/NotificationController.java b/src/main/java/net/geant/nmaas/notifications/NotificationController.java index 479709ca7e41fbcb2f1982131a3ba2c7de897879..762740d7c4e176ae4899267ace857a461e4ee268 100644 --- a/src/main/java/net/geant/nmaas/notifications/NotificationController.java +++ b/src/main/java/net/geant/nmaas/notifications/NotificationController.java @@ -31,7 +31,7 @@ public class NotificationController { // TODO verify if captcha token must be verified MailType mailType = mailAttributes.getMailType(); - if(mailType.equals(MailType.CONTACT_FORM) || mailType.equals(MailType.ISSUE_REPORT) || mailType.equals(MailType.NEW_DOMAIN_REQUEST)) { + if (mailType.equals(MailType.CONTACT_FORM) || mailType.equals(MailType.ISSUE_REPORT) || mailType.equals(MailType.NEW_DOMAIN_REQUEST)) { eventPublisher.publishEvent(new NotificationEvent(this, mailAttributes)); } else { throw new AuthenticationException("You are not allowed to send this mail"); diff --git a/src/main/java/net/geant/nmaas/notifications/NotificationManager.java b/src/main/java/net/geant/nmaas/notifications/NotificationManager.java index 4ceca59a8e10d68cc3645983ab11632ce37fdd2c..ad62a89f3520b7a159ff5c70293faba432531cf3 100644 --- a/src/main/java/net/geant/nmaas/notifications/NotificationManager.java +++ b/src/main/java/net/geant/nmaas/notifications/NotificationManager.java @@ -66,12 +66,11 @@ public class NotificationManager { */ void prepareAndSendMail(MailAttributes mailAttributes) { MailTemplateView mailTemplate = templateService.getMailTemplate(mailAttributes.getMailType()); - Template template; try { template = templateService.getHTMLTemplate(); } catch (IOException e) { - log.error(String.format("Cannot retrieve html template: %s", e.getMessage())); + log.error("Cannot retrieve html template: {}", e.getMessage()); throw new ProcessingException(e); } @@ -121,6 +120,9 @@ public class NotificationManager { if (mailAttributes.getMailType().equals(MailType.EXTERNAL_SERVICE_HEALTH_CHECK)) { mailAttributes.setAddressees(userService.findUsersWithRoleSystemAdminAndOperator()); } + if(mailAttributes.getMailType().equals(MailType.NEW_BULK_LOGIN) || mailAttributes.getMailType().equals(MailType.NEW_BULK_SSO_LOGIN)){ + mailAttributes.setAddressees(List.of(convertEmailToUserView((mailAttributes.getOtherAttributes().get("email").toString())))); + } if (List.of(MailType.REGISTRATION, MailType.APP_NEW, MailType.NEW_SSO_LOGIN, MailType.APP_UPGRADE_SUMMARY) .contains(mailAttributes.getMailType())) { mailAttributes.setAddressees(userService.findAllUsersWithAdminRole()); @@ -191,7 +193,7 @@ public class NotificationManager { } private String getFilledTemplate(Template template, LanguageMailContentView langContent, UserView user, MailAttributes mailAttributes, MailTemplateView mailTemplate) throws IOException, TemplateException { - boolean showAdditional = mailAttributes.getOtherAttributes().get("message") != null; + boolean showAdditional = mailAttributes.getMailType() == MailType.NEW_ACTIVE_APP && mailAttributes.getOtherAttributes().get("message") != null; return FreeMarkerTemplateUtils.processTemplateIntoString(template, ImmutableMap.builder() .putAll(mailTemplate.getGlobalInformation()) .put(MailTemplateElements.PORTAL_LINK, this.portalAddress == null ? "" : this.portalAddress) diff --git a/src/main/java/net/geant/nmaas/notifications/templates/MailType.java b/src/main/java/net/geant/nmaas/notifications/templates/MailType.java index 4b596ee1a295cdf911c806b8402f30261fae1f56..93f56e2b85adfd1b73f3dafc3f9f9046820895b5 100644 --- a/src/main/java/net/geant/nmaas/notifications/templates/MailType.java +++ b/src/main/java/net/geant/nmaas/notifications/templates/MailType.java @@ -21,5 +21,8 @@ public enum MailType { APP_UPGRADE_POSSIBLE, APP_UPGRADED, APP_UPGRADE_SUMMARY, - NEW_ACTIVE_APP + NEW_ACTIVE_APP, + + NEW_BULK_SSO_LOGIN, + NEW_BULK_LOGIN } diff --git a/src/main/java/net/geant/nmaas/orchestration/AppLifecycleManager.java b/src/main/java/net/geant/nmaas/orchestration/AppLifecycleManager.java index 96fd51ab75d0c41286737237c4035cbebb3f244c..35dedaa68f5be1dffddfc52ef83c75d1fe3c574e 100644 --- a/src/main/java/net/geant/nmaas/orchestration/AppLifecycleManager.java +++ b/src/main/java/net/geant/nmaas/orchestration/AppLifecycleManager.java @@ -6,12 +6,12 @@ import net.geant.nmaas.orchestration.entities.AppDeploymentState; import net.geant.nmaas.orchestration.exceptions.InvalidDeploymentIdException; /** - * Declares methods to be used by the NMaaS Portal to manage NMaaS applications lifecycle. + * Declares methods to be used by the nmaas Portal to manage nmaas applications lifecycle. */ public interface AppLifecycleManager { /** - * Triggers the NMaaS application deployment process which may take some time. This process is executed asynchronously + * Triggers the nmaas application deployment process which may take some time. This process is executed asynchronously * and {@link AppDeploymentState} for this deployment is updated once particular deployment phases * are completed. The current {@link AppDeploymentState} may be retrieved from {@link AppDeploymentMonitor}. * @@ -21,7 +21,7 @@ public interface AppLifecycleManager { Identifier deployApplication(AppDeployment appDeployment); /** - * Triggers the NMaaS application redeployment process which may take some time.This process is executed asynchronously + * Triggers the nmaas application redeployment process which may take some time.This process is executed asynchronously * and {@link AppDeploymentState} for this deployment is updated once particular deployment phases * are completed. The current {@link AppDeploymentState} may be retrieved from {@link AppDeploymentMonitor}. * @param deploymentId unique identifier of the user application @@ -29,7 +29,7 @@ public interface AppLifecycleManager { void redeployApplication(Identifier deploymentId); /** - * Applies custom configuration for the NMaaS application being deployed once provided by the user. + * Applies custom configuration for the nmaas application being deployed once provided by the user. * @param deploymentId unique identifier of the deployed user application * @param configuration configuration provided by user in application deployment wizard * @param initiator username of a user who triggered this action @@ -44,7 +44,7 @@ public interface AppLifecycleManager { void removeApplication(Identifier deploymentId); /** - * Upgrades already deployed user application to the desired version available in the NMaaS Portal. + * Upgrades already deployed user application to the desired version available in the nmaas Portal. * This most probably requires application container redeployment. * Application configuration and persistent data must be retained. * diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java index c4211889458bbd48e832ea4273d35fc30fab98a4..ea7f46dd5a5ff48e624aeb969fc10e06977a94fb 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java @@ -14,9 +14,11 @@ import net.geant.nmaas.portal.service.BulkDomainService; import net.geant.nmaas.portal.service.UserService; import org.modelmapper.ModelMapper; import org.springframework.core.io.InputStreamResource; +import org.springframework.dao.PermissionDeniedDataAccessException; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -30,6 +32,7 @@ import java.security.Principal; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @RestController @@ -91,17 +94,14 @@ public class BulkController { @GetMapping @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") public ResponseEntity<List<BulkDeploymentViewS>> getAllDeploymentRecords() { - return ResponseEntity.ok(mapToView(bulkDeploymentRepository.findAll())); + return ResponseEntity.ok(mapToViewList(bulkDeploymentRepository.findAll())); } @GetMapping("/{id}") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_VL_MANAGER')") public ResponseEntity<BulkDeploymentView> getDeploymentRecord(@PathVariable Long id) { BulkDeployment bulk = bulkDeploymentRepository.findById(id).orElseThrow(); - BulkDeploymentView bulkView = modelMapper.map(bulk, BulkDeploymentView.class); - bulkView.setCreator(getUserView(bulk.getCreatorId())); - mapDetails(bulk, bulkView); - return ResponseEntity.ok(bulkView); + return ResponseEntity.ok(mapToView(bulk, BulkDeploymentView.class)); } @GetMapping(value = "/app/csv/{id}", produces = "text/csv") @@ -124,7 +124,7 @@ public class BulkController { @GetMapping("/domains") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") public ResponseEntity<List<BulkDeploymentViewS>> getDomainDeploymentRecords() { - return ResponseEntity.ok(mapToView(bulkDeploymentRepository.findByType(BulkType.DOMAIN))); + return ResponseEntity.ok(mapToViewList(bulkDeploymentRepository.findByType(BulkType.DOMAIN))); } @GetMapping("/domains/vl") @@ -132,14 +132,14 @@ public class BulkController { public ResponseEntity<List<BulkDeploymentViewS>> getDomainDeploymentRecordsRestrictedToOwner(Principal principal) { User user = this.userService.findByUsername(principal.getName()).orElseThrow(() -> new MissingElementException("Missing user " + principal.getName())); - return ResponseEntity.ok(mapToView(bulkDeploymentRepository.findByType(BulkType.DOMAIN)).stream() - .filter(bulk -> bulk.getCreator().getId().equals(user.getId())).collect(Collectors.toList())); + return ResponseEntity.ok(mapToViewList(bulkDeploymentRepository.findByType(BulkType.DOMAIN)).stream() + .filter(bulk -> bulk.getCreator().getId().equals(user.getId())).collect(Collectors.toList())); } @GetMapping("/apps") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") public ResponseEntity<List<BulkDeploymentViewS>> getAppDeploymentRecords() { - return ResponseEntity.ok(mapToView(bulkDeploymentRepository.findByType(BulkType.APPLICATION))); + return ResponseEntity.ok(mapToViewList(bulkDeploymentRepository.findByType(BulkType.APPLICATION))); } @GetMapping("/apps/vl") @@ -147,21 +147,47 @@ public class BulkController { public ResponseEntity<List<BulkDeploymentViewS>> getAppDeploymentRecordsRestrictedToOwner(Principal principal) { User user = this.userService.findByUsername(principal.getName()).orElseThrow(() -> new MissingElementException("Missing user " + principal.getName())); - return ResponseEntity.ok(mapToView(bulkDeploymentRepository.findByType(BulkType.APPLICATION)).stream() + return ResponseEntity.ok(mapToViewList(bulkDeploymentRepository.findByType(BulkType.APPLICATION)).stream() .filter(bulk -> bulk.getCreator().getId().equals(user.getId())).collect(Collectors.toList())); } - private List<BulkDeploymentViewS> mapToView(List<BulkDeployment> deployments) { + @DeleteMapping("/{id}") + @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_VL_MANAGER')") + public ResponseEntity<Void> removeBulkDeployment( + @PathVariable Long id, + @RequestParam(name = "removeAll") boolean removeApps, + Principal principal + ) { + User user = this.userService.findByUsername(principal.getName()).orElseThrow(() -> new MissingElementException("Missing user " + principal.getName())); + + Optional<BulkDeployment> bulk = this.bulkDeploymentRepository.findById(id); + if (bulk.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + if(bulk.get().getCreatorId().equals(user.getId()) ) { + throw new PermissionDeniedDataAccessException("User doesnt have access to this bulk deployment", new Throwable()); + } + if (removeApps) { + bulkApplicationService.deleteAppInstancesFromBulk(mapToView(bulk.get(), BulkDeploymentView.class)); + } + bulkDeploymentRepository.delete(bulk.get()); + return ResponseEntity.ok().build(); + } + + private List<BulkDeploymentViewS> mapToViewList(List<BulkDeployment> deployments) { return deployments.stream() - .map(bulk -> { - BulkDeploymentViewS bulkView = modelMapper.map(bulk, BulkDeploymentViewS.class); - bulkView.setCreator(getUserView(bulk.getCreatorId())); - mapDetails(bulk, bulkView); - return bulkView; - }) + .map(bulk -> mapToView(bulk, BulkDeploymentViewS.class)) .collect(Collectors.toList()); } + private <T extends BulkDeploymentViewS> T mapToView(BulkDeployment bulk, Class<T> viewType) { + T bulkView = modelMapper.map(bulk, viewType); + bulkView.setCreator(getUserView(bulk.getCreatorId())); + mapDetails(bulk, bulkView); + return bulkView; + } + private void mapDetails(BulkDeployment deployment, BulkDeploymentViewS view) { if (deployment.getType().equals(BulkType.APPLICATION)) { Map<String, String> details = new HashMap<>(); diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/CsvDomain.java b/src/main/java/net/geant/nmaas/portal/api/bulk/CsvDomain.java index f6d0944d4ee8fa368cffd758ce97a55f59ab054c..7d7527a1e20950a2aabd149679a089796231cba7 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/CsvDomain.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/CsvDomain.java @@ -23,14 +23,17 @@ public class CsvDomain implements BulkCsvProcessorImpl.CsvBean { private String email; @CsvBindByName(column = "networks") - private Object DCNetworks; + private Object dcnetworks; @CsvBindByName(column = "domainGroups") private String domainGroups; + @CsvBindByName(column = "ssoEnabled") + private Boolean ssoEnabled; + @Override public String toString() { - return String.format("Bulk deployment for domain %s with admin %s %s. Networks: %s, DomainGroups: %s", domainName, email, adminUserName, DCNetworks, domainGroups); + return String.format("Bulk deployment for domain %s with admin %s %s. Networks: %s, DomainGroups: %s", domainName, email, adminUserName, dcnetworks, domainGroups); } } diff --git a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java index 4d4c9414c548f0b760f5e5a61172c195ca16d905..f29d31edcaf510238c219ecf43a5a9ea6f51d434 100644 --- a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java +++ b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java @@ -39,13 +39,22 @@ public class ConfigurationView { @Builder.Default private boolean registrationDomainSelectionEnabled = true; - public ConfigurationView(boolean maintenance, boolean ssoLoginAllowed, String defaultLanguage, boolean testInstance, boolean sendAppInstanceFailureEmails, List<String> appInstanceFailureEmailList) { + @Builder.Default + private boolean bulkDomainsAllowForSsoAccounts = true; + + @Builder.Default + private boolean bulkDomainsSendEmailForNewAccounts = true; + + public ConfigurationView(boolean maintenance, boolean ssoLoginAllowed, String defaultLanguage, boolean testInstance, boolean sendAppInstanceFailureEmails, List<String> appInstanceFailureEmailList, + boolean bulkDomainsAllowForSsoAccounts, boolean bulkDomainsSendEmailForNewAccounts) { this.maintenance = maintenance; this.ssoLoginAllowed = ssoLoginAllowed; this.defaultLanguage = defaultLanguage; this.testInstance = testInstance; this.sendAppInstanceFailureEmails = sendAppInstanceFailureEmails; this.appInstanceFailureEmailList = appInstanceFailureEmailList; + this.bulkDomainsAllowForSsoAccounts = bulkDomainsAllowForSsoAccounts; + this.bulkDomainsSendEmailForNewAccounts = bulkDomainsSendEmailForNewAccounts; } } diff --git a/src/main/java/net/geant/nmaas/portal/api/domain/ApplicationBaseS.java b/src/main/java/net/geant/nmaas/portal/api/domain/ApplicationBaseS.java new file mode 100644 index 0000000000000000000000000000000000000000..8239b7a5dcc4142663c1f35c01b92fcf393ef23c --- /dev/null +++ b/src/main/java/net/geant/nmaas/portal/api/domain/ApplicationBaseS.java @@ -0,0 +1,17 @@ +package net.geant.nmaas.portal.api.domain; + +import net.geant.nmaas.portal.persistent.entity.AppDescription; +import net.geant.nmaas.portal.persistent.entity.Tag; + +import java.util.List; +import java.util.Set; + +public interface ApplicationBaseS { + Long getId(); + String getName(); + + List<AppDescription> getDescriptions(); + + Set<Tag> getTags(); +} + diff --git a/src/main/java/net/geant/nmaas/portal/api/domain/ApplicationBaseViewS.java b/src/main/java/net/geant/nmaas/portal/api/domain/ApplicationBaseViewS.java new file mode 100644 index 0000000000000000000000000000000000000000..85eefdc940e0b9f0d7b6155586159763513c4f41 --- /dev/null +++ b/src/main/java/net/geant/nmaas/portal/api/domain/ApplicationBaseViewS.java @@ -0,0 +1,31 @@ +package net.geant.nmaas.portal.api.domain; + +import lombok.*; +import lombok.experimental.SuperBuilder; +import net.geant.nmaas.portal.persistent.entity.AppDescription; +import net.geant.nmaas.portal.persistent.entity.Tag; + +import javax.validation.constraints.NotEmpty; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +public class ApplicationBaseViewS { + + protected Long id; + @NotEmpty + protected String name; + + @Builder.Default + protected List<AppDescriptionView> descriptions = new ArrayList<>(); + @Builder.Default + protected Set<TagView> tags = new HashSet<>(); + + protected AppRateView rate; +} diff --git a/src/main/java/net/geant/nmaas/portal/api/domain/DomainAware.java b/src/main/java/net/geant/nmaas/portal/api/domain/DomainAware.java index 46b65ec0e9a32c12a041d34788767c937abc2c78..576e146cf7e4844243184b7d35205167e1f2e9b2 100644 --- a/src/main/java/net/geant/nmaas/portal/api/domain/DomainAware.java +++ b/src/main/java/net/geant/nmaas/portal/api/domain/DomainAware.java @@ -1,11 +1,12 @@ package net.geant.nmaas.portal.api.domain; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import javax.validation.constraints.NotNull; + @Getter @Setter @AllArgsConstructor @@ -14,5 +15,8 @@ public abstract class DomainAware { @NotNull Long domainId; + + @NotNull + String domainName; } diff --git a/src/main/java/net/geant/nmaas/portal/api/domain/UserRoleView.java b/src/main/java/net/geant/nmaas/portal/api/domain/UserRoleView.java index c8aec10793a01031efa63392a9888facd0c7d60a..bc76a7b8031a61a219161ba96cdd8682b7955906 100644 --- a/src/main/java/net/geant/nmaas/portal/api/domain/UserRoleView.java +++ b/src/main/java/net/geant/nmaas/portal/api/domain/UserRoleView.java @@ -1,12 +1,11 @@ package net.geant.nmaas.portal.api.domain; -import javax.validation.constraints.NotNull; - import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import net.geant.nmaas.portal.persistent.entity.Role; +import javax.validation.constraints.NotNull; import java.io.Serializable; @Setter @@ -17,8 +16,8 @@ public class UserRoleView extends DomainAware implements Serializable { @NotNull Role role; - public UserRoleView(Role role, Long domainId){ - super(domainId); + public UserRoleView(Role role, Long domainId, String domainName){ + super(domainId, domainName); this.role = role; } } diff --git a/src/main/java/net/geant/nmaas/portal/api/domain/converters/UserConverter.java b/src/main/java/net/geant/nmaas/portal/api/domain/converters/UserConverter.java index 87da28ea94a9f3afb52b3bb7573b5096d43b0e9c..d1723349587102f0d491605adefaa8a3f664f284 100644 --- a/src/main/java/net/geant/nmaas/portal/api/domain/converters/UserConverter.java +++ b/src/main/java/net/geant/nmaas/portal/api/domain/converters/UserConverter.java @@ -31,7 +31,7 @@ public class UserConverter extends AbstractConverter<User, UserView> { private Set<UserRoleView> convertUserRole(User source){ return source.getRoles().stream() - .map(role -> new UserRoleView(role.getRole(), role.getDomain().getId())) + .map(role -> new UserRoleView(role.getRole(), role.getDomain().getId(), role.getDomain().getName())) .collect(Collectors.toSet()); } diff --git a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java index 38ab004726d458a1a5dac6551cab35c433a6bb0f..113a43c9a5e64f616b9488bb17ed6e59ca9216b6 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java @@ -9,12 +9,8 @@ import lombok.extern.log4j.Log4j2; import net.geant.nmaas.notifications.MailAttributes; import net.geant.nmaas.notifications.NotificationEvent; import net.geant.nmaas.notifications.templates.MailType; -import net.geant.nmaas.portal.api.domain.AppRateView; -import net.geant.nmaas.portal.api.domain.ApplicationBaseView; -import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest; -import net.geant.nmaas.portal.api.domain.ApplicationView; -import net.geant.nmaas.portal.api.domain.Id; -import net.geant.nmaas.portal.api.domain.UserView; +import net.geant.nmaas.orchestration.AppLifecycleManager; +import net.geant.nmaas.portal.api.domain.*; import net.geant.nmaas.portal.api.exception.MarketException; import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.ProcessingException; @@ -26,6 +22,8 @@ import net.geant.nmaas.portal.persistent.entity.ApplicationVersion; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.repositories.RatingRepository; +import net.geant.nmaas.portal.service.ApplicationInstanceService; +import net.geant.nmaas.portal.service.ApplicationSubscriptionService; import net.geant.nmaas.portal.service.impl.ApplicationServiceImpl; import org.springframework.context.ApplicationEventPublisher; import org.springframework.http.HttpStatus; @@ -44,11 +42,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.security.Principal; import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @RestController @@ -68,19 +62,35 @@ public class ApplicationController extends AppBaseController { private ApplicationView application; } + @AllArgsConstructor + @NoArgsConstructor + @Getter + @Setter + public static class ApplicationDTOVersionList { + private ApplicationBaseView applicationBase; + private List<ApplicationView> applications; + } + private final ApplicationEventPublisher eventPublisher; private final RatingRepository ratingRepository; + private final ApplicationInstanceService applicationInstanceService; + + private final AppLifecycleManager appLifecycleManager; + + private final AppInstanceController appInstanceController; + + private final ApplicationSubscriptionService applicationSubscriptionService; + /* * Application Base Part */ @GetMapping("/base") @Transactional - public List<ApplicationBaseView> getAllActiveApplicationBase() { - return appBaseService.findAllActiveApps().stream() - .map(app -> modelMapper.map(app, ApplicationBaseView.class)) + public List<ApplicationBaseViewS> getAllActiveApplicationBase() { + return appBaseService.findAllActiveAppsSmall().stream() .map(this::setAppRating) .collect(Collectors.toList()); } @@ -107,6 +117,12 @@ public class ApplicationController extends AppBaseController { return baseView; } + private ApplicationBaseViewS setAppRating(ApplicationBaseViewS baseView) { + Integer[] rating = this.ratingRepository.getApplicationRating(baseView.getId()); + baseView.setRate(this.createAppRateView(rating)); + return baseView; + } + private AppRateView createAppRateView(Integer[] rating) { return new AppRateView( Arrays.stream(rating).mapToInt(Integer::intValue).average().orElse(0.0), @@ -134,8 +150,7 @@ public class ApplicationController extends AppBaseController { @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_TOOL_MANAGER')") @Transactional public void updateApplicationBaseOwner(@PathVariable Long id, @PathVariable String owner, Principal principal) { - // only system admin and owner can update application base - log.info("Upate owner for application {} to {}", id, owner); + log.info("Updating owner of application {} to {}", id, owner); this.applicationBaseOwnerCheck(id, principal); appBaseService.updateOwner(id, owner); } @@ -147,16 +162,24 @@ public class ApplicationController extends AppBaseController { ApplicationBase base = appBaseService.getBaseApp(id); // only system admin and owner can update application base this.applicationBaseOwnerCheck(base.getName(), principal); - ApplicationState state = ApplicationState.DELETED; for (ApplicationVersion appVersion : base.getVersions()) { Application app = getApp(appVersion.getAppVersionId()); - applicationService.changeApplicationState(app, state); - appVersion.setState(state); + if (app.getState() != ApplicationState.DELETED) { + throw new ProcessingException("Can't delete " + base.getName() + " application base since version " + app.getVersion() + " is not deleted"); + } } - + applicationSubscriptionService.unsubscribeAll(base); appBaseService.deleteAppBase(base); } + @GetMapping(value = "/base/name/{name}") + @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_TOOL_MANAGER')") + @Transactional + public ApplicationBaseView getApplicationBase(@PathVariable String name) { + ApplicationBaseView app = modelMapper.map(appBaseService.findByName(name), ApplicationBaseView.class); + return this.setAppRating(app); + } + /* * Application part */ @@ -187,6 +210,25 @@ public class ApplicationController extends AppBaseController { ); } + @GetMapping(value = "/{name}/version/{version}") + @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_TOOL_MANAGER')") + @Transactional + public ApplicationDTO getAppVersionByName(@PathVariable String name,@PathVariable String version) { + ApplicationBase base = this.appBaseService.findByName(name); + + Optional<Application> application = this.applicationService.findApplication(name, version); + + if(application.isPresent()) { + return new ApplicationDTO( + modelMapper.map(base, ApplicationBaseView.class), + modelMapper.map(application.get(), ApplicationView.class) + ); + } else { + throw new MissingElementException("Application " + name + " version " + version + " not found"); + } + + } + @GetMapping(value="/{id}") @Transactional public ApplicationDTO getApplicationDTO(@PathVariable Long id) { @@ -198,13 +240,26 @@ public class ApplicationController extends AppBaseController { ); } - @GetMapping(value="/versions/{id}") + @GetMapping(value = "/base/allversions/{id}") + @Transactional + public ApplicationDTOVersionList getApplicationDTOWithAllVersions(@PathVariable Long id) { + ApplicationBase base = appBaseService.getBaseApp(id); + List<Application> versionList = this.applicationService.findAll().stream() + .filter(app -> app.getName().equalsIgnoreCase(base.getName())) + .collect(Collectors.toList()); + return new ApplicationDTOVersionList( + modelMapper.map(base, ApplicationBaseView.class), + versionList.stream().map(app->modelMapper.map(app, ApplicationView.class)).collect(Collectors.toList()) + ); + } + + @GetMapping(value = "/versions/{id}") @Transactional public Set<ApplicationVersion> getApplicationVersion(@PathVariable Long id) { return this.getVersions(id); } - @GetMapping(value="/version/{id}") + @GetMapping(value = "/version/{id}") @Transactional public ApplicationView getApplication(@PathVariable Long id) { Application app = getApp(id); @@ -268,7 +323,7 @@ public class ApplicationController extends AppBaseController { this.applicationBaseOwnerCheck(view.getName(), principal); // check if id exists - if(view.getId() == null) { + if (view.getId() == null) { log.error("ID is not present in Application update"); throw new ProcessingException("Cannot update application without id"); } @@ -277,12 +332,12 @@ public class ApplicationController extends AppBaseController { Optional<Application> optId = applicationService.findApplication(view.getId()); Optional<Application> optNameVersion = applicationService.findApplication(view.getName(), view.getVersion()); - if(optId.isEmpty() || optNameVersion.isEmpty()) { + if (optId.isEmpty() || optNameVersion.isEmpty()) { log.error("Requested application does not exist"); throw new MissingElementException("Application does not exist"); } - if(!optId.get().equals(optNameVersion.get())) { + if (!optId.get().equals(optNameVersion.get())) { log.error("Retrieved different applications using id and name&version, update aborted"); throw new ProcessingException("You cannot change application name, version and id"); } @@ -318,8 +373,17 @@ public class ApplicationController extends AppBaseController { @PatchMapping(value = "/state/{id}") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") @Transactional - public void changeApplicationState(@PathVariable long id, @RequestBody ApplicationStateChangeRequest stateChangeRequest) { + public void changeApplicationState(@PathVariable long id, @RequestBody ApplicationStateChangeRequest stateChangeRequest, Principal principal) { Application app = getApp(id); + if (stateChangeRequest.getState().equals(ApplicationState.DELETED)) { + long numberOfRunningInstances = applicationInstanceService.findAllByApplication(app).stream() + .map(ai -> appInstanceController.getState(ai.getId(), principal)) + .filter(s -> !List.of(AppInstanceState.DONE, AppInstanceState.FAILURE, AppInstanceState.REMOVED).contains(s.getState())) + .count(); + if (numberOfRunningInstances > 0) { + throw new ProcessingException("Can not set state to DELETED. There is still " + numberOfRunningInstances + " running instances of this version."); + } + } applicationService.changeApplicationState(app, stateChangeRequest.getState()); appBaseService.updateApplicationVersionState(app.getName(), app.getVersion(), stateChangeRequest.getState()); this.sendMails(app, stateChangeRequest); diff --git a/src/main/java/net/geant/nmaas/portal/api/security/JWTSettings.java b/src/main/java/net/geant/nmaas/portal/api/security/JWTSettings.java index 369ef28dd5506e385b1a7d8913783252821de2ff..91fb45463911f1e38a7a566eefa08e25d0879cb1 100644 --- a/src/main/java/net/geant/nmaas/portal/api/security/JWTSettings.java +++ b/src/main/java/net/geant/nmaas/portal/api/security/JWTSettings.java @@ -20,6 +20,9 @@ public class JWTSettings { @Value("${jwt.resetTokenValidFor}") private Long resetTokenExpTime; + + @Value("${jwt.resetTokenRegistrationValid}") + private Long registrationResetTokenExpTime; @Value("${jwt.issuer}") private String issuer; diff --git a/src/main/java/net/geant/nmaas/portal/api/security/JWTTokenService.java b/src/main/java/net/geant/nmaas/portal/api/security/JWTTokenService.java index 508964b624b795722510baecbb76655cd6046878..0a61491828fb7d39fa0b66801d9e96ff04db9275 100644 --- a/src/main/java/net/geant/nmaas/portal/api/security/JWTTokenService.java +++ b/src/main/java/net/geant/nmaas/portal/api/security/JWTTokenService.java @@ -82,6 +82,21 @@ public class JWTTokenService { .signWith(SignatureAlgorithm.HS384, jwtSettings.getResetSigningKey()) .compact(); } + + public String getResetToken24Hours(String email) { + if(email == null || email.isEmpty()) { + throw new IllegalArgumentException("Email cannot be null or empty"); + } + + return Jwts.builder() + .setSubject(email) + .setIssuer(jwtSettings.getIssuer()) + .setId(UUID.randomUUID().toString()) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + jwtSettings.getRegistrationResetTokenExpTime())) + .signWith(SignatureAlgorithm.HS384, jwtSettings.getResetSigningKey()) + .compact(); + } public boolean validateRefreshToken(String token) { try { diff --git a/src/main/java/net/geant/nmaas/portal/persistent/entity/ApplicationBase.java b/src/main/java/net/geant/nmaas/portal/persistent/entity/ApplicationBase.java index be0f31d721f58a922331acb5427eda9971e905fc..98d7dc7f9935cd5f0415f091febe3edb2c618e41 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/entity/ApplicationBase.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/entity/ApplicationBase.java @@ -5,9 +5,21 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; @@ -63,16 +75,23 @@ public class ApplicationBase implements Serializable { @OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL) private Set<ApplicationVersion> versions = new HashSet<>(); - public ApplicationBase(String name){ + public ApplicationBase(String name) { this.name = name; } - public ApplicationBase(Long id, String name){ + public ApplicationBase(Long id, String name) { this(name); this.id = id; } - public void validate(){ + public ApplicationBase(long id, String name, Set<Tag> tags, List<AppDescription> descriptions) { + this(name); + this.id = id; + this.tags = tags; + this.descriptions = descriptions; + } + + public void validate() { checkArgument(StringUtils.isNotEmpty(name), "App must have name"); checkArgument(name.matches("^[a-zA-Z0-9- ]+$"), "Name contains illegal characters"); checkArgument(descriptions != null && !descriptions.isEmpty(), "Descriptions cannot be null or empty"); diff --git a/src/main/java/net/geant/nmaas/portal/persistent/entity/Configuration.java b/src/main/java/net/geant/nmaas/portal/persistent/entity/Configuration.java index ecb0a2f0b0be59d4455dfc9cbd4232e3710254e1..8bce01da1e44e78f5beafed30c2507fea26c349c 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/entity/Configuration.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/entity/Configuration.java @@ -1,6 +1,11 @@ package net.geant.nmaas.portal.persistent.entity; -import lombok.*; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import javax.persistence.Column; import javax.persistence.Entity; @@ -15,42 +20,50 @@ import java.util.List; @Setter @NoArgsConstructor @AllArgsConstructor +@Builder public class Configuration { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Builder.Default @Column(name = "maintenance", nullable = false) private boolean maintenance = false; + @Builder.Default + @Column(nullable = false) private boolean ssoLoginAllowed = false; @Column(nullable = false) private String defaultLanguage; + @Builder.Default @Column(nullable = false) private boolean testInstance = false; + @Builder.Default @Column(nullable = false) private boolean sendAppInstanceFailureEmails = false; + @Builder.Default @Column(nullable = false) @Getter(value = AccessLevel.PRIVATE) @Setter(value = AccessLevel.PRIVATE) private String appInstanceFailureEmails = ""; + @Builder.Default @Column(nullable = false) private boolean registrationDomainSelectionEnabled = true; - public Configuration(boolean maintenance, boolean ssoLoginAllowed, String defaultLanguage, boolean testInstance){ - this.maintenance = maintenance; - this.ssoLoginAllowed = ssoLoginAllowed; - this.defaultLanguage = defaultLanguage; - this.testInstance = testInstance; + @Builder.Default + @Column(nullable = false) + private boolean bulkDomainsAllowForSsoAccounts = true; - } + @Builder.Default + @Column(nullable = false) + private boolean bulkDomainsSendEmailForNewAccounts = true; public void setAppInstanceFailureEmailList(List<String> emails) { this.appInstanceFailureEmails = String.join(";", emails); @@ -67,7 +80,9 @@ public class Configuration { boolean testInstance, boolean sendAppInstanceFailureEmails, List<String> appInstanceFailureEmailList, - boolean registrationDomainSelectionEnabled + boolean registrationDomainSelectionEnabled, + boolean bulkDomainsAllowForSsoAccounts, + boolean bulkDomainsSendEmailForNewAccounts ){ this.maintenance = maintenance; this.ssoLoginAllowed = ssoLoginAllowed; @@ -76,6 +91,8 @@ public class Configuration { this.sendAppInstanceFailureEmails = sendAppInstanceFailureEmails; this.setAppInstanceFailureEmailList(appInstanceFailureEmailList); this.registrationDomainSelectionEnabled = registrationDomainSelectionEnabled; + this.bulkDomainsAllowForSsoAccounts = bulkDomainsAllowForSsoAccounts; + this.bulkDomainsSendEmailForNewAccounts = bulkDomainsSendEmailForNewAccounts; } } diff --git a/src/main/java/net/geant/nmaas/portal/persistent/repositories/ApplicationBaseRepository.java b/src/main/java/net/geant/nmaas/portal/persistent/repositories/ApplicationBaseRepository.java index 144f78c2175371dc7b62a285bc3427133c21f585..f5398bb34523a769b2d28c4ea32363d345fda0e8 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/repositories/ApplicationBaseRepository.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/repositories/ApplicationBaseRepository.java @@ -1,12 +1,16 @@ package net.geant.nmaas.portal.persistent.repositories; -import java.util.List; -import java.util.Optional; +import net.geant.nmaas.portal.api.domain.ApplicationBaseS; +import net.geant.nmaas.portal.persistent.entity.AppDescription; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; +import net.geant.nmaas.portal.persistent.entity.Tag; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + @Repository public interface ApplicationBaseRepository extends JpaRepository<ApplicationBase, Long> { @@ -14,10 +18,19 @@ public interface ApplicationBaseRepository extends JpaRepository<ApplicationBase Optional<ApplicationBase> findByName(String name); - @Query("select distinct ab.name FROM ApplicationBase ab") + @Query("SELECT DISTINCT ab.name FROM ApplicationBase ab") List<String> findAllNames(); - @Query("select count(distinct ab.name) FROM ApplicationBase ab JOIN Application a on a.name = ab.name WHERE a.state = 'ACTIVE'") + @Query("SELECT COUNT(DISTINCT ab.name) FROM ApplicationBase ab JOIN Application a on a.name = ab.name WHERE a.state = 'ACTIVE'") long countAllActive(); + @Query(value = "SELECT DISTINCT(ab.*) FROM application_base ab JOIN application_base_versions abv on abv.application_base_id = ab.id JOIN application_version av ON av.id = abv.versions_id WHERE av.state = 'ACTIVE'", nativeQuery = true) + List<ApplicationBaseS> findAllSmall(); + + @Query("SELECT ab.tags FROM ApplicationBase ab WHERE ab.id =?1") + List<Tag> findAllBaseTag(Long baseId); + + @Query("SELECT ab.descriptions FROM ApplicationBase ab WHERE ab.id =?1") + List<AppDescription> findAllBaseDescription(Long baseId); + } \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/portal/persistent/repositories/TagRepository.java b/src/main/java/net/geant/nmaas/portal/persistent/repositories/TagRepository.java index bce8d0a1a2e93d7e31ded54164f72274de8bf021..3d1c846d8d0a9ca592a6ff7bd51b927e47f98852 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/repositories/TagRepository.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/repositories/TagRepository.java @@ -1,10 +1,10 @@ package net.geant.nmaas.portal.persistent.repositories; -import java.util.Optional; +import net.geant.nmaas.portal.persistent.entity.Tag; import org.springframework.data.jpa.repository.JpaRepository; -import net.geant.nmaas.portal.persistent.entity.Tag; +import java.util.Optional; public interface TagRepository extends JpaRepository<Tag, Long> { - Optional<Tag> findByName(String source); -} + Optional<Tag> findByName(String source); +} \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/portal/service/ApplicationBaseService.java b/src/main/java/net/geant/nmaas/portal/service/ApplicationBaseService.java index 77871894fdc297e27b3e6fe3a5868b975bd1a695..0f6ce93f96b401c9bada376339e903d6556bb9e0 100644 --- a/src/main/java/net/geant/nmaas/portal/service/ApplicationBaseService.java +++ b/src/main/java/net/geant/nmaas/portal/service/ApplicationBaseService.java @@ -1,5 +1,7 @@ package net.geant.nmaas.portal.service; +import net.geant.nmaas.portal.api.domain.ApplicationBaseS; +import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationState; @@ -17,6 +19,8 @@ public interface ApplicationBaseService { List<ApplicationBase> findAll(); List<ApplicationBase> findAllActiveApps(); + List<ApplicationBaseViewS> findAllActiveAppsSmall(); + ApplicationBase getBaseApp(Long id); ApplicationBase findByName(String name); diff --git a/src/main/java/net/geant/nmaas/portal/service/ApplicationSubscriptionService.java b/src/main/java/net/geant/nmaas/portal/service/ApplicationSubscriptionService.java index 84c21051ac68a3a6a379f60faaee4f30414d66c1..ff46338c3901fc0139357715ce8a8bb154bf540c 100644 --- a/src/main/java/net/geant/nmaas/portal/service/ApplicationSubscriptionService.java +++ b/src/main/java/net/geant/nmaas/portal/service/ApplicationSubscriptionService.java @@ -33,6 +33,8 @@ public interface ApplicationSubscriptionService { void unsubscribe(ApplicationSubscription appSub); void unsubscribe(Long applicationId, Long domainId); void unsubscribe(ApplicationBase application, Domain domain); + + void unsubscribeAll(ApplicationBase applicationBase); List<ApplicationBase> getSubscribedApplications(); List<ApplicationBase> getSubscribedApplications(Long domainId); diff --git a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java index bebf1c9f83b47a8ce983904e071a0e7697a01bf3..656dcd11d86a55736201a081bac2c8e88c6d5c13 100644 --- a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java +++ b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java @@ -22,6 +22,8 @@ public interface BulkApplicationService { List<BulkAppDetails> getAppsBulkDetails(BulkDeploymentView view); - InputStreamResource getInputStreamAppBulkDetails(List<BulkAppDetails> list ); + InputStreamResource getInputStreamAppBulkDetails(List<BulkAppDetails> list); + + void deleteAppInstancesFromBulk(BulkDeploymentView bulk); } diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java index 99c33f6a9c286eeb589489bf7496d6efd0bdb500..d752b89635bc0e9cd666c077853de652fd1f0632 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java @@ -2,6 +2,10 @@ package net.geant.nmaas.portal.service.impl; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; +import net.geant.nmaas.portal.api.domain.AppDescriptionView; +import net.geant.nmaas.portal.api.domain.ApplicationBaseS; +import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS; +import net.geant.nmaas.portal.api.domain.TagView; import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.events.ApplicationActivatedEvent; @@ -15,14 +19,19 @@ import net.geant.nmaas.portal.service.ApplicationBaseService; import net.geant.nmaas.portal.service.ApplicationStatePerDomainService; import net.geant.nmaas.portal.service.DomainService; import org.apache.commons.lang3.StringUtils; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.time.LocalDateTime; import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Service @@ -30,12 +39,17 @@ import java.util.stream.Collectors; @Log4j2 public class ApplicationBaseServiceImpl implements ApplicationBaseService { + public static final String DELETED_MARKER = "_DELETED_"; + private final ApplicationBaseRepository appBaseRepository; private final TagRepository tagRepository; private final ApplicationStatePerDomainService applicationStatePerDomainService; private final ApplicationEventPublisher eventPublisher; private final DomainService domainService; + @Autowired + protected ModelMapper modelMapper; + @Override @Transactional public ApplicationBase create(ApplicationBase applicationBase) { @@ -79,7 +93,7 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { throw new ProcessingException("Updated entity id must not be null"); } Optional<ApplicationBase> fromDb = appBaseRepository.findById(id); - if(fromDb.isPresent()) { + if (fromDb.isPresent()) { ApplicationBase base = fromDb.get(); base.setOwner(owner); base.validate(); @@ -91,7 +105,7 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { @Override public void updateApplicationVersionState(String name, String version, ApplicationState state) { - ApplicationBase appBase = findByName(name.contains("_DELETED_") ? name.substring(0, name.indexOf("_DELETED_")) : name); + ApplicationBase appBase = findByName(name.contains(DELETED_MARKER) ? name.substring(0, name.indexOf(DELETED_MARKER)) : name); appBase.getVersions().stream() .filter(appVersion -> appVersion.getVersion().equals(version)) .findAny() @@ -107,7 +121,7 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { public List<ApplicationBase> findAll() { return appBaseRepository.findAll() .stream() - .filter(app -> !app.getName().contains("_DELETED_")) + .filter(app -> !app.getName().contains(DELETED_MARKER)) .collect(Collectors.toList()); } @@ -118,6 +132,23 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { .collect(Collectors.toList()); } + @Override + public List<ApplicationBaseViewS> findAllActiveAppsSmall() { + log.debug("Loading information about all applications"); + LocalDateTime beginning = LocalDateTime.now(); + List<ApplicationBaseS> allSmall = appBaseRepository.findAllSmall(); + LocalDateTime end = LocalDateTime.now(); + log.debug("Loaded base data from db in {}ms", end.toInstant(ZoneOffset.UTC).toEpochMilli() - beginning.toInstant(ZoneOffset.UTC).toEpochMilli()); + List<ApplicationBaseViewS> result = allSmall.stream() + .map(app -> modelMapper.map(app, ApplicationBaseViewS.class)) + .peek(app -> app.setDescriptions(List.of(modelMapper.map(appBaseRepository.findAllBaseDescription(app.getId()), AppDescriptionView[].class)))) + .peek(app -> app.setTags(Set.of(modelMapper.map(appBaseRepository.findAllBaseTag(app.getId()), TagView[].class)))) + .collect(Collectors.toList()); + LocalDateTime finish = LocalDateTime.now(); + log.debug("Complete data is ready after next {}ms", finish.toInstant(ZoneOffset.UTC).toEpochMilli() - end.toInstant(ZoneOffset.UTC).toEpochMilli()); + return result; + } + @Override public ApplicationBase getBaseApp(Long id) { return appBaseRepository.findById(id) @@ -142,7 +173,7 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { @Override public void deleteAppBase(ApplicationBase base) { - base.setName(base.getName() + "_DELETED_" + OffsetDateTime.now()); + base.setName(base.getName() + DELETED_MARKER + OffsetDateTime.now()); appBaseRepository.save(base); domainService.removeAppBaseFromAllDomains(base); } @@ -152,12 +183,12 @@ public class ApplicationBaseServiceImpl implements ApplicationBaseService { .filter(description -> description.getLanguage().equals("en")) .findFirst().orElseThrow(() -> new IllegalStateException("English description is missing")); app.getDescriptions().forEach(description -> { - if (StringUtils.isEmpty(description.getBriefDescription())) { - description.setBriefDescription(appDescription.getBriefDescription()); - } - if (StringUtils.isEmpty(description.getFullDescription())) { - description.setFullDescription(appDescription.getFullDescription()); - } - }); + if (StringUtils.isEmpty(description.getBriefDescription())) { + description.setBriefDescription(appDescription.getBriefDescription()); + } + if (StringUtils.isEmpty(description.getFullDescription())) { + description.setFullDescription(appDescription.getFullDescription()); + } + }); } } diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java index f485ab7570763862c4a3713349648f3da1fa572b..f7bd7b01231603ccc5750c1c855ad5379f98d57e 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java @@ -203,6 +203,12 @@ public class ApplicationSubscriptionServiceImpl implements ApplicationSubscripti unsubscribe(appSub); } + @Override + public void unsubscribeAll(ApplicationBase applicationBase) { + List<ApplicationSubscription> subList = getSubscriptionsBy(null, applicationBase); + subList.forEach(this::unsubscribe); + } + @Override public List<ApplicationBase> getSubscribedApplications() { return getSubscribedApplications(null); diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java index aea95a4edb36d392e16ba3d136942ea7d9b6edef..8efe9388d045dca0ad459e0abb45f42a549db0f0 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java @@ -14,6 +14,7 @@ import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentTriggeredEvent; import net.geant.nmaas.portal.api.bulk.BulkAppDetails; +import net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView; import net.geant.nmaas.portal.api.bulk.BulkDeploymentView; import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; import net.geant.nmaas.portal.api.bulk.BulkType; @@ -21,6 +22,7 @@ import net.geant.nmaas.portal.api.bulk.CsvApplication; import net.geant.nmaas.portal.api.domain.AppInstanceState; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.AppInstance; import net.geant.nmaas.portal.persistent.entity.Application; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; @@ -55,6 +57,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -300,6 +303,24 @@ public class BulkApplicationServiceImpl implements BulkApplicationService { ); } + @Override + public void deleteAppInstancesFromBulk(BulkDeploymentView bulk) { + List<BulkDeploymentEntryView> apps = bulk.getEntries(); + for (BulkDeploymentEntryView app : apps) { + Long appInstanceId = Long.valueOf(findAppDetail(app, BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_ID)); + AppInstance appInstance = instanceService.find(appInstanceId) + .orElseThrow(() -> new ObjectNotFoundException("App instance not found")); + + appLifecycleManager.removeApplication(appInstance.getInternalId()); + instanceService.delete(appInstanceId); + } + } + + private String findAppDetail(BulkDeploymentEntryView app, String key) { + return Optional.ofNullable(app.getDetails().get(key)) + .orElseThrow(() -> new ObjectNotFoundException(key + " not found")); + } + private static BulkDeployment createBulkDeployment(UserViewMinimal creator) { BulkDeployment bulkDeployment = new BulkDeployment(); bulkDeployment.setType(BulkType.APPLICATION); @@ -355,8 +376,8 @@ public class BulkApplicationServiceImpl implements BulkApplicationService { //deploy Map<String, String> params = appDeploymentMonitor.appDeploymentParameters(instance.getInternalId()); - params.forEach( (key, value) -> { - configurationParameters.put(key, Objects.isNull(value) || Objects.equals(value, "") ? EMPTY_VALUE : value.replace("\"", "")); + params.forEach((key, value) -> { + configurationParameters.put(key, Objects.isNull(value) || Objects.equals(value, "") ? EMPTY_VALUE : value.replace("\"", "")); log.debug("Params = {} - {}", key, value); }); diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java index fa775573aec7cd5d929d52faf62e96a279a2deb6..0ee22aea67ba48b9d9c4064679b873c5e5d28392 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java @@ -30,10 +30,8 @@ public class BulkCsvProcessorImpl implements BulkCsvProcessor { public static final String TYPE_CSV = "text/csv"; - private static final List<String> requiredDomainHeader = List.of("domain", "username", "email"); - - private static final List<String> requireApplicationHeader = List.of("domain", "instance", "version"); - + private static final List<String> REQUIRED_DOMAIN_HEADER = List.of("domain", "username", "email"); + private static final List<String> REQUIRED_APPLICATION_HEADER = List.of("domain", "instance", "version"); @Override public List<CsvDomain> processDomainSpecs(MultipartFile file) throws IOException { @@ -54,7 +52,7 @@ public class BulkCsvProcessorImpl implements BulkCsvProcessor { } /** - * Read CSV file and map it to given class type + * Read the CSV file and map it to given class type * * @param file an MultipartFile CSV from controller * @param outputType an CSVClass created for reader of CSV file (used to map fields) @@ -105,7 +103,7 @@ public class BulkCsvProcessorImpl implements BulkCsvProcessor { throw new ProcessingException("CSV headers are empty"); } - if (Arrays.asList(headers).containsAll(requiredDomainHeader) || Arrays.asList(headers).containsAll(requireApplicationHeader)) { + if (Arrays.asList(headers).containsAll(REQUIRED_DOMAIN_HEADER) || Arrays.asList(headers).containsAll(REQUIRED_APPLICATION_HEADER)) { log.debug("Csv headers are correct"); } else { throw new ProcessingException("CSV headers missing required column"); diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java index 026b945604a70f67178957d838c8786466a0d08f..5c931595007185038b5d37254619a2b61a648870 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java @@ -7,7 +7,6 @@ import net.geant.nmaas.dcn.deployment.entities.DcnDeploymentState; import net.geant.nmaas.dcn.deployment.entities.DcnInfo; import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager; import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; -import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.bulk.CsvDomain; import net.geant.nmaas.portal.api.domain.DomainDcnDetailsView; import net.geant.nmaas.portal.api.domain.DomainGroupView; @@ -18,13 +17,13 @@ import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry; -import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.entity.UserRole; import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository; import net.geant.nmaas.portal.persistent.repositories.UserRoleRepository; import net.geant.nmaas.portal.service.BulkDomainService; +import net.geant.nmaas.portal.service.ConfigurationManager; import net.geant.nmaas.portal.service.DomainGroupService; import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.UserService; @@ -48,6 +47,11 @@ import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_EMAIL; import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_ID; import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_NAME; +import static net.geant.nmaas.portal.api.bulk.BulkType.DOMAIN; +import static net.geant.nmaas.portal.api.bulk.BulkType.USER; +import static net.geant.nmaas.portal.persistent.entity.BulkDeploymentState.COMPLETED; +import static net.geant.nmaas.portal.persistent.entity.BulkDeploymentState.FAILED; +import static net.geant.nmaas.portal.persistent.entity.BulkDeploymentState.PENDING; import static net.geant.nmaas.portal.persistent.entity.Role.ROLE_DOMAIN_ADMIN; import static net.geant.nmaas.portal.persistent.entity.Role.ROLE_VL_DOMAIN_ADMIN; @@ -64,6 +68,7 @@ public class BulkDomainServiceImpl implements BulkDomainService { private final ModelMapper modelMapper; private final UserRoleRepository userRoleRepository; + private final ConfigurationManager configurationManager; private final int domainCodenameMaxLength; @@ -75,7 +80,8 @@ public class BulkDomainServiceImpl implements BulkDomainService { KubernetesClusterIngressManager kubernetesClusterIngressManager, ModelMapper modelMapper, UserRoleRepository userRoleRepository, - @Value("${nmaas.portal.domains.codename.length}") int domainCodenameMaxLength) { + @Value("${nmaas.portal.domains.codename.length}") int domainCodenameMaxLength, + ConfigurationManager configurationManager) { this.domainService = domainService; this.domainGroupService = domainGroupService; this.userService = userService; @@ -84,6 +90,7 @@ public class BulkDomainServiceImpl implements BulkDomainService { this.modelMapper = modelMapper; this.domainCodenameMaxLength = domainCodenameMaxLength; this.userRoleRepository = userRoleRepository; + this.configurationManager = configurationManager; } public BulkDeploymentViewS handleBulkCreation(List<CsvDomain> domainSpecs, UserViewMinimal creator) { @@ -97,27 +104,27 @@ public class BulkDomainServiceImpl implements BulkDomainService { // domain groups creation and domain assignment createMissingGroupsAndAssignDomain(domainSpec, domain, creator); // if user exist update role in domain to domain admin - createUserAccountIfNotExists(bulkDeploymentEntries, domainSpec, domain); + createUserAccountIfNotExistsOrUpdateIfRequired(bulkDeploymentEntries, domainSpec, domain); }); bulkDeployment.setEntries(bulkDeploymentEntries); - if (bulkDeploymentEntries.stream().allMatch(entry -> entry.getState().equals(BulkDeploymentState.COMPLETED))) { - bulkDeployment.setState(BulkDeploymentState.COMPLETED); - } else if (bulkDeploymentEntries.stream().anyMatch(entry -> entry.getState().equals(BulkDeploymentState.FAILED))) { - bulkDeployment.setState(BulkDeploymentState.FAILED); + if (bulkDeploymentEntries.stream().allMatch(entry -> entry.getState().equals(COMPLETED))) { + bulkDeployment.setState(COMPLETED); + } else if (bulkDeploymentEntries.stream().anyMatch(entry -> entry.getState().equals(FAILED))) { + bulkDeployment.setState(FAILED); } return modelMapper.map(bulkDeploymentRepository.save(bulkDeployment), BulkDeploymentViewS.class); } private Domain createDomainIfNotExists(List<BulkDeploymentEntry> result, CsvDomain csvDomain) { - log.info("Processing csvDomain {}", csvDomain.getDomainName()); + log.info("Creating {} domain if not yet exists", csvDomain.getDomainName()); Domain domain = null; Optional<Domain> domainFromDb = domainService.findDomain(csvDomain.getDomainName()); if (domainFromDb.isPresent()) { domain = domainFromDb.get(); result.add(BulkDeploymentEntry.builder() - .type(BulkType.DOMAIN) - .state(BulkDeploymentState.COMPLETED) + .type(DOMAIN) + .state(COMPLETED) .created(false) .details(prepareBulkDomainDeploymentDetailsMap(domain)).build() ); @@ -146,8 +153,8 @@ public class BulkDomainServiceImpl implements BulkDomainService { domain = domainService.createDomain(domainRequest); domainService.storeDcnInfo(prepareDcnInfo(domain)); result.add(BulkDeploymentEntry.builder() - .type(BulkType.DOMAIN) - .state(BulkDeploymentState.COMPLETED) + .type(DOMAIN) + .state(COMPLETED) .created(true) .details(prepareBulkDomainDeploymentDetailsMap(domain)).build() ); @@ -205,25 +212,36 @@ public class BulkDomainServiceImpl implements BulkDomainService { }); } - private void createUserAccountIfNotExists(List<BulkDeploymentEntry> result, CsvDomain csvDomain, Domain domain) { + private void createUserAccountIfNotExistsOrUpdateIfRequired(List<BulkDeploymentEntry> result, CsvDomain csvDomain, Domain domain) { if (userService.existsByUsername(csvDomain.getAdminUserName()) || userService.existsByEmail(csvDomain.getEmail())) { log.info("User {} with email {} already exists in database", csvDomain.getAdminUserName(), csvDomain.getEmail()); User user = userService.findByUsername(csvDomain.getAdminUserName()).orElseGet(() -> userService.findByEmail(csvDomain.getEmail())); + boolean userUpdateRequired = false; if (!userService.hasPrivilege(user, domain, ROLE_DOMAIN_ADMIN)) { user.setNewRoles(ImmutableSet.of(new UserRole(user, domain, ROLE_DOMAIN_ADMIN))); + userUpdateRequired = true; + } + if (configurationManager.getConfiguration().isBulkDomainsAllowForSsoAccounts()) { + if (csvDomain.getSsoEnabled() != null && csvDomain.getSsoEnabled()) { + if (StringUtils.isEmpty(user.getSamlToken())) { + user.setSamlToken(csvDomain.getEmail()); + } + } + } + if (userUpdateRequired) { userService.update(user); } - result.add(BulkDeploymentEntry.builder().type(BulkType.USER).state(BulkDeploymentState.COMPLETED).created(false).details(prepareBulkUserCreationDetailsMap(user)).build()); + result.add(BulkDeploymentEntry.builder().type(USER).state(COMPLETED).created(false).details(prepareBulkUserCreationDetailsMap(user)).build()); } else { User user = userService.registerBulk(csvDomain, domainService.getGlobalDomain().orElseThrow(), domain); - result.add(BulkDeploymentEntry.builder().type(BulkType.USER).state(BulkDeploymentState.COMPLETED).created(true).details(prepareBulkUserCreationDetailsMap(user)).build()); + result.add(BulkDeploymentEntry.builder().type(USER).state(COMPLETED).created(true).details(prepareBulkUserCreationDetailsMap(user)).build()); } } private static BulkDeployment createBulkDeployment(UserViewMinimal creator) { BulkDeployment bulkDeployment = new BulkDeployment(); - bulkDeployment.setType(BulkType.DOMAIN); - bulkDeployment.setState(BulkDeploymentState.PENDING); + bulkDeployment.setType(DOMAIN); + bulkDeployment.setState(PENDING); bulkDeployment.setCreatorId(creator.getId()); bulkDeployment.setCreationDate(OffsetDateTime.now()); return bulkDeployment; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java index 6894ae5a00dbd523c7d0e3c608f2d0e9a8f8cf0e..7f4ff1affeaf543bb54bc73e8a3b8ddfc255a8c4 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java @@ -534,7 +534,10 @@ public class DomainServiceImpl implements DomainService { @Override public void removeAppBaseFromAllDomains(ApplicationBase base) { - getDomains().forEach(domain -> removeFromDomain(base, domain)); + getDomains().forEach(domain -> { + removeFromDomain(base, domain); + + }); } private void removeFromDomain(ApplicationBase base, Domain domain) { diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java index 394cc96565317828b5b91a5da235519409fd7b6d..ff1163577c1eaf0ace3e92a8fcd47222ed5673df 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java @@ -1,8 +1,13 @@ package net.geant.nmaas.portal.service.impl; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.log4j.Log4j2; +import net.geant.nmaas.notifications.MailAttributes; +import net.geant.nmaas.notifications.NotificationEvent; +import net.geant.nmaas.notifications.templates.MailType; import net.geant.nmaas.portal.api.auth.Registration; import net.geant.nmaas.portal.api.auth.UserSSOLogin; import net.geant.nmaas.portal.api.bulk.CsvDomain; @@ -10,6 +15,7 @@ import net.geant.nmaas.portal.api.domain.UserView; import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; @@ -20,6 +26,8 @@ import net.geant.nmaas.portal.service.ConfigurationManager; import net.geant.nmaas.portal.service.UserService; import org.apache.commons.lang3.RandomStringUtils; import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -48,6 +56,13 @@ public class UserServiceImpl implements UserService { private final ConfigurationManager configurationManager; private final ModelMapper modelMapper; + private final ApplicationEventPublisher eventPublisher; + private final JWTTokenService jwtTokenService; + + @Value("${portal.address}") + @Setter + private String portalAddress; + @Override public boolean hasPrivilege(User user, Domain domain, Role role) { if (user == null || domain == null || role == null) { @@ -153,14 +168,14 @@ public class UserServiceImpl implements UserService { } @Override - public User registerBulk(CsvDomain userCSV, Domain globalDomain, Domain domain) { - if (userRepository.existsByUsername(userCSV.getAdminUserName()) || userRepository.existsByEmail(userCSV.getEmail())) { + public User registerBulk(CsvDomain csvUser, Domain globalDomain, Domain domain) { + if (userRepository.existsByUsername(csvUser.getAdminUserName()) || userRepository.existsByEmail(csvUser.getEmail())) { throw new SignupException("User already exists"); } String temporaryPassword = RandomStringUtils.random(16); - log.info("Creating user {} with temporary password", userCSV.getAdminUserName()); - User newUser = new User(userCSV.getAdminUserName(), false, passwordEncoder.encode(temporaryPassword), globalDomain, Role.ROLE_GUEST); - newUser.setEmail(userCSV.getEmail()); + log.info("Creating user {} with temporary password", csvUser.getAdminUserName()); + User newUser = new User(csvUser.getAdminUserName(), false, passwordEncoder.encode(temporaryPassword), globalDomain, Role.ROLE_GUEST); + newUser.setEmail(csvUser.getEmail()); newUser.setEnabled(true); newUser.setSelectedLanguage(configurationManager.getConfiguration().getDefaultLanguage()); newUser.setTermsOfUseAccepted(true); @@ -168,6 +183,18 @@ public class UserServiceImpl implements UserService { if (domain != null) { newUser.setNewRoles(ImmutableSet.of(new UserRole(newUser, domain, ROLE_DOMAIN_ADMIN))); } + boolean sendMails = configurationManager.getConfiguration().isBulkDomainsSendEmailForNewAccounts(); + // set user saml_token to email address if a sso account requested + if (configurationManager.getConfiguration().isBulkDomainsAllowForSsoAccounts()) { + if (csvUser.getSsoEnabled() != null && csvUser.getSsoEnabled()) { + newUser.setSamlToken(csvUser.getEmail()); + if(sendMails) this.sendMail(newUser, MailType.NEW_BULK_SSO_LOGIN); + }else { + if(sendMails) this.sendMail(newUser, MailType.NEW_BULK_LOGIN); + } + } else { + if(sendMails) this.sendMail(newUser, MailType.NEW_BULK_LOGIN); + } userRepository.save(newUser); return newUser; } @@ -176,10 +203,9 @@ public class UserServiceImpl implements UserService { public void update(User user) { checkParam(user); checkParam(user.getId()); - - if(!userRepository.existsById(user.getId())) - throw new ProcessingException("User (id=" + user.getId() + " does not exists."); - + if (!userRepository.existsById(user.getId())) { + throw new ProcessingException("User with id " + user.getId() + " does not exist"); + } userRepository.saveAndFlush(user); } @@ -187,14 +213,12 @@ public class UserServiceImpl implements UserService { public void delete(User user) { checkParam(user); checkParam(user.getId()); - userRepository.delete(user); } @Override public void deleteById(Long userId) { checkParam(userId); - userRepository.deleteById(userId); } @@ -266,4 +290,37 @@ public class UserServiceImpl implements UserService { .map(user -> modelMapper.map(user, UserView.class)) .collect(Collectors.toList()); } + + private void sendMail(User user, MailType mailType) { + ImmutableMap<String, Object> map; + if(mailType == MailType.NEW_BULK_LOGIN) { + map = ImmutableMap.<String, Object>builder() + .put("username", user.getUsername()) + .put("email", user.getEmail()) + .put("accessURL", generateResetPasswordUrl(this.jwtTokenService.getResetToken24Hours(user.getEmail()))) + .build(); + } else { + map = ImmutableMap.<String, Object>builder() + .put("username", user.getUsername()) + .put("email", user.getEmail()) + .put("portal", this.portalAddress) + .build(); + } + MailAttributes mailAttributes = MailAttributes.builder() + .otherAttributes(map) + .mailType(mailType) + .build(); + this.eventPublisher.publishEvent(new NotificationEvent(this, mailAttributes)); + } + + private String generateResetPasswordUrl(String token) { + String url = this.portalAddress; + if(url == null) { + return "reset/" + token; + } + if (!url.endsWith("/")) { + url += "/"; + } + return url + "reset/" + token; + } } diff --git a/src/main/java/net/geant/nmaas/utils/ssh/SingleCommandExecutor.java b/src/main/java/net/geant/nmaas/utils/ssh/SingleCommandExecutor.java index 572555008d04b88e7102edffb34cd89320840640..0a2603ca272acc5bdee6f81a9827dbb691ab696a 100644 --- a/src/main/java/net/geant/nmaas/utils/ssh/SingleCommandExecutor.java +++ b/src/main/java/net/geant/nmaas/utils/ssh/SingleCommandExecutor.java @@ -49,6 +49,7 @@ public class SingleCommandExecutor { } public void executeSingleCommand(Command command) { + log.error("command : {}", command.asString()); executeCommand(command); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d0443044c27c1f25cf0d1b2619b1970f277df34c..de4403d1a67604ae782edb6f2c8a0032f6b84084 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ # --------------- # # Active profiles # # --------------- # -# profiles are used to customise platform operations in following areas +# profiles are used to customise platform operations in the following areas # - container orchestrator (options: env_kubernetes) # - database (options: db_memory, db_standalone) spring.profiles.active=env_kubernetes, db_memory @@ -74,7 +74,7 @@ spring.flyway.out-of-order=true spring.flyway.enabled=false # -------------------------------------------------------- # -# NMaaS application deployment and configuration processes # +# nmaas application deployment and configuration processes # # -------------------------------------------------------- # nmaas.service.deployment.check.interval=10 nmaas.service.deployment.max.duration=120 @@ -106,13 +106,14 @@ spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl # ----- # # Other # # ----- # -upload.dir=/tmp +upload.dir=./src/test/shell/tmp/ jwt.tokenValidFor=3600000 jwt.refreshTokenValidFor=13600000 -jwt.issuer=NMaaS +jwt.issuer=nmaas jwt.signingKey=testKey jwt.resetSigningKey=testResetKey jwt.resetTokenValidFor=1800000 +jwt.resetTokenRegistrationValid=86400000 captcha.secret=6LeJgbQUAAAAAIGNksMVgPqiGbdPrYKjXAeeFa5e # current pagination issue fix -> set default page size to 1000 # this is still a temporary fix @@ -129,7 +130,7 @@ sso.key=sso_shared_secret_key # ------------------ # # Helm configuration # # ------------------ # -helm.update.async.enabled=false +helm.update.async.enabled=true helm.update.async.cron=0 * * * * ? helm.address=10.134.241.6 helm.username=nmaas @@ -138,7 +139,7 @@ helm.repositoryName=nmaas-test helm.repositoryUrl=https://nmaas-test.helm.repository helm.chartsDirectory=/home/nmaas/charts helm.enableTls=false -# possible values for Helm version are v2 and v3 (if none is provided v3 is used by default) +# possible values for the Helm version are v2 and v3 (if none is provided v3 is used by default) helm.version=v2 # --------------------- # @@ -150,8 +151,7 @@ janitor.port=5000 # -------------------- # # GitLab configuration # # -------------------- # -gitlab.address=nmaas-gitlab-unicorn -gitlab.port=8080 +gitlab.apiUrl=http://nmaas-gitlab-unicorn:8080 gitlab.token=test_gitlab_token # ------------------------ # @@ -176,8 +176,9 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerPassword= +kubernetes.deployment.smtpFromDefaultDomain= kubernetes.deployment.defaultStorageClass=storageClass - +kubernetes.deployment.smtpFromDefaultDomain # -------------------- # # Portal configuration # # -------------------- # @@ -187,5 +188,5 @@ portal.config.defaultLanguage=en portal.config.testInstance=false portal.config.sendAppInstanceFailureEmails=false portal.config.showDomainRegistrationSelector=true -# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +# string - list of emails with ':' as a separator, e.g., admin1@nmaas.eu;admin2@nmaas.eu portal.config.appInstanceFailureEmailList=admin@nmaas.eu diff --git a/src/main/resources/aup.txt b/src/main/resources/aup.txt index e3d7059424c147c7c2536bb40fed35e9e531d59c..9349bb15fe603a804d45e56fc60327b9a976eaf0 100644 --- a/src/main/resources/aup.txt +++ b/src/main/resources/aup.txt @@ -1,46 +1,3 @@ -<h3>Acceptable Use Policy for NMaaS Service</h3> -<p>Network Management as a Service (<a href="https://www.geant.org/NMaaS">NMaaS</a>) provides a portfolio of network management applications run on a per-user, secured network monitoring infrastructure (“NMaaS” or “Service”).</p> +<h3><strong>Acceptable Use Policy</strong></h3> -<ol> - <li><strong>Authorized Use:</strong> - <ul> - <li>NMaaS is for authorized users to manage and monitor network infrastructure.</li> - </ul> - </li> - <li><strong>Prohibited Activities:</strong> - <ul> - <li>Unauthorized access, illegal activities, data manipulation, and distribution of malicious software are strictly prohibited.</li> - </ul> - </li> - <li><strong>Data Protection:</strong> - <ul> - <li>Users must safeguard data confidentiality and integrity, refraining from sharing login credentials.</li> - </ul> - </li> - <li><strong>Resource Conservation:</strong> - <ul> - <li>Users must use NMaaS resources responsibly to avoid impacting performance or availability.</li> - </ul> - </li> - <li><strong>Reporting Violations:</strong> - <ul> - <li>Users must promptly report suspected violations to the NMaaS administrator or support team.</li> - </ul> - </li> - <li><strong>Consequences of Violation:</strong> - <ul> - <li>Violations may lead to disciplinary action or legal consequences.</li> - </ul> - </li> - <li><strong>Policy Review:</strong> - <ul> - <li>This Policy may be updated periodically, with users notified of any changes.</li> - </ul> - </li> -</ol> - -<p>By using NMaaS, users agree to abide by this Policy.</p> - -<p>GÉANT reserves the right to enforce this Policy at its discretion.</p> - -<p>Last Revision: [Insert Date]</p> \ No newline at end of file +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt index 9f2a80f7792409c9b8aa6f30b11bccba66786b30..c51899066a325ffd5ff9cbdd084bde36b8cd1800 100644 --- a/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -1,7 +1,7 @@ -------------------------------------------------------- -[ NMaaS ] +[ nmaas ] -(c) 2023 GÉANT +(c) 2024 GÉANT -------------------------------------------------------- diff --git a/src/main/resources/changelog.json b/src/main/resources/changelog.json index 6936db4cc890c4291d00741056c6306ec7b72b71..b46ad9eecc2904e3d08302f32f517ed8a6ec6298 100644 --- a/src/main/resources/changelog.json +++ b/src/main/resources/changelog.json @@ -1,5 +1,68 @@ { "versions" : [ + { + "verNo" : "1.6.3", + "date" : "(2024/09/05)", + "topic" : [ + { + "title" : "New layout for the portal landing pages", + "tags" : "[Enhancement]", + "description" : "New landing pages can be customized to reflect the purpose of given nmaas deployment" + }, + { + "title" : "Support for SSO accounts provisioned ahead of time", + "tags" : "[Enhancement]", + "description" : "Bulk user deployment process was enhanced with an option to indicate that given user account should allow for SSO login" + }, + { + "title" : "New email notifications for user accounts created in bulk", + "tags" : "[Enhancement]", + "description" : "New users with accounts created in bulk process will receive customized email messages with instructions on first login" + }, + { + "title" : "Fixed issue with selection of application version for manual upgrade", + "tags" : "[Bugfix]", + "description" : "Fix was applied to drop down version selector on manual application instance version upgrade modal" + } + ] + }, + { + "verNo" : "1.6.2", + "date" : "(2024/07/19)", + "topic" : [ + { + "title" : "Fixed issue with displaying user details view", + "tags" : "[Bugfix]", + "description" : "Fix was applied to password handling component affecting few views." + }, + { + "title" : "Support for external GitLab instances", + "tags" : "[Enhancement]", + "description" : "Allowed for connecting to external GitLab instances running outside of the local cluster." + }, + { + "title" : "Enhanced application specification export option", + "tags" : "[Enhancement]", + "description" : "Application spec export JSON files now contain more relevant data." + } + ] + }, + { + "verNo" : "1.6.1", + "date" : "(2024/05/22)", + "topic" : [ + { + "title" : "Fixed loading GitLab repository information for application instances", + "tags" : "[Bugfix]", + "description" : "Applied fix in the Janitor component related with querying for projects in given group." + }, + { + "title" : "Multiple minor enhancements and fixes", + "tags" : "[Enhancement]", + "description" : "Addressed multiple issues on both back-end and front-end." + } + ] + }, { "verNo" : "1.6.0", "date" : "(2024/03/12)", @@ -132,7 +195,7 @@ { "title" : "REST API documentation endpoint", "tags" : "[New Feature]", - "description" : "Enabled Swagger and OpenAPI specification endpoints to document NMaaS Platform API." + "description" : "Enabled Swagger and OpenAPI specification endpoints to document nmaas Platform API." } ] }, @@ -157,9 +220,9 @@ "description" : "Added possibility to set users as application owners with specific set of permissions within the Portal." }, { - "title" : "Support for local NMaaS deployments", + "title" : "Support for local nmaas deployments", "tags" : "[Enhancement]", - "description" : "Added set of improvements to support local NMaaS deployments." + "description" : "Added set of improvements to support local nmaas deployments." }, { "title" : "Advanced support for specifying Helm chart repositories", @@ -220,7 +283,7 @@ "description" : "Introduced multiple enhancements to the user administrator view." }, { - "title" : "Enhanced NMaaS configuration process", + "title" : "Enhanced nmaas configuration process", "tags" : "[Enhancement]", "description" : "Refactored Platform source code in order to load additional configuration parameters from properties file." } @@ -316,7 +379,7 @@ { "title" : "Added support for advanced configuration using Git repository", "tags" : "[New Feature]", - "description" : "Enhanced both the NMaaS core components and Janitor to allow for creation of multiple ConfigMaps based on the content of Git repository of a given application instance." + "description" : "Enhanced both the nmaas core components and Janitor to allow for creation of multiple ConfigMaps based on the content of Git repository of a given application instance." }, { "title" : "Added missing SSH key notification", @@ -421,7 +484,7 @@ { "title" : "Janitor able to retrieve service IP address from K8s API", "tags" : "[New Feature]", - "description" : "NMaaS Janitor component is able to retrieve particular service IP address assigned by the MetalLB load balancer." + "description" : "nmaas Janitor component is able to retrieve particular service IP address assigned by the MetalLB load balancer." }, { "title" : "Enhanced user management", @@ -494,9 +557,9 @@ "description" : "Application instances deployed with release names allowing for easy identification." }, { - "title" : "Ability to mark NMaaS installation as a test instance", + "title" : "Ability to mark nmaas installation as a test instance", "tags" : "[Enhancement]", - "description" : "When user logs in on a test NMaaS instance a popup window is deployed with appropriate information." + "description" : "When user logs in on a test nmaas instance a popup window is deployed with appropriate information." } ] }, @@ -507,7 +570,7 @@ { "title" : "Application management added", "tags" : "[New Feature]", - "description" : "New functionality and dedicated view in the UI allows for adding and maintaining information about NMaaS applications." + "description" : "New functionality and dedicated view in the UI allows for adding and maintaining information about nmaas applications." }, { "title" : "Language management added", @@ -517,7 +580,7 @@ { "title" : "About page added", "tags" : "[New Feature]", - "description" : "Added dedicated About page with information about current and previous versions of NMaaS and a contact form." + "description" : "Added dedicated About page with information about current and previous versions of nmaas and a contact form." }, { "title" : "Extended nmaas-janitor to use readiness probes", @@ -556,14 +619,14 @@ "description" : "New library offers many interesting features and is actively developed." }, { - "title" : "Implemented new version of the NMaaS notification service", + "title" : "Implemented new version of the nmaas notification service", "tags" : "[Enhancement]", "description" : "The nmaas-notification component is no longer used. Email templates have been improved." }, { "title" : "Implemented new application view", "tags" : "[Enhancement]", - "description" : "New version of application view and rating system added to NMaaS." + "description" : "New version of application view and rating system added to nmaas." }, { "title": "During deployment of Prometheus application, user cannot remove added targets", @@ -584,12 +647,12 @@ { "title" : "Support for Docker Compose and Kubernetes deployment environments", "tags" : "[New Feature]", - "description" : "NMaaS supports deployment of applications in two container orchestration environments." + "description" : "nmaas supports deployment of applications in two container orchestration environments." }, { "title" : "Support for 6 network management applications", "tags" : "[New Feature]", - "description" : "Six network management applications were integrated and added to NMaaS portfolio." + "description" : "Six network management applications were integrated and added to nmaas portfolio." }, { "title" : "Support for configuration files storage on GitLab repository", diff --git a/src/main/resources/db/migration/common/V1.6.3_20240822_1545__addConfigurationParameters.sql b/src/main/resources/db/migration/common/V1.6.3_20240822_1545__addConfigurationParameters.sql new file mode 100644 index 0000000000000000000000000000000000000000..650ea0689b9d8525a8c3758a93eb454941f6806a --- /dev/null +++ b/src/main/resources/db/migration/common/V1.6.3_20240822_1545__addConfigurationParameters.sql @@ -0,0 +1,2 @@ +ALTER TABLE configuration ADD COLUMN bulk_domains_allow_for_sso_accounts boolean DEFAULT TRUE; +ALTER TABLE configuration ADD COLUMN bulk_domains_send_email_for_new_accounts boolean DEFAULT TRUE; \ No newline at end of file diff --git a/src/main/resources/privacy.txt b/src/main/resources/privacy.txt index 7bc31aff9f457d8f1ba2ee60412c512b5d5267fe..eb6ce1b04cf3ec03a128c3d82535cd6ca165c68a 100644 --- a/src/main/resources/privacy.txt +++ b/src/main/resources/privacy.txt @@ -1,108 +1,3 @@ -<h2><strong>NMaaS Privacy Notice</strong></h2> -<h4><strong>Description of the NMaaS Service</strong></h4> -<p><a href="https://www.geant.org/NMaaS" target="_blank">Network Management as a Service (NMaaS)</a> provides a -portfolio of network management applications run on a per-user, secured network monitoring infrastructure. </p> -<p>NMaaS simplifies domain network management by providing the infrastructure and tools via a cloud-based, -multi-tenant and secure network management system. It enables the deployment of network management tools, -as well as management and monitoring of client networks, although NMaaS does not monitor and manage the network by -itself. </p> -<p>To view the general Privacy Notice for GÉANT, please visit the <a href="https://www.geant.org/privacy-notice" -target="_blank">GÉANT website</a>.</p> -<br> -<h4><strong>Why We Process Personal Data</strong></h4> -<p>NMaaS processes personal data: <ul> -<li>to fulfill the service and user support processes; </li> -<li>for user authentication and authorization purposes; </li> -<li>for personalized notification purposes (email communication enabling the change of password, -email notification about events in the system relevant for user operations, e.g. deployed applications and -email notification about general events in the system, e.g. planned downtime, maintenance); </li> -<li>to monitor the use of the NMaaS service for security purposes; </li> -<li>to monitor the use of the NMaaS service for improved resource and performance optimizations; </li> -<li>to track personal data related events (new user registration, user data update and role assignment or revocation). -</li> -</ul></p> -<br> -<h4><strong>What Personal Data We Process</strong></h4> -<p>NMaaS user data is stored in a central relational database and application log files.</br> -The database contains the following user personal data:<ul> -<li><strong>username</strong>, </li> -<li><strong>user identifier</strong> – unique identifier assigned internally by NMaaS, </li> -<li><strong>user IdP identifier</strong> – unique identifier assigned by the Identity Provided used by the user to log in to the -NMaaS Portal (applicable if eduGAIN log in option is used), </li> -<li><strong>password</strong> – user password used to log in to the NMaaS Portal (applicable if user account is being registered -directly in NMaaS), </li> -<li><strong>first name</strong> (optional), </li> -<li><strong>last name</strong> (optional), </li> -<li><strong>email address</strong>. </li></ul></p> -<p>The service log files contain the following user personal data:<ul> -<li><strong>username</strong>, </li> -<li><strong>user identifier</strong>, </li> -<li><strong>first name</strong>, </li> -<li><strong>last name</strong>, </li> -<li><strong>email address</strong>, </li> -<li><strong>IP address</strong> (from which user logged into the NMaaS Portal). </li></ul></p> +<h2><strong>Privacy Notice</strong></h2> -<p>The purpose of NMaaS is to facilitate automated deployment of network management and monitoring applications. -It should be noted that the data collected and stored by particular applications deployed through NMaaS is neither -controlled nor processed by NMaaS service and the NMaaS Operational Team however it might contain user personal data. -NMaaS does not take any responsibility for the data being collected and stored by those applications. </p> -<p>During the application deployment process NMaaS provides a configuration wizard functionality to ease the initial -setup of the application. Wizard prompts the user to provide different type of data about the equipment to be managed -depending on the application being deployed and this data may include for example device access credentials. It should -be noted that it is not advised to provide in the wizard any user personal data and use generic device access accounts -if possible. NMaaS does not take any responsibility for the data being provided by the user in the wizard. </p> -<br> -<h4><strong>Who Do We Share Data With?</strong></h4> -<p>Personal data persisted in the database and in the log files is processed according to the clearly defined goals -by the NMaaS service Operational Team and is not shared with any third party. </p> -<br> -<h4><strong>Personal Data Retention</strong></h4> -<p>NMaaS user personal data is retained in the database for the period in which particular user uses the service. -Since the moment of reception of user account removal request the data is still kept in the database for a period of -6 months after which it is removed. </p> -<p>Log files are retained for a period of 180 days. </p> -<br> -<h4><strong>Security</strong></h4> -<p>We support the following processes to ensure the security of your personal data: -<ul> -<li>Minimisation of personal data we collect;</li> -<li>Managing, limiting and controlling access to personal data;</li> -<li>Resilience of processing systems and services;</li> -<li>Regular testing of the effectiveness of measures implemented. </li></ul></p><br> -<h4 ><strong>Your Rights</strong></h4> -<p>While we process your personal data, we ensure that:<ul> -<li>We process your data fairly and lawfully;</li> -<li>Your data is accurate;</li> -<li>The data we collect is not excessive but only the data we require to provide the service;</li> -<li>Your data is secure;</li> -<li>Your personal data is securely destroyed when no longer required</li></ul></p> -<p>You have the right to ask what personal data we hold about you, and to complain to the Supervisory Authority -(Autoriteit Persoonsgegevens at <a href="https://autoriteitpersoonsgegevens.nl" target="_blank"> -https://autoriteitpersoonsgegevens.nl</a>) about our data processing activities if you feel your data is not -being managed as described here. </p> -<br> -<h4><strong>Contact Information</strong></h4> -<br> -<table class="table table-responsive"> - <tr> - <td><p><strong style="vertical-align: middle">Data Controller and Contact</strong><br></td> - <td> - <strong>Data Protection Officer</strong><br> - GÉANT Association<br> - Hoekenrode 3<br> - 1102 BR<br> - Amsterdam – Zuidoost<br> - Netherlands<br> - Telephone number: +31 20 530 4488<br> - email: <a href="mailto:gdpr@geant.org">gdpr@geant.org</a></p> - </td> - </tr> - <tr> - <td><p><strong style="vertical-align: middle">Jurisdiction</strong><br></td> - <td><strong>Netherlands</strong><br> - Dutch Data Protection Authority <br> - Autoriteit Persoonsgegevens<br> - Postbus 93374 2509 AJ DEN HAAG.<br> - Telephone number: (+31) – (0)70 – 888 85 00. <br></p></td> - </tr> -</table> \ No newline at end of file +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/src/test/java/net/geant/nmaas/externalservices/gitlab/GitLabManagerTest.java b/src/test/java/net/geant/nmaas/externalservices/gitlab/GitLabManagerTest.java index 87508027859755e52512538a480d677a114e970b..3e5b4b890dbdd031192def8404a6710a03681b18 100644 --- a/src/test/java/net/geant/nmaas/externalservices/gitlab/GitLabManagerTest.java +++ b/src/test/java/net/geant/nmaas/externalservices/gitlab/GitLabManagerTest.java @@ -1,33 +1,43 @@ package net.geant.nmaas.externalservices.gitlab; import net.geant.nmaas.externalservices.gitlab.exceptions.GitLabInvalidConfigurationException; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; public class GitLabManagerTest { private GitLabManager manager; + @BeforeEach + void setup() { + manager = new GitLabManager(); + } + @Test void shouldValidateGitLabInstance() { - manager = new GitLabManager(); Exception thrown; - thrown = assertThrows(IllegalArgumentException.class, () -> manager.validateGitLabInstance()); - assertTrue(thrown.getMessage().contains("GitLab address is null or empty")); - - manager.setGitLabAddress("localhost"); - thrown = assertThrows(IllegalArgumentException.class, () -> manager.validateGitLabInstance()); - assertTrue(thrown.getMessage().contains("GitLab port is null")); + thrown = assertThrows(IllegalArgumentException.class, manager::validateGitLabInstance); + assertTrue(thrown.getMessage().contains("GitLab api URL is null or empty")); - manager.setGitLabPort(8080); - thrown = assertThrows(IllegalArgumentException.class, () -> manager.validateGitLabInstance()); - assertTrue(thrown.getMessage().contains("GitLab token is null or empty")); + manager.setGitLabApiUrl("http://localhost:8080"); + thrown = assertThrows(IllegalArgumentException.class, manager::validateGitLabInstance); + assertThat(thrown.getMessage()).contains("GitLab token is null or empty"); manager.setGitLabToken("token"); - assertThrows(GitLabInvalidConfigurationException.class, () -> manager.validateGitLabInstance()); + assertThrows(GitLabInvalidConfigurationException.class, manager::validateGitLabInstance); + } + + @Test + void shouldPrepareApiBaseUrl() { + manager.setGitLabApiUrl("http://localhost:8080"); + assertEquals("http://localhost:8080", manager.getApiUrl()); + + manager.setGitLabApiUrl("http://localhost:8080/api/v4"); + assertEquals("http://localhost:8080", manager.getApiUrl()); } } diff --git a/src/test/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandlerTest.java b/src/test/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandlerTest.java index 13e2796521e34dbba0988c556cb9724b7a25de45..aaa8d4661a966fad4e81c43cf9ca4874a87e4ebb 100644 --- a/src/test/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandlerTest.java +++ b/src/test/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabConfigHandlerTest.java @@ -47,8 +47,7 @@ public class GitLabConfigHandlerTest { Project project = mock(Project.class); when(projectApi.getProject(anyInt())).thenReturn(project); when(project.getHttpUrlToRepo()).thenReturn("http://example.gitlab.com/group/project.git"); - when(gitLabManager.getGitlabServer()).thenReturn("test-server"); - when(gitLabManager.getGitlabPort()).thenReturn(80); + when(gitLabManager.getGitLabApiUrl()).thenReturn("http://test-server:80"); when(gitLabManager.projects()).thenReturn(projectApi); String result = handler.getHttpUrlToRepo(1); diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java index 8f5d0c27cdb8fe2503db9fb37383678d34243631..9434198c58f31469869abf2ce18f53a91120c4d5 100644 --- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java +++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java @@ -91,6 +91,8 @@ public class KubernetesManagerTest { parametersMap.put(ParameterType.SMTP_PORT.name(), "5"); parametersMap.put(ParameterType.SMTP_USERNAME.name(), "username"); parametersMap.put(ParameterType.SMTP_PASSWORD.name(), "password"); + parametersMap.put(ParameterType.SMTP_HOST_WITH_PORT.name(), "host:port"); + parametersMap.put(ParameterType.SMTP_FROM_DEFAULT_DOMAIN.name(), "@fromdomain"); parametersMap.put(ParameterType.BASE_URL.name(), "extBaseUrl"); parametersMap.put(ParameterType.DOMAIN_CODENAME.name(), "domain"); parametersMap.put(ParameterType.RELEASE_NAME.name(), "descriptiveDeploymentId"); @@ -137,6 +139,13 @@ public class KubernetesManagerTest { Map<HelmChartIngressVariable, String> sshAccessDeploymentParameters = new HashMap<>(); sshAccessDeploymentParameters.put(HelmChartIngressVariable.K8S_SERVICE_PORT, "22"); accessMethods.add(new ServiceAccessMethod(ServiceAccessMethodType.INTERNAL, "ssh-service-with-port", null, "SSH", sshAccessDeploymentParameters)); + Map<HelmChartIngressVariable, String> sshAccessUserDeploymentParameters = new HashMap<>(); + sshAccessUserDeploymentParameters.put(HelmChartIngressVariable.ACCESS_USER, "testUser"); + accessMethods.add(new ServiceAccessMethod(ServiceAccessMethodType.INTERNAL, "ssh-service-with-access-user", null, "SSH", sshAccessUserDeploymentParameters)); + accessMethods.add(new ServiceAccessMethod(ServiceAccessMethodType.PUBLIC, "public-service", null, "Public",null)); + Map<HelmChartIngressVariable, String> dataAccessUserDeploymentParameters = new HashMap<>(); + dataAccessUserDeploymentParameters.put(HelmChartIngressVariable.ACCESS_USER, "testUser"); + accessMethods.add(new ServiceAccessMethod(ServiceAccessMethodType.INTERNAL, "data-service-with-access-user", null, "DATA", dataAccessUserDeploymentParameters)); accessMethods.add(new ServiceAccessMethod(ServiceAccessMethodType.PUBLIC, "public-service", null, "Public",null)); Map<HelmChartIngressVariable, String> dataAccessDeploymentParameters = new HashMap<>(); dataAccessDeploymentParameters.put(HelmChartIngressVariable.K8S_SERVICE_SUFFIX, "component1"); @@ -257,7 +266,7 @@ public class KubernetesManagerTest { assertEquals("valid", accessMethod.get().getCondition()); assertTrue(accessMethod.get().isEnabled()); assertNotNull(serviceInfo.getValue().getAdditionalParameters()); - assertEquals(19, serviceInfo.getValue().getAdditionalParameters().size()); + assertEquals(21, serviceInfo.getValue().getAdditionalParameters().size()); assertEquals("customvalue1", serviceInfo.getValue().getAdditionalParameters().get("customkey1")); assertEquals("customvalue2", serviceInfo.getValue().getAdditionalParameters().get("customkey2")); assertEquals(serviceInfo.getValue().getAdditionalParameters().get("customkey3"), serviceInfo.getValue().getAdditionalParameters().get("customkey5")); @@ -266,8 +275,10 @@ public class KubernetesManagerTest { assertTrue(serviceInfo.getValue().getAdditionalParameters().get("customkey4").matches("beginning-(.*)-ending")); assertEquals("hostname", serviceInfo.getValue().getAdditionalParameters().get("smtpHostname")); assertEquals("5", serviceInfo.getValue().getAdditionalParameters().get("smtpPort")); + assertEquals("host:port", serviceInfo.getValue().getAdditionalParameters().get("smtpHostnameWithPort")); assertEquals("username", serviceInfo.getValue().getAdditionalParameters().get("smtpUsername")); assertEquals("password", serviceInfo.getValue().getAdditionalParameters().get("smtpPassword")); + assertEquals("@fromdomain", serviceInfo.getValue().getAdditionalParameters().get("smtpFromDefaultDomain")); assertEquals("domain", serviceInfo.getValue().getAdditionalParameters().get("domainCodeName")); assertEquals("extBaseUrl", serviceInfo.getValue().getAdditionalParameters().get("baseUrl")); assertEquals("descriptiveDeploymentId", serviceInfo.getValue().getAdditionalParameters().get("releaseName")); @@ -298,6 +309,8 @@ public class KubernetesManagerTest { deployParameters.put(ParameterType.SMTP_PORT.toString(), "smtpPort"); deployParameters.put(ParameterType.SMTP_USERNAME.toString(), "smtpUsername"); deployParameters.put(ParameterType.SMTP_PASSWORD.toString(), "smtpPassword"); + deployParameters.put(ParameterType.SMTP_HOST_WITH_PORT.name(), "smtpHostnameWithPort"); + deployParameters.put(ParameterType.SMTP_FROM_DEFAULT_DOMAIN.name(), "smtpFromDefaultDomain"); deployParameters.put(ParameterType.DOMAIN_CODENAME.toString(), "domainCodeName"); deployParameters.put(ParameterType.BASE_URL.toString(), "baseUrl"); deployParameters.put(ParameterType.RELEASE_NAME.toString(), "releaseName"); @@ -341,7 +354,7 @@ public class KubernetesManagerTest { manager.deployNmService(DEPLOYMENT_ID); ArgumentCaptor<Set<ServiceAccessMethod>> accessMethodsArg = ArgumentCaptor.forClass(HashSet.class); verify(repositoryManager, times(1)).updateKServiceAccessMethods(accessMethodsArg.capture()); - assertEquals(8, accessMethodsArg.getValue().size()); + assertEquals(10, accessMethodsArg.getValue().size()); assertTrue(accessMethodsArg.getValue().stream().anyMatch(m -> m.isOfType(ServiceAccessMethodType.DEFAULT) && m.getName().equals("Default") @@ -394,7 +407,7 @@ public class KubernetesManagerTest { ArgumentCaptor<Set<ServiceAccessMethod>> accessMethodsArg = ArgumentCaptor.forClass(HashSet.class); verify(repositoryManager, times(2)).updateKServiceAccessMethods(accessMethodsArg.capture()); - assertEquals(8, accessMethodsArg.getValue().size()); + assertEquals(10, accessMethodsArg.getValue().size()); assertTrue(accessMethodsArg.getValue().stream().anyMatch(m -> m.isOfType(ServiceAccessMethodType.INTERNAL) && m.getName().equals("ssh-service") @@ -405,6 +418,16 @@ public class KubernetesManagerTest { && m.getName().equals("ssh-service-with-port") && m.getProtocol().equals("SSH") && m.getUrl().equals("netops@192.168.100.1 (port: 22)"))); + assertTrue(accessMethodsArg.getValue().stream().anyMatch(m -> + m.isOfType(ServiceAccessMethodType.INTERNAL) + && m.getName().equals("ssh-service-with-access-user") + && m.getProtocol().equals("SSH") + && m.getUrl().equals("testUser@192.168.100.1"))); + assertTrue(accessMethodsArg.getValue().stream().anyMatch(m -> + m.isOfType(ServiceAccessMethodType.INTERNAL) + && m.getName().equals("data-service-with-access-user") + && m.getProtocol().equals("DATA") + && m.getUrl().equals("testUser@192.168.100.1"))); assertTrue(accessMethodsArg.getValue().stream().anyMatch(m -> m.isOfType(ServiceAccessMethodType.INTERNAL) && m.getName().equals("data-service") @@ -477,4 +500,4 @@ public class KubernetesManagerTest { )); } -} +} \ No newline at end of file diff --git a/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java b/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java index e08d4d093a41ac661235168fc70d127a2067c4a6..054bd0584ecc6d43a71c540cfaf453787f75f8bb 100644 --- a/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java +++ b/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java @@ -279,7 +279,7 @@ public class NotificationManagerTest { String external = "external@email.com"; - List<User> adminUsers = this.getAdminUserList(); + List<User> adminUsers = getAdminUserList(); List<String> emails = Lists.newArrayList( adminUsers.get(0).getEmail(), external @@ -287,7 +287,7 @@ public class NotificationManagerTest { when(userService.findByEmail(adminUsers.get(0).getEmail())).thenReturn(adminUsers.get(0)); when(userService.findByEmail(external)).thenThrow(new IllegalArgumentException("test message")); - when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(true, true, "en", true, true, emails)); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(true, true, "en", true, true, emails, true, true)); notificationManager.prepareAndSendMail(ma); @@ -328,9 +328,9 @@ public class NotificationManagerTest { add(lmcv); }}); mt.setGlobalInformation(new HashMap<String, String>() {{ - put("LOGO_LINK", "https://www.geant.org/Style%20Library/Geant/Images/logo.png"); - put("LOGO_ALT", "Geant logo"); - put("PORTAL_LOGO_ALT", "NMaaS logo"); + put("LOGO_LINK", "https://www.geant.org/Style%20Library/geant/Images/logo.png"); + put("LOGO_ALT", "GÉANT logo"); + put("PORTAL_LOGO_ALT", "nmaas logo"); put("SENDER_INFO", "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands"); }}); diff --git a/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java b/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java index d6a3936e246d42ff0017a0a284da59d2ff94813c..8df5075e776a6f36868a1bcc1e90eb7b39222255 100644 --- a/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java +++ b/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java @@ -12,28 +12,43 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ConfigurationTest { @Test - public void shouldCreateConfigurationWithEmailList() { + void shouldCreateConfigurationWithEmailList() { List<String> emails = Lists.newArrayList("admin@email.com", "user@email.com"); - - Configuration configuration = new Configuration(true, true, "en", true, true, emails, true); - + Configuration configuration = Configuration.builder() + .maintenance(true) + .ssoLoginAllowed(true) + .defaultLanguage("en") + .testInstance(true) + .sendAppInstanceFailureEmails(true) + .appInstanceFailureEmails(String.join(";", emails)) + .registrationDomainSelectionEnabled(true) + .bulkDomainsAllowForSsoAccounts(false) + .bulkDomainsSendEmailForNewAccounts(false) + .build(); assertEquals(2, configuration.getAppInstanceFailureEmailList().size()); } @Test - public void bareModelMapperShouldMapBetweenConfigurationAndConfigurationView() { + void bareModelMapperShouldMapBetweenConfigurationAndConfigurationView() { ModelMapper mm = new ModelMapper(); - List<String> emails = Lists.newArrayList("admin@email.com", "user@email.com"); - - Configuration configuration = new Configuration(true, true, "en", true, true, emails, true); + Configuration configuration = Configuration.builder() + .maintenance(true) + .ssoLoginAllowed(true) + .defaultLanguage("en") + .testInstance(true) + .sendAppInstanceFailureEmails(true) + .appInstanceFailureEmails(String.join(";", emails)) + .registrationDomainSelectionEnabled(true) + .bulkDomainsAllowForSsoAccounts(false) + .bulkDomainsSendEmailForNewAccounts(false) + .build(); ConfigurationView configurationView = mm.map(configuration, ConfigurationView.class); - assertEquals(2, configurationView.getAppInstanceFailureEmailList().size()); Configuration conf2 = mm.map(configurationView, Configuration.class); - assertEquals(2, conf2.getAppInstanceFailureEmailList().size()); } + } diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java index abaf4c3f2421a1c35e2f934290705d3336f69636..30f8865e9d0fd7ba29d8046d6137a906373aa7dd 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java @@ -14,6 +14,7 @@ import net.geant.nmaas.portal.service.ApplicationStatePerDomainService; import net.geant.nmaas.portal.service.DomainService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.modelmapper.ModelMapper; import org.springframework.context.ApplicationEventPublisher; import java.util.Collections; @@ -43,11 +44,13 @@ public class ApplicationBaseServiceTest { private final ApplicationEventPublisher eventPublisher= mock(ApplicationEventPublisher.class); private final DomainService domainService = mock(DomainService.class); + private final ModelMapper modelMapper = new ModelMapper(); + private ApplicationBaseService appBaseService; @BeforeEach void setup() { - this.appBaseService = new ApplicationBaseServiceImpl(appBaseRepo, tagRepo, applicationStatePerDomainService,eventPublisher, domainService); + this.appBaseService = new ApplicationBaseServiceImpl(appBaseRepo, tagRepo, applicationStatePerDomainService,eventPublisher, domainService, modelMapper); applicationBase1.setDescriptions(Collections.singletonList( new AppDescription(11L, "en", "description", "full description") )); diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java index 02915b634b07ddf73002cfc307d9c83522b8080d..1b6b7b62f2a5911e6271a3b1ce5de472881f93ed 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java @@ -3,30 +3,31 @@ package net.geant.nmaas.portal.service.impl; import net.geant.nmaas.dcn.deployment.DcnDeploymentType; import net.geant.nmaas.dcn.deployment.entities.DomainDcnDetails; import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager; -import net.geant.nmaas.portal.api.auth.SSOAuthController; import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.bulk.CsvDomain; +import net.geant.nmaas.portal.api.configuration.ConfigurationView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; +import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository; import net.geant.nmaas.portal.persistent.repositories.UserRoleRepository; import net.geant.nmaas.portal.service.BulkDomainService; +import net.geant.nmaas.portal.service.ConfigurationManager; import net.geant.nmaas.portal.service.DomainGroupService; import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.UserService; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.modelmapper.ModelMapper; -import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.TestPropertySource; import java.util.List; import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -42,15 +43,15 @@ public class BulkDomainServiceImplTest { private final UserService userService = mock(UserService.class); private final BulkDeploymentRepository bulkDeploymentRepository = mock(BulkDeploymentRepository.class); private final KubernetesClusterIngressManager kubernetesClusterIngressManager = mock(KubernetesClusterIngressManager.class); - private final UserRoleRepository userRoleRepository = mock(UserRoleRepository.class); + private final ConfigurationManager configurationManager = mock(ConfigurationManager.class); final BulkDomainService bulkDomainService = new BulkDomainServiceImpl(domainService, domainGroupService, userService, - bulkDeploymentRepository, kubernetesClusterIngressManager, new ModelMapper(),userRoleRepository, 12);; + bulkDeploymentRepository, kubernetesClusterIngressManager, new ModelMapper(), userRoleRepository, 12, configurationManager); @Test void shouldHandleBulkCreationWhenAllCreated() { - CsvDomain csvDomain = new CsvDomain("domain1", "user1", "user1@test.com", null, "group1"); + CsvDomain csvDomain = new CsvDomain("domain1", "user1", "user1@test.com", null, "group1", null); Domain domain = new Domain(1L,"domain1", "domain1"); Domain global = new Domain(0L,"GLOBAL", "GLOBAL"); when(domainService.findDomain(anyString())).thenReturn(Optional.of(domain)); @@ -64,6 +65,7 @@ public class BulkDomainServiceImplTest { when(userService.findByUsername("user1")).thenReturn(Optional.of(user)); when(userService.hasPrivilege((User) any(),any(),any())).thenReturn(true); when(bulkDeploymentRepository.save(any())).thenReturn(new BulkDeployment()); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView()); bulkDomainService.handleBulkCreation(List.of(csvDomain), testUser()); @@ -72,12 +74,15 @@ public class BulkDomainServiceImplTest { BulkDeployment bulkDeployment = bulkDeploymentArgumentCaptor.getValue(); assertEquals(BulkDeploymentState.COMPLETED, bulkDeployment.getState()); assertEquals(BulkType.DOMAIN, bulkDeployment.getType()); + assertEquals(2, bulkDeployment.getEntries().size()); + assertThat(bulkDeployment.getEntries().stream().filter(e -> e.getType() == BulkType.USER).findAny().orElseThrow().getCreated()).isFalse(); + assertThat(bulkDeployment.getEntries().stream().filter(e -> e.getType() == BulkType.DOMAIN).findAny().orElseThrow().getCreated()).isFalse(); assertEquals(testUser().getId(), bulkDeployment.getCreatorId()); } @Test - void shouldHandleBulkCreationWhenDomainsCreated() { - CsvDomain csvDomain = new CsvDomain("domain1", "user1", "user1@test.com", null, "group1"); + void shouldHandleBulkCreationWhenDomainCreated() { + CsvDomain csvDomain = new CsvDomain("domain1", "user1", "user1@test.com", null, "group1", null); Domain domain = new Domain(1L,"domain1", "domain1"); domain.setDomainDcnDetails(new DomainDcnDetails(10L, "domain1", true, DcnDeploymentType.MANUAL, null)); Domain global = new Domain(0L,"GLOBAL", "GLOBAL"); @@ -93,6 +98,7 @@ public class BulkDomainServiceImplTest { when(userService.findByUsername("user1")).thenReturn(Optional.of(user)); when(userService.hasPrivilege((User) any(),any(),any())).thenReturn(true); when(bulkDeploymentRepository.save(any())).thenReturn(new BulkDeployment()); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView()); bulkDomainService.handleBulkCreation(List.of(csvDomain), testUser()); @@ -101,34 +107,45 @@ public class BulkDomainServiceImplTest { BulkDeployment bulkDeployment = bulkDeploymentArgumentCaptor.getValue(); assertEquals(BulkDeploymentState.COMPLETED, bulkDeployment.getState()); assertEquals(BulkType.DOMAIN, bulkDeployment.getType()); + assertEquals(2, bulkDeployment.getEntries().size()); + assertThat(bulkDeployment.getEntries().stream().filter(e -> e.getType() == BulkType.USER).findAny().orElseThrow().getCreated()).isFalse(); + assertThat(bulkDeployment.getEntries().stream().filter(e -> e.getType() == BulkType.DOMAIN).findAny().orElseThrow().getCreated()).isTrue(); assertEquals(testUser().getId(), bulkDeployment.getCreatorId()); } @Test void shouldHandleBulkCreationWhenUserCreated() { - CsvDomain csvDomain = new CsvDomain("domain1", "user1", "user1@test.com", null, "group1"); - Domain domain = new Domain(1L,"domain1", "domain1"); - domain.setDomainDcnDetails(new DomainDcnDetails(10L, "domain1", true, DcnDeploymentType.MANUAL, null)); + CsvDomain csvDomain1 = new CsvDomain("domain1", "user1", "user1@test.com", null, "group1", false); + CsvDomain csvDomain2 = new CsvDomain("domain2", "user2", "user2@test.com", null, "group1", true); Domain global = new Domain(0L,"GLOBAL", "GLOBAL"); - when(domainService.findDomain(anyString())).thenReturn(Optional.empty()); - when(domainService.createDomain(any())).thenReturn(domain); when(domainService.getGlobalDomain()).thenReturn(Optional.of(global)); + Domain domain1 = new Domain(1L,"domain1", "domain1"); + domain1.setDomainDcnDetails(new DomainDcnDetails(10L, "domain1", true, DcnDeploymentType.MANUAL, null)); + when(domainService.findDomain(domain1.getName())).thenReturn(Optional.of(domain1)); + Domain domain2 = new Domain(2L,"domain2", "domain2"); + domain2.setDomainDcnDetails(new DomainDcnDetails(11L, "domain2", true, DcnDeploymentType.MANUAL, null)); + when(domainService.findDomain(domain2.getName())).thenReturn(Optional.of(domain2)); when(domainGroupService.existDomainGroup("group1", "group1")).thenReturn(Boolean.TRUE); when(userService.existsByUsername("user1")).thenReturn(false); when(userService.existsByEmail("user1@test.com")).thenReturn(Boolean.FALSE); + when(userService.existsByUsername("user2")).thenReturn(false); + when(userService.existsByEmail("user2@test.com")).thenReturn(Boolean.FALSE); User user = new User("user1", true); user.setId(10L); user.setEmail("user1@test.com"); when(userService.registerBulk(any(), any(), any())).thenReturn(user); when(bulkDeploymentRepository.save(any())).thenReturn(new BulkDeployment()); - bulkDomainService.handleBulkCreation(List.of(csvDomain), testUser()); + bulkDomainService.handleBulkCreation(List.of(csvDomain1, csvDomain2), testUser()); ArgumentCaptor<BulkDeployment> bulkDeploymentArgumentCaptor = ArgumentCaptor.forClass(BulkDeployment.class); verify(bulkDeploymentRepository).save(bulkDeploymentArgumentCaptor.capture()); BulkDeployment bulkDeployment = bulkDeploymentArgumentCaptor.getValue(); assertEquals(BulkDeploymentState.COMPLETED, bulkDeployment.getState()); assertEquals(BulkType.DOMAIN, bulkDeployment.getType()); + assertEquals(4, bulkDeployment.getEntries().size()); + assertThat(bulkDeployment.getEntries().stream().filter(e -> e.getType() == BulkType.USER)).allMatch(BulkDeploymentEntry::getCreated); + assertThat(bulkDeployment.getEntries().stream().filter(e -> e.getType() == BulkType.DOMAIN)).noneMatch(BulkDeploymentEntry::getCreated); assertEquals(testUser().getId(), bulkDeployment.getCreatorId()); } diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java index 317dc51789972137adf30226fc65846ea538f493..98df964a513e570b58a4e74203fe096def84b96a 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java @@ -26,26 +26,33 @@ import static org.mockito.Mockito.when; public class ConfigurationManagerTest { - private ConfigurationRepository repository = mock(ConfigurationRepository.class); - - private ModelMapper modelMapper = new ModelMapper(); - - private InternationalizationSimpleRepository internationalizationRepository = mock(InternationalizationSimpleRepository.class); + private final ConfigurationRepository repository = mock(ConfigurationRepository.class); + private final InternationalizationSimpleRepository internationalizationRepository = mock(InternationalizationSimpleRepository.class); + private final ModelMapper modelMapper = new ModelMapper(); private ConfigurationManager configurationManager; - private Configuration config; - - ConfigurationView configView; - + private ConfigurationView configView; private InternationalizationView internationalization; @BeforeEach - public void setup(){ + public void setup() { this.configurationManager = new ConfigurationManagerImpl(repository, modelMapper, internationalizationRepository); - this.config = new Configuration(1L, false, false, "en", false, false, "", true); + this.config = Configuration.builder() + .id(1L) + .maintenance(true) + .ssoLoginAllowed(true) + .defaultLanguage("en") + .testInstance(true) + .sendAppInstanceFailureEmails(true) + .appInstanceFailureEmails("") + .registrationDomainSelectionEnabled(true) + .bulkDomainsAllowForSsoAccounts(false) + .bulkDomainsSendEmailForNewAccounts(false) + .build(); this.internationalization = new InternationalizationView("pl", true, "{\"test\":\"test\"}"); - this.configView = new ConfigurationView(1L, false, false, "pl", false, false, new ArrayList<>(), true); + this.configView = new ConfigurationView(1L, false, false, "pl", + false, false, new ArrayList<>(), true, true, false); } @Test @@ -60,7 +67,7 @@ public class ConfigurationManagerTest { } @Test - public void shouldSetConfiguration(){ + void shouldSetConfiguration(){ when(repository.count()).thenReturn(0L); Long id = configurationManager.setConfiguration(modelMapper.map(config, ConfigurationView.class)); assertEquals(config.getId(), id); @@ -68,7 +75,7 @@ public class ConfigurationManagerTest { } @Test - public void shouldNotSetConfigIfAlreadyExists(){ + void shouldNotSetConfigIfAlreadyExists(){ assertThrows(OnlyOneConfigurationSupportedException.class, () -> { when(repository.count()).thenReturn(1L); configurationManager.setConfiguration(modelMapper.map(config, ConfigurationView.class)); @@ -76,7 +83,7 @@ public class ConfigurationManagerTest { } @Test - public void shouldUpdateConfiguration(){ + void shouldUpdateConfiguration(){ when(repository.findById(config.getId())).thenReturn(Optional.of(config)); when(internationalizationRepository.findByLanguageOrderByIdDesc(configView.getDefaultLanguage())) .thenReturn(Optional.of(internationalization.getAsInternationalizationSimple())); @@ -85,7 +92,7 @@ public class ConfigurationManagerTest { } @Test - public void shouldNotUpdateNotExistingConfig(){ + void shouldNotUpdateNotExistingConfig(){ assertThrows(ConfigurationNotFoundException.class, () -> { when(repository.findById(config.getId())).thenReturn(Optional.empty()); configurationManager.updateConfiguration(1L, configView); @@ -93,7 +100,7 @@ public class ConfigurationManagerTest { } @Test - public void shouldNotSetNotExistingLanguageAsDefault(){ + void shouldNotSetNotExistingLanguageAsDefault(){ assertThrows(IllegalArgumentException.class, () -> { when(repository.findById(config.getId())).thenReturn(Optional.of(config)); when(internationalizationRepository.findByLanguageOrderByIdDesc(configView.getDefaultLanguage())) @@ -103,7 +110,7 @@ public class ConfigurationManagerTest { } @Test - public void shouldNotSetDisabledLanguageAsDefault(){ + void shouldNotSetDisabledLanguageAsDefault(){ assertThrows(IllegalStateException.class, () -> { this.internationalization.setEnabled(false); when(repository.findById(config.getId())).thenReturn(Optional.of(config)); @@ -112,4 +119,5 @@ public class ConfigurationManagerTest { configurationManager.updateConfiguration(1L, configView); }); } + } diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java index 1c9d4bf5bd02c63eb08c9cd44962b65aef13e1fb..541e75c99eede7209c70f6ed0de4c7a5f4459aef 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java @@ -97,7 +97,7 @@ public class InternationalizationServiceTest { @Test public void shouldChangeLanguageState(){ - when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(false, false, "fr", false, false, new ArrayList<>())); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(false, false, "fr", false, false, new ArrayList<>(), false, false)); InternationalizationView internationalization = new InternationalizationView("pl", false, "{\"test\":\"content\"}"); when(repository.findByLanguageOrderByIdDesc(language.getLanguage())).thenReturn(Optional.of(internationalization.getAsInternationalizationSimple())); internationalizationService.changeLanguageState(language); @@ -117,7 +117,7 @@ public class InternationalizationServiceTest { assertThrows(IllegalStateException.class, () -> { InternationalizationView internationalization = new InternationalizationView("pl", false, "{\"test\":\"content\"}"); when(repository.findByLanguageOrderByIdDesc(language.getLanguage())).thenReturn(Optional.of(internationalization.getAsInternationalizationSimple())); - when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(false, false, "pl", false, false, new ArrayList<>())); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(false, false, "pl", false, false, new ArrayList<>(), true, false)); internationalizationService.changeLanguageState(language); }); } diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java index ba3e8d294791c7a0deae9762891500d5ee232465..9ee91a674de66221c38724bc3d8f20d2bd76876c 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java @@ -2,9 +2,11 @@ package net.geant.nmaas.portal.service.impl; import net.geant.nmaas.portal.api.auth.Registration; import net.geant.nmaas.portal.api.auth.UserSSOLogin; +import net.geant.nmaas.portal.api.bulk.CsvDomain; import net.geant.nmaas.portal.api.configuration.ConfigurationView; import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; @@ -15,10 +17,10 @@ import net.geant.nmaas.portal.service.ConfigurationManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.modelmapper.ModelMapper; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import java.util.ArrayList; @@ -49,16 +51,22 @@ public class UserServiceImplTest { @Mock ConfigurationManager configurationManager; - @InjectMocks + @Mock + ApplicationEventPublisher eventPublisher; + + @Mock + JWTTokenService jwtTokenService; + UserServiceImpl userService; @BeforeEach - public void setup(){ - userService = new UserServiceImpl(userRepository, userRoleRepository, new BCryptPasswordEncoder(), configurationManager, new ModelMapper()); + void setup() { + userService = new UserServiceImpl(userRepository, userRoleRepository, new BCryptPasswordEncoder(), configurationManager, new ModelMapper(), eventPublisher, jwtTokenService); + userService.setPortalAddress("portalAddress"); } @Test - public void hasPrivilegeShouldReturnFalseDueToEmptyUser(){ + void hasPrivilegeShouldReturnFalseDueToEmptyUser() { User user = null; Domain domain = new Domain("GLOBAL", "GLOBAL"); Role role = Role.ROLE_USER; @@ -66,7 +74,7 @@ public class UserServiceImplTest { } @Test - public void hasPrivilegeShouldReturnFalseDueToEmptyDomain(){ + void hasPrivilegeShouldReturnFalseDueToEmptyDomain() { User user = new User("test", true); Domain domain = null; Role role = Role.ROLE_USER; @@ -74,7 +82,7 @@ public class UserServiceImplTest { } @Test - public void hasPrivilegeShouldReturnFalseDueToEmptyRole(){ + void hasPrivilegeShouldReturnFalseDueToEmptyRole() { User user = new User("test", true); Domain domain = new Domain("GLOBAL", "GLOBAL"); Role role = null; @@ -82,7 +90,7 @@ public class UserServiceImplTest { } @Test - public void hasPrivilegeShouldReturnFalseDueToEmptyUserRole(){ + void hasPrivilegeShouldReturnFalseDueToEmptyUserRole() { User user = new User("test", true); Domain domain = new Domain("GLOBAL", "GLOBAL"); Role role = Role.ROLE_USER; @@ -91,7 +99,7 @@ public class UserServiceImplTest { } @Test - public void hasPrivilegeShouldPassCorrectly(){ + void hasPrivilegeShouldPassCorrectly() { User user = new User("test", true); Domain domain = new Domain("GLOBAL", "GLOBAL"); Role role = Role.ROLE_USER; @@ -101,7 +109,7 @@ public class UserServiceImplTest { } @Test - void adminShouldUpdateData(){ + void adminShouldUpdateData() { User admin = new User("admin", true); Domain domain = new Domain("GLOBAL", "GLOBAL"); admin.setRoles(Collections.singletonList(new UserRole(admin, domain, Role.ROLE_SYSTEM_ADMIN))); @@ -110,7 +118,7 @@ public class UserServiceImplTest { } @Test - void domainAdminShouldUpdateDataOfUserInHisDomain(){ + void domainAdminShouldUpdateDataOfUserInHisDomain() { User admin = new User("admin", true); User user = new User("test", true); Domain domain = new Domain("testdom", "testdom"); @@ -120,7 +128,7 @@ public class UserServiceImplTest { } @Test - void domainAdminShouldNotUpdateDataOfUserNotInHisDomain(){ + void domainAdminShouldNotUpdateDataOfUserNotInHisDomain() { User admin = new User("admin", true); User user = new User("test", true); Domain domain = new Domain("testdom", "testdom"); @@ -131,7 +139,7 @@ public class UserServiceImplTest { } @Test - void userShouldNotUpdateOtherUserData(){ + void userShouldNotUpdateOtherUserData() { User admin = new User("admin", true); User user = new User("test", true); Domain domain = new Domain("testdom", "testdom"); @@ -141,7 +149,7 @@ public class UserServiceImplTest { } @Test - public void findAllShouldReturnListWithElements(){ + void findAllShouldReturnListWithElements() { User user = new User("test1", true); User user1 = new User("test2", true); User user2 = new User("test3", true); @@ -158,12 +166,12 @@ public class UserServiceImplTest { } @Test - public void findByUsernameShouldReturnEmptyOptionalWhenNull(){ + void findByUsernameShouldReturnEmptyOptionalWhenNull() { assertEquals(Optional.empty(), userService.findByUsername(null)); } @Test - public void findByUsernameShouldReturnUserObject(){ + void findByUsernameShouldReturnUserObject() { User user = new User("test1", true); when(userRepository.findByUsername(anyString())).thenReturn(Optional.of(user)); Optional<User> resultUser = userService.findByUsername("test"); @@ -172,12 +180,12 @@ public class UserServiceImplTest { } @Test - public void findByIdShouldReturnEmptyOptionalWhenNull(){ + void findByIdShouldReturnEmptyOptionalWhenNull(){ assertEquals(Optional.empty(), userService.findById(null)); } @Test - public void findByIdShouldReturnUserObject(){ + void findByIdShouldReturnUserObject() { User user = new User("test1", true); when(userRepository.findById(anyLong())).thenReturn(Optional.of(user)); Optional<User> resultUser = userService.findById((long) 0); @@ -186,12 +194,12 @@ public class UserServiceImplTest { } @Test - public void findBySamlTokenShouldReturnEmptyOptionalWhenNull(){ + void findBySamlTokenShouldReturnEmptyOptionalWhenNull() { assertEquals(Optional.empty(), userService.findBySamlToken(null)); } @Test - public void findBySamlTokenShouldReturnUserObject(){ + void findBySamlTokenShouldReturnUserObject() { User user = new User("test1", true); when(userRepository.findBySamlToken(anyString())).thenReturn(Optional.of(user)); Optional<User> resultUser = userService.findBySamlToken("token"); @@ -200,61 +208,61 @@ public class UserServiceImplTest { } @Test - public void existsByUsernameCheckParamShouldThrowException(){ + void existsByUsernameCheckParamShouldThrowException() { assertThrows(IllegalArgumentException.class, () -> { userService.existsByUsername(null); }); } @Test - public void existsByIdCheckParamShouldThrowException(){ + void existsByIdCheckParamShouldThrowException() { assertThrows(IllegalArgumentException.class, () -> { userService.existsById(null); }); } @Test - public void existsByUsernameShouldThrowFalseWhenThereIsNoUserWithSpecifiedName(){ + void existsByUsernameShouldThrowFalseWhenThereIsNoUserWithSpecifiedName() { when(userRepository.existsByUsername(anyString())).thenReturn(false); assertFalse(userService.existsByUsername("test1")); } @Test - public void existsByIdShouldThrowFalseWhenThereIsNoUserWithSpecifiedId(){ + void existsByIdShouldThrowFalseWhenThereIsNoUserWithSpecifiedId() { when(userRepository.existsById(anyLong())).thenReturn(false); assertFalse(userService.existsById((long) 0)); } @Test - public void existsByUsernameShouldThrowTrue(){ + void existsByUsernameShouldThrowTrue() { when(userRepository.existsByUsername(anyString())).thenReturn(true); assertTrue(userService.existsByUsername("test1")); } @Test - public void existsByIdShouldThrowTrue(){ + void existsByIdShouldThrowTrue() { when(userRepository.existsById(anyLong())).thenReturn(true); assertTrue(userService.existsById((long) 0)); } @Test - public void existsByEmailShouldThrowTrue(){ + void existsByEmailShouldThrowTrue() { when(userRepository.existsByEmail(anyString())).thenReturn(true); assertTrue(userService.existsByEmail("test@test.com")); } @Test - public void existsByEmailShouldThrowFalseWhenThereIsNoUserWithSpecifiedId(){ + void existsByEmailShouldThrowFalseWhenThereIsNoUserWithSpecifiedId() { when(userRepository.existsByEmail(anyString())).thenReturn(false); assertFalse(userService.existsByEmail("test@test.com")); } @Test - public void shouldRegisterUserWithGlobalGuestRole(){ + void shouldRegisterUserWithGlobalGuestRole() { when(userRepository.existsByUsername(anyString())).thenReturn(false); Registration registration = new Registration("test", "testpass","test@test.com", "name", "surname", 1L, true, true); Domain domain = new Domain("GLOBAL", "GLOBAL"); - when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true)); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, true, false)); User user = userService.register(registration, domain, null); verify(userRepository, times(1)).save(any()); assertEquals(1, user.getRoles().size()); @@ -263,9 +271,9 @@ public class UserServiceImplTest { } @Test - public void shouldRegisterUserWithGlobalGuestRoleAndRoleInDomain(){ + void shouldRegisterUserWithGlobalGuestRoleAndRoleInDomain() { when(userRepository.existsByUsername(anyString())).thenReturn(false); - when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true)); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, false, true)); Registration registration = new Registration("test", "testpass","test@test.com", "name", "surname", 1L, true, true); Domain globalDomain = new Domain("GLOBAL", "GLOBAL"); Domain domain = new Domain("Non Global", "NONGLO"); @@ -277,7 +285,7 @@ public class UserServiceImplTest { } @Test - public void shouldNotRegisterUserWhenUserAlreadyExists(){ + void shouldNotRegisterUserWhenUserAlreadyExists() { assertThrows(SignupException.class, () -> { Registration registration = new Registration("test", "testpass", "test@test.com", "name", "surname", 1L, true, true); Domain domain = new Domain("GLOBAL", "GLOBAL"); @@ -287,7 +295,7 @@ public class UserServiceImplTest { } @Test - public void shouldNotRegisterUserWhenUserAlreadyExistsByMail(){ + void shouldNotRegisterUserWhenUserAlreadyExistsByMail() { assertThrows(SignupException.class, () -> { Registration registration = new Registration("test", "testpass", "test@test.com", "name", "surname", 1L, true, true); Domain domain = new Domain("GLOBAL", "GLOBAL"); @@ -297,24 +305,24 @@ public class UserServiceImplTest { } @Test - public void shouldRegisterSSOUser(){ + void shouldRegisterSSOUser() { UserSSOLogin ssoUser = new UserSSOLogin("test|1234|id"); Domain domain = new Domain("GLOBAL", "GLOBAL"); - when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true)); + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, false, false)); User user = userService.register(ssoUser, domain); verify(userRepository, times(1)).save(any()); assertEquals(user.getSamlToken(), ssoUser.getUsername()); } @Test - public void updateShouldFailDueToEmptyUser(){ + void updateShouldFailDueToEmptyUser() { assertThrows(IllegalArgumentException.class, () -> { userService.update(null); }); } @Test - public void updateShouldFailDueToEmptyUserId(){ + void updateShouldFailDueToEmptyUserId() { assertThrows(IllegalArgumentException.class, () -> { User user = new User("test", true); userService.update(user); @@ -322,7 +330,7 @@ public class UserServiceImplTest { } @Test - public void updateShouldFailDueToUserDoNotExist(){ + void updateShouldFailDueToUserDoNotExist() { assertThrows(ProcessingException.class, () -> { when(userRepository.existsById(anyLong())).thenReturn(false); User user = new User("test", true); @@ -332,7 +340,7 @@ public class UserServiceImplTest { } @Test - public void updateShouldPassCorrectly(){ + void updateShouldPassCorrectly(){ when(userRepository.existsById(anyLong())).thenReturn(true); User user = new User("test", true); user.setId((long) 0); @@ -341,14 +349,14 @@ public class UserServiceImplTest { } @Test - public void deleteShouldFailDueToEmptyUser(){ + void deleteShouldFailDueToEmptyUser() { assertThrows(IllegalArgumentException.class, () -> { userService.delete(null); }); } @Test - public void deleteShouldFailDueToEmptyUserId(){ + public void deleteShouldFailDueToEmptyUserId() { assertThrows(IllegalArgumentException.class, () -> { User user = new User("test", true); userService.delete(user); @@ -356,7 +364,7 @@ public class UserServiceImplTest { } @Test - public void deleteShouldPassCorrectly(){ + void deleteShouldPassCorrectly() { User user = new User("test", true); user.setId((long) 0); userService.delete(user); @@ -364,49 +372,49 @@ public class UserServiceImplTest { } @Test - public void shouldDeleteById() { + void shouldDeleteById() { userService.deleteById(0L); verify(userRepository).deleteById(0L); } @Test - public void setEnabledFlagShouldChangeFlagToTrue(){ + void setEnabledFlagShouldChangeFlagToTrue() { userService.setEnabledFlag((long) 0, true); verify(userRepository).setEnabledFlag((long) 0, true); } @Test - public void setEnabledFlagShouldChangeFlagToFalse(){ + void setEnabledFlagShouldChangeFlagToFalse() { userService.setEnabledFlag((long) 0, false); verify(userRepository).setEnabledFlag((long) 0, false); } @Test - public void setTermsOfUseAcceptedFlagShouldChangeFlagToTrue(){ + void setTermsOfUseAcceptedFlagShouldChangeFlagToTrue() { userService.setTermsOfUseAcceptedFlag((long) 0, true); verify(userRepository).setTermsOfUseAcceptedFlag((long) 0, true); } @Test - public void setTermsOfUseAcceptedFlagShouldChangeFlagToFalse(){ + void setTermsOfUseAcceptedFlagShouldChangeFlagToFalse() { userService.setTermsOfUseAcceptedFlag((long) 0, false); verify(userRepository).setTermsOfUseAcceptedFlag((long) 0, false); } @Test - public void setPrivacyPolicyAcceptedFlagShouldChangeFlagToTrue(){ + void setPrivacyPolicyAcceptedFlagShouldChangeFlagToTrue() { userService.setPrivacyPolicyAcceptedFlag((long) 0, true); verify(userRepository).setPrivacyPolicyAcceptedFlag((long) 0, true); } @Test - public void setPrivacyPolicyAcceptedFlagShouldChangeFlagToFalse(){ + void setPrivacyPolicyAcceptedFlagShouldChangeFlagToFalse() { userService.setPrivacyPolicyAcceptedFlag((long) 0, false); verify(userRepository).setPrivacyPolicyAcceptedFlag((long) 0, false); } @Test - public void findAllUsersEmailWithAdminRole(){ + void findAllUsersEmailWithAdminRole() { List<User> users = new ArrayList<>(); List<UserRole> userRoles = new ArrayList<>(); @@ -425,4 +433,68 @@ public class UserServiceImplTest { assertEquals(userService.findAllUsersWithAdminRole().get(0).getEmail(), user.getEmail()); } + @Test + void registerBulkTestSSOEnable() { + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, true, true)); + + CsvDomain csvUser = new CsvDomain(); + csvUser.setAdminUserName("test"); + csvUser.setEmail("test@email.com"); + csvUser.setSsoEnabled(true); + Domain domain = new Domain("GLOBAL", "GLOBAL"); + + User user = userService.registerBulk(csvUser, domain, null); + + verify(userRepository, times(1)).save(any()); + verify(eventPublisher, times(1)).publishEvent(any()); + } + + @Test + void registerBulkTestSSODisable() { + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, true, true)); + + CsvDomain csvUser = new CsvDomain(); + csvUser.setAdminUserName("test"); + csvUser.setEmail("test@email.com"); + csvUser.setSsoEnabled(false); + Domain domain = new Domain("GLOBAL", "GLOBAL"); + + User user = userService.registerBulk(csvUser, domain, null); + + verify(userRepository, times(1)).save(any()); + verify(eventPublisher, times(1)).publishEvent(any()); + } + + @Test + void registerBulkTestSSODisableGlobally() { + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, false, true)); + + CsvDomain csvUser = new CsvDomain(); + csvUser.setAdminUserName("test"); + csvUser.setEmail("test@email.com"); + csvUser.setSsoEnabled(false); + Domain domain = new Domain("GLOBAL", "GLOBAL"); + + userService.registerBulk(csvUser, domain, null); + + verify(userRepository, times(1)).save(any()); + verify(eventPublisher, times(1)).publishEvent(any()); + } + + @Test + void registerBulkTestSSODisableGloballyMailOff() { + when(configurationManager.getConfiguration()).thenReturn(new ConfigurationView(1L, false, false, "en", false, false, new ArrayList<>(), true, false, false)); + + CsvDomain csvUser = new CsvDomain(); + csvUser.setAdminUserName("test"); + csvUser.setEmail("test@email.com"); + csvUser.setSsoEnabled(false); + Domain domain = new Domain("GLOBAL", "GLOBAL"); + + userService.registerBulk(csvUser, domain, null); + + verify(userRepository, times(1)).save(any()); + verify(eventPublisher, times(0)).publishEvent(any()); + } + } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index ec681a16dd042cb077ebda4796fe620f3b31db48..1663290b65b98fe52154b014b8773cf8ca4741e2 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -1,7 +1,7 @@ # --------------- # # Active profiles # # --------------- # -# profiles are used to customise platform operations in following areas +# profiles are used to customize platform operations in the following areas # - container orchestrator (options: env_kubernetes) # - database (options: db_memory, db_standalone) spring.profiles.active=env_kubernetes, db_memory @@ -61,7 +61,7 @@ spring.devtools.add-properties=false spring.flyway.locations=classpath:/db/migration/common # -------------------------------------------------------- # -# NMaaS application deployment and configuration processes # +# nmaas application deployment and configuration processes # # -------------------------------------------------------- # nmaas.service.deployment.check.interval=10 nmaas.service.deployment.max.duration=30 @@ -94,10 +94,11 @@ spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl upload.dir=/tmp jwt.tokenValidFor=3600000 jwt.refreshTokenValidFor=13600000 -jwt.issuer=NMaaS +jwt.issuer=nmaas jwt.signingKey=testKey jwt.resetSigningKey=testResetKey jwt.resetTokenValidFor=1800000 +jwt.resetTokenRegistrationValid=86400000 # ------------------------ # # SAML proxy configuration # @@ -119,7 +120,7 @@ helm.repositoryName=nmaas-test helm.repositoryUrl=https://nmaas-test.helm.repository helm.chartsDirectory=/home/nmaas/charts helm.enableTls=false -# possible values for Helm version are v2 and v3 (if none is provided v3 is used by default) +# possible values for a Helm version are v2 and v3 (if none is provided, v3 is used by default) helm.version=v2 # --------------------- # @@ -131,8 +132,7 @@ janitor.port=5000 # -------------------- # # GitLab configuration # # -------------------- # -gitlab.address=nmaas-gitlab-unicorn -gitlab.port=8080 +gitlab.apiUrl=http://nmaas-gitlab-unicorn:8080 gitlab.token=test_gitlab_token # ------------------------ # @@ -157,6 +157,7 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerPassword= +kubernetes.deployment.smtpFromDefaultDomain= kubernetes.deployment.defaultStorageClass=storageClass # ------------------------ # @@ -168,5 +169,5 @@ portal.config.defaultLanguage=en portal.config.testInstance=false portal.config.sendAppInstanceFailureEmails=false portal.config.showDomainRegistrationSelector=true -# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +# string - list of emails with ':' as a separator, e.g., admin1@nmaas.eu;admin2@nmaas.eu portal.config.appInstanceFailureEmailList=admin@nmaas.eu diff --git a/src/test/shell/data/apps/app01-librenms.json b/src/test/shell/data/apps/app01-librenms.json deleted file mode 100644 index a77a7d5bde5426608e98d2e1121ad9d31127659c..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app01-librenms.json +++ /dev/null @@ -1,278 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "LibreNMS", - "license": "GPL 3.0", - "licenseUrl": "https://www.gnu.org/licenses/gpl-3.0.html", - "wwwUrl": "http://www.librenms.org", - "sourceUrl": "https://github.com/librenms/librenms", - "issuesUrl": "https://github.com/librenms/librenms/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-LibreNMS", - "descriptions": [ - { - "language": "en", - "briefDescription": "Autodiscovering SNMP based network monitoring tool", - "fullDescription": "<p>LibreNMS is an autodiscovering PHP/MySQL/SNMP based network monitoring which includes support for a wide range of network hardware and operating systems including Cisco, Linux, FreeBSD, Juniper, Brocade, Foundry, HP and many more.<br>LibreNMS is a community-based fork of Observium.<br><br>We intend LibreNMS to be a viable project and community that:<ul><li>encourages contribution,</li><li>focuses on the needs of its users,</li><li>offers a welcoming, friendly environment for everyone.</li></ul><br>The Debian Social Contract will be the basis of our priority system, and mutual respect is the basis of our behaviour towards others.<br>For more about the culture we're trying to build, please read the Freenode philosophy,including guidelines for running an IRC channel and being a community catalyst.</p>" - }, - { - "language": "de", - "briefDescription": "Autodiscovering SNMP based network monitoring tool", - "fullDescription": "<p>LibreNMS is an autodiscovering PHP/MySQL/SNMP based network monitoring which includes support for a wide range of network hardware and operating systems including Cisco, Linux, FreeBSD, Juniper, Brocade, Foundry, HP and many more.<br>LibreNMS is a community-based fork of Observium.<br><br>We intend LibreNMS to be a viable project and community that:<ul><li>encourages contribution,</li><li>focuses on the needs of its users,</li><li>offers a welcoming, friendly environment for everyone.</li></ul><br>The Debian Social Contract will be the basis of our priority system, and mutual respect is the basis of our behaviour towards others.<br>For more about the culture we're trying to build, please read the Freenode philosophy,including guidelines for running an IRC channel and being a community catalyst.</p>" - }, - { - "language": "fr", - "briefDescription": "Autodiscovering SNMP based network monitoring tool", - "fullDescription": "<p>LibreNMS is an autodiscovering PHP/MySQL/SNMP based network monitoring which includes support for a wide range of network hardware and operating systems including Cisco, Linux, FreeBSD, Juniper, Brocade, Foundry, HP and many more.<br>LibreNMS is a community-based fork of Observium.<br><br>We intend LibreNMS to be a viable project and community that:<ul><li>encourages contribution,</li><li>focuses on the needs of its users,</li><li>offers a welcoming, friendly environment for everyone.</li></ul><br>The Debian Social Contract will be the basis of our priority system, and mutual respect is the basis of our behaviour towards others.<br>For more about the culture we're trying to build, please read the Freenode philosophy,including guidelines for running an IRC channel and being a community catalyst.</p>" - }, - { - "language": "pl", - "briefDescription": "Autodiscovering SNMP based network monitoring tool", - "fullDescription": "<p>LibreNMS is an autodiscovering PHP/MySQL/SNMP based network monitoring which includes support for a wide range of network hardware and operating systems including Cisco, Linux, FreeBSD, Juniper, Brocade, Foundry, HP and many more.<br>LibreNMS is a community-based fork of Observium.<br><br>We intend LibreNMS to be a viable project and community that:<ul><li>encourages contribution,</li><li>focuses on the needs of its users,</li><li>offers a welcoming, friendly environment for everyone.</li></ul><br>The Debian Social Contract will be the basis of our priority system, and mutual respect is the basis of our behaviour towards others.<br>For more about the culture we're trying to build, please read the Freenode philosophy,including guidelines for running an IRC channel and being a community catalyst.</p>" - } - ], - "tags": [ - "management", - "monitoring" - ] - }, - "application": { - "id": null, - "name": "LibreNMS", - "version": "1.47", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Default username", - "type": "textfield", - "input": true, - "key": "librenms#default#USER", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default user password", - "type": "password", - "input": true, - "key": "librenms#default#PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default user email", - "type": "email", - "input": true, - "key": "librenms#default#EMAIL", - "tab": 0, - "validate": { - "required": false - }, - "inputFormat": "plain" - } - ] - }, - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Targets", - "hideLabel": true, - "tab": 0, - "disableAddingRemovingRows": false, - "addAnother": "Add device", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "type": "datagrid", - "input": true, - "key": "targets", - "validate": { - "required": true - }, - "components": [ - { - "label": "Device (IP address)", - "hideLabel": true, - "tableView": true, - "type": "textfield", - "input": true, - "tab": 0, - "key": "ipAddress", - "placeholder": "127.0.0.1", - "defaultValue": "", - "validate": { - "required": true, - "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", - "unique": false, - "customMessage": "", - "json": "" - }, - "inputFormat": "plain" - }, - { - "label": "SNMP community", - "type": "textfield", - "input": true, - "key": "snmpCommunity", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "SNMP version", - "placeholder": "Select SNMP version", - "tableView": true, - "type": "select", - "input": true, - "key": "snmpVersion", - "defaultValue": "", - "validate": { - "required": true - }, - "data": { - "values": [ - { - "label": "v1", - "value": "v1" - }, - { - "label": "v2c", - "value": "v2c" - }, - { - "label": "v3", - "value": "v3" - } - ] - }, - "valueProperty": "value", - "tab": 0 - } - ] - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 20GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-librenms", - "version": "2.0.1" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 20, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "LibreNMS", - "tag": "librenms", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "templates": [ - { - "configFileName": "addhosts.cfg", - "configFileTemplateContent": "<#list targets as target>\n-f ${target.ipAddress} ${target.snmpCommunity} ${target.snmpVersion}\n</#list>" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app05-prometheus.json b/src/test/shell/data/apps/app01-prometheus.json similarity index 99% rename from src/test/shell/data/apps/app05-prometheus.json rename to src/test/shell/data/apps/app01-prometheus.json index bc8593099e65844e5a5afc9b77db558688677122..8be46a089aea684450e0f805d9f78e2d08f5fd32 100644 --- a/src/test/shell/data/apps/app05-prometheus.json +++ b/src/test/shell/data/apps/app01-prometheus.json @@ -7,7 +7,7 @@ "wwwUrl": "https://prometheus.io", "sourceUrl": "https://github.com/prometheus/prometheus", "issuesUrl": "https://github.com/prometheus/prometheus/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Prometheus", + "nmaasDocumentationUrl": "https://docs.nmaas.eu/nmaas-applications/tutorials/prometheus/", "descriptions": [ { "language": "en", diff --git a/src/test/shell/data/apps/app06-grafana.json b/src/test/shell/data/apps/app02-grafana.json similarity index 83% rename from src/test/shell/data/apps/app06-grafana.json rename to src/test/shell/data/apps/app02-grafana.json index 95c02291b264963de57eb0ac8d0dc35938b1522d..b8642bddb10307b452995e4986645a077fd25d28 100644 --- a/src/test/shell/data/apps/app06-grafana.json +++ b/src/test/shell/data/apps/app02-grafana.json @@ -7,7 +7,7 @@ "wwwUrl": "https://grafana.com/", "sourceUrl": "https://github.com/grafana/grafana", "issuesUrl": "https://github.com/grafana/grafana/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Grafana", + "nmaasDocumentationUrl": "https://docs.nmaas.eu/nmaas-applications/tutorials/grafana/", "descriptions": [ { "language": "en", @@ -38,7 +38,7 @@ "application": { "id": null, "name": "Grafana", - "version": "6.5.2", + "version": "11.0.0", "configWizardTemplate": { "template": { "components": [ @@ -103,7 +103,7 @@ "optionsLabelPosition": "right", "values": [ { - "label": "NMaaS Prometheus instance", + "label": "nmaas Prometheus instance", "value": "inCluster" }, { @@ -159,47 +159,6 @@ } ] }, - { - "label": "Additional", - "key": "additionalParametersTab", - "components": [ - { - "label": "additionalParameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 1, - "key": "additionalParameters", - "components": [ - { - "label": "SMTP host (by default uses in-cluster Postfix)", - "type": "textfield", - "input": true, - "key": "smtp#host", - "inputFormat": "plain", - "defaultValue": "nmaas-postfix.nmaas-system:587", - "tab": 1 - }, - { - "label": "SMTP username", - "type": "textfield", - "input": true, - "key": "smtp#user", - "inputFormat": "plain", - "tab": 1 - }, - { - "label": "SMTP user password", - "type": "password", - "input": true, - "key": "smtp#password", - "inputFormat": "plain", - "tab": 1 - } - ] - } - ] - }, { "label": "Advanced", "key": "advancedTab", @@ -249,9 +208,13 @@ "kubernetesTemplate": { "chart": { "name": "nmaas-grafana", - "version": "2.0.1" + "version": "8.0.0" } }, + "globalDeployParameters": { + "smtp.host": "nmaas-postfix.nmaas-system:587", + "smtp.defaultFrom": "noreply-grafana@nmaas.eu" + }, "storageVolumes": [ { "type": "MAIN", diff --git a/src/test/shell/data/apps/app02-oxidized.json b/src/test/shell/data/apps/app02-oxidized.json deleted file mode 100644 index 406967607cc65d0b041a7bb2d4e2b42f017b1be8..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app02-oxidized.json +++ /dev/null @@ -1,313 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Oxidized", - "license": "Apache 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://github.com/ytti/oxidized/wiki", - "sourceUrl": "https://github.com/ytti/oxidized", - "issuesUrl": "https://github.com/ytti/oxidized/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Oxidized", - "descriptions": [ - { - "language": "en", - "briefDescription": "Network device configuration backup tool", - "fullDescription": "Oxidized is a network device configuration backup tool. It's a great RANCID replacement.<br>Main features:<ul><li>automatically adds/removes threads to meet configured retrieval interval</li><li>restful API to move node immediately to head-of-queue (GET/POST /node/next/[NODE])</li><li>syslog udp+file example to catch config change event (ios/junos) and trigger config fetch</li><li>will signal ios/junos user who made change, which output modules can use (via POST)</li><li>The git output module uses this info - 'git blame' will for each line show who made the change and when</li><li>restful API to reload list of nodes (GET /reload)</li><li>restful API to fetch configurations (/node/fetch/[NODE] or /node/fetch/group/[NODE])</li><li>restful API to show list of nodes (GET /nodes)</li><li>restful API to show list of version for a node (/node/version[NODE]) and diffs</li></ul>" - }, - { - "language": "de", - "briefDescription": "Network device configuration backup tool", - "fullDescription": "Oxidized is a network device configuration backup tool. It's a great RANCID replacement.<br>Main features:<ul><li>automatically adds/removes threads to meet configured retrieval interval</li><li>restful API to move node immediately to head-of-queue (GET/POST /node/next/[NODE])</li><li>syslog udp+file example to catch config change event (ios/junos) and trigger config fetch</li><li>will signal ios/junos user who made change, which output modules can use (via POST)</li><li>The git output module uses this info - 'git blame' will for each line show who made the change and when</li><li>restful API to reload list of nodes (GET /reload)</li><li>restful API to fetch configurations (/node/fetch/[NODE] or /node/fetch/group/[NODE])</li><li>restful API to show list of nodes (GET /nodes)</li><li>restful API to show list of version for a node (/node/version[NODE]) and diffs</li></ul>" - }, - { - "language": "fr", - "briefDescription": "Network device configuration backup tool", - "fullDescription": "Oxidized is a network device configuration backup tool. It's a great RANCID replacement.<br>Main features:<ul><li>automatically adds/removes threads to meet configured retrieval interval</li><li>restful API to move node immediately to head-of-queue (GET/POST /node/next/[NODE])</li><li>syslog udp+file example to catch config change event (ios/junos) and trigger config fetch</li><li>will signal ios/junos user who made change, which output modules can use (via POST)</li><li>The git output module uses this info - 'git blame' will for each line show who made the change and when</li><li>restful API to reload list of nodes (GET /reload)</li><li>restful API to fetch configurations (/node/fetch/[NODE] or /node/fetch/group/[NODE])</li><li>restful API to show list of nodes (GET /nodes)</li><li>restful API to show list of version for a node (/node/version[NODE]) and diffs</li></ul>" - }, - { - "language": "pl", - "briefDescription": "Narzędzie do tworzenia kopii zapasowej konfiguracji urządzenia sieciowego", - "fullDescription": "Oxidized is a network device configuration backup tool. It's a great RANCID replacement.<br>Main features:<ul><li>automatically adds/removes threads to meet configured retrieval interval</li><li>restful API to move node immediately to head-of-queue (GET/POST /node/next/[NODE])</li><li>syslog udp+file example to catch config change event (ios/junos) and trigger config fetch</li><li>will signal ios/junos user who made change, which output modules can use (via POST)</li><li>The git output module uses this info - 'git blame' will for each line show who made the change and when</li><li>restful API to reload list of nodes (GET /reload)</li><li>restful API to fetch configurations (/node/fetch/[NODE] or /node/fetch/group/[NODE])</li><li>restful API to show list of nodes (GET /nodes)</li><li>restful API to show list of version for a node (/node/version[NODE]) and diffs</li></ul>" - } - ], - "tags": [ - "management", - "backup", - "configuration" - ] - }, - "application": { - "id": null, - "name": "Oxidized", - "version": "0.28.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Access credentials", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "accessCredentials", - "components": [ - { - "label": "Oxidized access username", - "type": "textfield", - "input": true, - "key": "accessUsername", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Oxidized access password", - "type": "password", - "input": true, - "key": "accessPassword", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - }, - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Device access username", - "type": "textfield", - "input": true, - "key": "oxidizedUsername", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Device access password", - "type": "password", - "input": true, - "key": "oxidizedPassword", - "tab": 0, - "validate": { - "required": true - } - }, - { - "label": "Targets", - "hideLabel": true, - "disableAddingRemovingRows": false, - "addAnother": "Add device", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "alwaysEnabled": false, - "type": "datagrid", - "input": true, - "key": "targets", - "tab": 0, - "defaultValue": [ - { - "ipAddress": "" - } - ], - "validate": { - "required": true - }, - "components": [ - { - "label": "Device (IP address)", - "hideLabel": true, - "tableView": true, - "type": "textfield", - "input": true, - "key": "ipAddress", - "placeholder": "127.0.0.1", - "tab": 0, - "defaultValue": "", - "validate": { - "required": true, - "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" - }, - "inputFormat": "plain", - "row": "0-0" - } - ] - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 1GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": { - "template": { - "components": [ - { - "label": "Access credentials", - "hideLabel": false, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "accessCredentials", - "components": [ - { - "label": "Oxidized access username", - "type": "textfield", - "input": true, - "key": "accessUsername", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Oxidized access password", - "type": "password", - "input": true, - "key": "accessPassword", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-oxidized", - "version": "2.0.1" - } - }, - "globalDeployParameters": { - "image.tag": "0.28.0" - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Oxidized", - "tag": "oxidized", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "config", - "configFileDirectory": "base", - "configFileTemplateContent": "---\nusername: ${oxidizedUsername}\npassword: ${oxidizedPassword}\nmodel: junos\ninterval: 600\nuse_syslog: false\ndebug: false\nthreads: 30\ntimeout: 20\nretries: 3\nprompt: !ruby/regexp /^([\\w.@-]+[#>]\\s?)$/\nrest: 0.0.0.0:8888\nvars: {}\ngroups: {}\npid: \"/storage/pid\"\ninput:\n default: ssh, telnet\n debug: false\n ssh:\n secure: false\noutput:\n default: git\n file:\n directory: \"/storage/configs\"\n git:\n user: oxidized\n email: oxidized@man.poznan.pl\n repo: \"/storage/oxidized.git\"\nsource:\n default: csv\n csv:\n file: \"/root/.config/oxidized/router.db\"\n delimiter: !ruby/regexp /:/\n map:\n name: 0\n model: 1\nmodel_map:\n cisco: ios\n juniper: junos" - }, - { - "configFileName": "router.db", - "configFileDirectory": "base", - "configFileTemplateContent": "<#list targets as target>\n${target.ipAddress}:junos\n</#list>" - }, - { - "configFileName": "readme.txt", - "configFileDirectory": "model", - "configFileTemplateContent": "Specific model specification files should be placed in this directory" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app03-nav.json b/src/test/shell/data/apps/app03-nav.json deleted file mode 100644 index 1adeb72a1006934a7cd9d98cf2c31fb1f48f9d95..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app03-nav.json +++ /dev/null @@ -1,183 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "NAV", - "license": "GPL 3.0", - "licenseUrl": "https://www.gnu.org/licenses/gpl-3.0.html", - "wwwUrl": "https://nav.uninett.no/", - "sourceUrl": "https://github.com/UNINETT/nav", - "issuesUrl": "https://github.com/UNINETT/nav/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-NAV", - "descriptions": [ - { - "language": "en", - "briefDescription": "Network Administration Visualized - network management system", - "fullDescription": "Network Administration Visualized is an advanced software suite to monitor large computer networks. It automatically discovers network topology, monitors network load and outages, and can send alerts on network events by e-mail and SMS, allowing for flexible configuration of alert profiles." - }, - { - "language": "de", - "briefDescription": "Network Administration Visualized - network management system", - "fullDescription": "Network Administration Visualized is an advanced software suite to monitor large computer networks. It automatically discovers network topology, monitors network load and outages, and can send alerts on network events by e-mail and SMS, allowing for flexible configuration of alert profiles." - }, - { - "language": "fr", - "briefDescription": "Network Administration Visualized - network management system", - "fullDescription": "Network Administration Visualized is an advanced software suite to monitor large computer networks. It automatically discovers network topology, monitors network load and outages, and can send alerts on network events by e-mail and SMS, allowing for flexible configuration of alert profiles." - }, - { - "language": "pl", - "briefDescription": "Network Administration Visualized - system do zarządzania siecią", - "fullDescription": "Network Administration Visualized is an advanced software suite to monitor large computer networks. It automatically discovers network topology, monitors network load and outages, and can send alerts on network events by e-mail and SMS, allowing for flexible configuration of alert profiles." - } - ], - "tags": [ - "management", - "monitoring" - ] - }, - "application": { - "id": null, - "name": "NAV", - "version": "4.8.6", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>All required configuration should be applied using NAV graphical interface</p>", - "tab": 0 - } - ] - }, - { - "label": "Additional", - "key": "additionalParametersTab", - "components": [ - { - "label": "additionalParameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 2, - "key": "additionalParameters", - "components": [ - { - "label": "Admin email", - "type": "email", - "input": true, - "key": "nav#config#ADMIN_MAIL", - "inputFormat": "plain", - "tab": 2 - }, - { - "label": "Default sender email", - "type": "email", - "input": true, - "key": "nav#config#DEFAULT_FROM_EMAIL", - "inputFormat": "plain", - "tab": 2 - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 20GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nav", - "version": "2.0.1" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 20, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "deployParameters": { - "SMTP_HOSTNAME": "nav.config.EMAIL_HOST", - "SMTP_PORT": "nav.config.EMAIL_PORT", - "SMTP_USERNAME": "nav.config.EMAIL_HOST_USER", - "SMTP_PASSWORD": "nav.config.EMAIL_HOST_PASSWORD" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "NAV", - "tag": "nav", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app26-uptime-kuma.json b/src/test/shell/data/apps/app03-uptime-kuma.json similarity index 98% rename from src/test/shell/data/apps/app26-uptime-kuma.json rename to src/test/shell/data/apps/app03-uptime-kuma.json index 5986f426dc0534793b4121df45920636008c35cc..6033a1354ec2f8ddc356486d6d28a4efece5413a 100644 --- a/src/test/shell/data/apps/app26-uptime-kuma.json +++ b/src/test/shell/data/apps/app03-uptime-kuma.json @@ -7,7 +7,7 @@ "wwwUrl": "https://uptime.kuma.pet/docs/", "sourceUrl": "https://github.com/louislam/uptime-kuma", "issuesUrl": "https://github.com/louislam/uptime-kuma/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-UptimeKuma", + "nmaasDocumentationUrl": "https://docs.nmaas.eu/nmaas-applications/tutorials/uptime-kuma/", "descriptions": [ { "language": "en", @@ -40,7 +40,7 @@ "application": { "id": null, "name": "Uptime Kuma", - "version": "1.21.3", + "version": "1.23.11", "configWizardTemplate": { "template": { "components": [ @@ -148,7 +148,7 @@ "kubernetesTemplate": { "chart": { "name": "nmaas-uptimekuma", - "version": "2.0.0" + "version": "2.0.1" } }, "deployParameters": { diff --git a/src/test/shell/data/apps/app30-healthchecks.json b/src/test/shell/data/apps/app04-healthchecks.json similarity index 98% rename from src/test/shell/data/apps/app30-healthchecks.json rename to src/test/shell/data/apps/app04-healthchecks.json index dc0c642af640be0c862ca32ea9ffe25a25c115ac..64858748a9afac3d564c7e73fc6619015913b21d 100644 --- a/src/test/shell/data/apps/app30-healthchecks.json +++ b/src/test/shell/data/apps/app04-healthchecks.json @@ -7,7 +7,7 @@ "wwwUrl": "https://healthchecks.io/", "sourceUrl": "https://github.com/healthchecks/healthchecks", "issuesUrl": "https://github.com/healthchecks/healthchecks/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Healthchecks", + "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/nmaas+Tools#nmaasTools-Healthchecks", "descriptions": [ { "language": "en", @@ -40,7 +40,7 @@ "application": { "id": null, "name": "Healthchecks", - "version": "2.1", + "version": "3.1.0", "configWizardTemplate": { "template": { "components": [ @@ -170,7 +170,7 @@ "kubernetesTemplate": { "chart": { "name": "nmaas-healthchecks", - "version": "1.0.2" + "version": "1.1.0" }, "mainDeploymentName": "nmaas-healthchecks" }, diff --git a/src/test/shell/data/apps/app04-opennti.json b/src/test/shell/data/apps/app04-opennti.json deleted file mode 100644 index 85cd1c993dda3b8f4b813c919fb5f64bd5e95c3f..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app04-opennti.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "OpenNTI", - "license": "Apache 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "http://open-nti.readthedocs.io/en/latest", - "sourceUrl": "https://github.com/Juniper/open-nti", - "issuesUrl": "https://github.com/Juniper/open-nti/issues", - "nmaasDocumentationUrl": null, - "descriptions": [ - { - "language": "en", - "briefDescription": "Open Network Telemetry Collector built with open source tools.", - "fullDescription": "OpenNTI is a container packaged with all tools needed to collect and visualize time series data from network devices. Data can be collected from different sources: Data Collection Agent - Collect data on devices using CLI/Shell or Netconf, Data Streaming Collector - Take all data streamed by Juniper devices as Input (JTI, Analyticsd, soon Openconfig with gRPC) or Statsd interface - Accept any Statsd packets. It's pre-configured with all tools and with a default dashboard .. Send it data, it will graph it" - }, - { - "language": "de", - "briefDescription": "Open Network Telemetry Collector built with open source tools.", - "fullDescription": "OpenNTI is a container packaged with all tools needed to collect and visualize time series data from network devices. Data can be collected from different sources: Data Collection Agent - Collect data on devices using CLI/Shell or Netconf, Data Streaming Collector - Take all data streamed by Juniper devices as Input (JTI, Analyticsd, soon Openconfig with gRPC) or Statsd interface - Accept any Statsd packets. It's pre-configured with all tools and with a default dashboard .. Send it data, it will graph it" - }, - { - "language": "fr", - "briefDescription": "Open Network Telemetry Collector built with open source tools.", - "fullDescription": "OpenNTI is a container packaged with all tools needed to collect and visualize time series data from network devices. Data can be collected from different sources: Data Collection Agent - Collect data on devices using CLI/Shell or Netconf, Data Streaming Collector - Take all data streamed by Juniper devices as Input (JTI, Analyticsd, soon Openconfig with gRPC) or Statsd interface - Accept any Statsd packets. It's pre-configured with all tools and with a default dashboard .. Send it data, it will graph it" - }, - { - "language": "pl", - "briefDescription": "Open Network Telemetry Collector napisany za pomocą narzędzi open source.", - "fullDescription": "OpenNTI is a container packaged with all tools needed to collect and visualize time series data from network devices. Data can be collected from different sources: Data Collection Agent - Collect data on devices using CLI/Shell or Netconf, Data Streaming Collector - Take all data streamed by Juniper devices as Input (JTI, Analyticsd, soon Openconfig with gRPC) or Statsd interface - Accept any Statsd packets. It's pre-configured with all tools and with a default dashboard .. Send it data, it will graph it" - } - ], - "tags": [ - "management", - "monitoring", - "telemetry" - ] - }, - "application": { - "id": null, - "name": "OpenNTI", - "version": "0.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Default user username", - "type": "textfield", - "key": "openntiUsername", - "input": true, - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Default user password", - "type": "password", - "key": "openntiPassword", - "input": true, - "inputFormat": "plain", - "validate": { - "required": true - } - } - ] - }, - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Targets", - "hideLabel": true, - "tab": 0, - "disableAddingRemovingRows": false, - "addAnother": "Add device", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "type": "datagrid", - "input": true, - "key": "inputs#snmp", - "validate": { - "required": true - }, - "components": [ - { - "label": "Agent (IP address)", - "hideLabel": true, - "tableView": true, - "type": "textfield", - "input": true, - "tab": 0, - "key": "agents", - "placeholder": "127.0.0.1", - "defaultValue": "", - "validate": { - "required": true, - "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", - "unique": false, - "customMessage": "", - "json": "" - }, - "inputFormat": "plain" - }, - { - "label": "SNMP community", - "type": "textfield", - "input": true, - "key": "community", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "SNMP version", - "placeholder": "Select SNMP version", - "tableView": true, - "type": "select", - "input": true, - "key": "version", - "defaultValue": "", - "validate": { - "required": true - }, - "data": { - "values": [ - { - "label": "1", - "value": "1" - }, - { - "label": "2c", - "value": "2c" - }, - { - "label": "3", - "value": "3" - } - ] - }, - "valueProperty": "value", - "tab": 0 - }, - { - "label": "SNMP name", - "placeholder": "Select SNMP name", - "tableView": true, - "type": "textfield", - "input": true, - "key": "name", - "defaultValue": "", - "validate": { - "required": true - } - }, - { - "label": "Fields", - "hideLabel": false, - "disableAddingRemovingRows": false, - "addAnother": "Add field", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "alwaysEnabled": false, - "type": "datagrid", - "input": true, - "key": "field", - "defaultValue": [], - "components": [ - { - "label": "Field name", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "key": "name", - "row": "0-4" - }, - { - "label": "Field oid", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "key": "oid", - "validate": { - "pattern": "^.[0-9][0-9.]*[0-9]" - }, - "row": "0-0" - } - ], - "row": "0-5" - } - ] - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 20GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-opennti", - "version": "0.0.2-alfa" - } - }, - "defaultStorageSpace": 20, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "OpenNTI", - "tag": "opennti", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "templates": [ - { - "configFileName": "hosts.yaml", - "configFileTemplateContent": "<#list targets as target>\n${target.ipAddress}: generic\n</#list>" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app36-postgresql.json b/src/test/shell/data/apps/app05-postgresql.json similarity index 96% rename from src/test/shell/data/apps/app36-postgresql.json rename to src/test/shell/data/apps/app05-postgresql.json index 18ccd220577b86d50174dec91b7ab91ab008a806..3b2a0b6f74b7d89cc263335aa71dcbcd083d4b09 100644 --- a/src/test/shell/data/apps/app36-postgresql.json +++ b/src/test/shell/data/apps/app05-postgresql.json @@ -7,7 +7,7 @@ "wwwUrl": "https://www.postgresql.org/", "sourceUrl": "https://github.com/postgres/postgres", "issuesUrl": "https://www.postgresql.org/list/", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#PostgreSQL", + "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/nmaas+Tools#PostgreSQL", "descriptions": [ { "language": "en", @@ -31,10 +31,7 @@ } ], "tags": [ - "DBMS", - "Relational Database", - "SQL", - "Development Tools" + "DBMS", "Relational Database", "Development Tools", "SQL" ] }, "application": { @@ -138,21 +135,16 @@ "url": "https://artifactory.software.geant.org/artifactory/nmaas-helm-mirror" } }, - "deployParameters": { - "DOMAIN_CODENAME": "primary.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%" - }, - "globalDeployParameters": { - "primary.persistence.size": "8Gi", - "primary.service.type": "LoadBalancer" - }, - "storageVolumes": [], - "exposesWebUI": true, "allowSshAccess": false, + "allowLogAccess": false, + "exposesWebUI": true, + "storageVolumes": [], "accessMethods": [ { "type": "INTERNAL", "name": "ip", "tag": "postgresql", + "conditionType": "NONE", "deployParameters": { "K8S_SERVICE_PORT": "22" } @@ -161,17 +153,25 @@ "type": "LOCAL", "name": "service", "tag": "postgresql", + "conditionType": "NONE", "deployParameters": { "K8S_SERVICE_PORT": "22" } } - ] + ], + "deployParameters": { + "DOMAIN_CODENAME": "primary.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%" + }, + "globalDeployParameters": { + "primary.persistence.size": "8Gi", + "primary.service.type": "LoadBalancer" + } }, "appConfigurationSpec": { + "templates": [], "configFileRepositoryRequired": false, "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] + "termsAcceptanceRequired": false } } -} +} \ No newline at end of file diff --git a/src/test/shell/data/apps/app06-grafana_v7.2.0.json b/src/test/shell/data/apps/app06-grafana_v7.2.0.json deleted file mode 100644 index cd2c2b922c32b733825c7fc2aa705f0e714e7ee0..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app06-grafana_v7.2.0.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "id": null, - "name": "Grafana", - "version": "7.2.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Grafana admin username", - "type": "textfield", - "key": "adminUser", - "input": true, - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Grafana admin password", - "type": "password", - "key": "adminPassword", - "input": true, - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Access options", - "type": "radio", - "input": true, - "tableView": true, - "inputType": "radio", - "key": "accessmethods#public#grafana", - "values": [ - { - "value": "yes", - "label": "Public" - }, - { - "value": "no", - "label": "VPN" - } - ], - "defaultValue": "yes", - "validate": { - "required": true - }, - "labelPosition": "top", - "optionsLabelPosition": "right" - } - ] - }, - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Connect to existing Prometheus instance", - "type": "checkbox", - "defaultValue": false, - "key": "use_name", - "input": true, - "inputFormat": "plain" - }, - { - "label": "Existing Prometheus instance", - "hideLabel": true, - "optionsLabelPosition": "right", - "values": [ - { - "label": "NMaaS Prometheus instance", - "value": "inCluster" - }, - { - "label": "External Prometheus instance", - "value": "external" - } - ], - "inline": true, - "type": "radio", - "key": "prometheus", - "defaultValue": "external", - "conditional": { - "show": true, - "when": "use_name", - "eq": true - } - }, - { - "label": "Data source name", - "type": "textfield", - "input": true, - "key": "source_name", - "validate": { - "required": true - }, - "inputFormat": "plain", - "customConditional": "show = (row.use_name === true)" - }, - { - "label": "Prometheus instance address", - "type": "textfield", - "input": true, - "key": "prom_ext_addr", - "validate": { - "required": true - }, - "inputFormat": "plain", - "customConditional": "show = (row.use_name === true && row.prometheus === 'external')" - }, - { - "label": "Select Prometheus instance", - "type": "select", - "key": "prom_int_addr", - "data": { - "values": "insert-app-instances-here" - }, - "validate": { - "required": true - }, - "customConditional": "show = (row.use_name === true && row.prometheus === 'inCluster')" - } - ] - } - ] - }, - { - "label": "Additional", - "key": "additionalParametersTab", - "components": [ - { - "label": "additionalParameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 1, - "key": "additionalParameters", - "components": [ - { - "label": "SMTP host (by default uses in-cluster Postfix)", - "type": "textfield", - "input": true, - "key": "smtp#host", - "inputFormat": "plain", - "defaultValue": "nmaas-postfix.nmaas-system:587", - "tab": 1 - }, - { - "label": "SMTP username", - "type": "textfield", - "input": true, - "key": "smtp#user", - "inputFormat": "plain", - "tab": 1 - }, - { - "label": "SMTP user password", - "type": "password", - "input": true, - "key": "smtp#password", - "inputFormat": "plain", - "tab": 1 - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 2, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 1GB", - "tab": 2 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-grafana", - "version": "2.0.1" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "globalDeployParameters": { - "image.tag": "7.2.0" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "PUBLIC", - "name": "Grafana", - "tag": "grafana", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "templates": [ - { - "configFileName": "datasource.yaml", - "configFileTemplateContent": "<#if source_name?has_content>apiVersion: 1\ndeleteDatasources:\n - name: ${source_name}\n orgId: 1\ndatasources:\n- name: ${source_name}\n type: prometheus\n access: proxy\n orgId: 1\n url: \"http://<#if prom_ext_addr?has_content>${prom_ext_addr}<#else>${prom_int_addr}</#if>\"\n basicAuth: false\n isDefault: true\n version: 1\n editable: true</#if>" - } - ] - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app07-bastion.json b/src/test/shell/data/apps/app07-bastion.json deleted file mode 100644 index 1e231d7f5cf8d66aeeda111bc8af7b17e8d695cf..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app07-bastion.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Bastion-NG", - "license": "MIT License", - "licenseUrl": "https://opensource.org/license/mit/", - "wwwUrl": "https://github.com/nmaas-platform/nmaas-bastion-ng", - "sourceUrl": "https://github.com/nmaas-platform/nmaas-bastion-ng", - "issuesUrl": "https://github.com/nmaas-platform/nmaas-bastion-ng/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#Bastion-NG", - "descriptions": [ - { - "language": "en", - "briefDescription": "Bastion-NG is next-generation versatile Bastion container", - "fullDescription": "Bastion-NG can serve multiple purposes, including a remote development environment (via VSCode), jump host for accessing firewalled resources, or simply as a testing ground for new software." - }, - { - "language": "de", - "briefDescription": "Bastion-NG is next-generation versatile Bastion container", - "fullDescription": "Bastion-NG can serve multiple purposes, including a remote development environment (via VSCode), jump host for accessing firewalled resources, or simply as a testing ground for new software." - }, - { - "language": "fr", - "briefDescription": "Bastion-NG is next-generation versatile Bastion container", - "fullDescription": "Bastion-NG can serve multiple purposes, including a remote development environment (via VSCode), jump host for accessing firewalled resources, or simply as a testing ground for new software." - }, - { - "language": "pl", - "briefDescription": "Bastion-NG is next-generation versatile Bastion container", - "fullDescription": "Bastion-NG can serve multiple purposes, including a remote development environment (via VSCode), jump host for accessing firewalled resources, or simply as a testing ground for new software." - } - ], - "tags": [ - "Bastion", - "Jump Host", - "Remote Development", - "SSH" - ] - }, - "application": { - "id": null, - "name": "Bastion-NG", - "version": "22.04.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "Username", - "type": "textfield", - "input": true, - "key": "properties#username", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - }, - { - "label": "SSH keys (comma separated)", - "type": "textfield", - "input": true, - "key": "properties#ssh_keys", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-bastion-ng", - "version": "3.0.1" - }, - "mainDeploymentName": "nmaas-bastion-ng" - }, - "deployParameters": { - "DOMAIN_CODENAME": "service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%" - }, - "globalDeployParameters": { - "persistence.size": "10Gi", - "properties.flavor": "python", - "service.type": "LoadBalancer" - }, - "storageVolumes": [], - "exposesWebUI": false, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "INTERNAL", - "name": "SSH", - "tag": "bastion", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-bastion-ng", - "K8S_SERVICE_PORT": "22" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} diff --git a/src/test/shell/data/apps/app08-perfsonar-pwa.json b/src/test/shell/data/apps/app08-perfsonar-pwa.json deleted file mode 100644 index 3f8977807139e12571f062a6bf47af2466dbf09b..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app08-perfsonar-pwa.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "pSConfig Web Admin", - "license": "Apache 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "http://docs.perfsonar.net/pwa.html", - "sourceUrl": "https://github.com/perfsonar/psconfig-web", - "issuesUrl": "https://github.com/perfsonar/psconfig-web/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-pSConfigWebAdmin(perfSONAR)", - "descriptions": [ - { - "language": "en", - "briefDescription": "Web-based UI for perfSONAR administrators", - "fullDescription": "pSConfig Web Admin (PWA) is a web-based UI for perfSONAR administrators to define and publish MeshConfig/pSConfig meshes, which automates tests executed by test nodes, and provides topology information to various services, such as MadDash.<br>In addition to providing a user-friendly interface for creating pSConfig/MeshConfig output to define meshes, PWA allows multiple users to collaborate on the configuration of testspecs, host groups, and configs. Users can be designated super-admins or normal users, depending on how much access they need. It is also possible to allow users to edit some meshes, but not others." - }, - { - "language": "de", - "briefDescription": "Web-based UI for perfSONAR administrators", - "fullDescription": "pSConfig Web Admin (PWA) is a web-based UI for perfSONAR administrators to define and publish MeshConfig/pSConfig meshes, which automates tests executed by test nodes, and provides topology information to various services, such as MadDash.<br>In addition to providing a user-friendly interface for creating pSConfig/MeshConfig output to define meshes, PWA allows multiple users to collaborate on the configuration of testspecs, host groups, and configs. Users can be designated super-admins or normal users, depending on how much access they need. It is also possible to allow users to edit some meshes, but not others." - }, - { - "language": "fr", - "briefDescription": "Web-based UI for perfSONAR administrators", - "fullDescription": "pSConfig Web Admin (PWA) is a web-based UI for perfSONAR administrators to define and publish MeshConfig/pSConfig meshes, which automates tests executed by test nodes, and provides topology information to various services, such as MadDash.<br>In addition to providing a user-friendly interface for creating pSConfig/MeshConfig output to define meshes, PWA allows multiple users to collaborate on the configuration of testspecs, host groups, and configs. Users can be designated super-admins or normal users, depending on how much access they need. It is also possible to allow users to edit some meshes, but not others." - }, - { - "language": "pl", - "briefDescription": "Web-based UI for perfSONAR administrators", - "fullDescription": "pSConfig Web Admin (PWA) is a web-based UI for perfSONAR administrators to define and publish MeshConfig/pSConfig meshes, which automates tests executed by test nodes, and provides topology information to various services, such as MadDash.<br>In addition to providing a user-friendly interface for creating pSConfig/MeshConfig output to define meshes, PWA allows multiple users to collaborate on the configuration of testspecs, host groups, and configs. Users can be designated super-admins or normal users, depending on how much access they need. It is also possible to allow users to edit some meshes, but not others." - } - ], - "tags": [ - "management", - "configuration" - ] - }, - "application": { - "id": null, - "name": "pSConfig Web Admin", - "version": "4.2.4", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Default username", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#env#username", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default password", - "type": "password", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#env#password", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default email", - "type": "email", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#env#email", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 1GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-perfsonar-pwa", - "version": "2.1.0" - }, - "mainDeploymentName": "pwa-admin" - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "nmaas-perfsonar-centralmanagement-sca-auth.persistence.enabled", - "PERSISTENCE_NAME": "nmaas-perfsonar-centralmanagement-sca-auth.persistence.name", - "PERSISTENCE_STORAGE_CLASS": "nmaas-perfsonar-centralmanagement-sca-auth.persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "nmaas-perfsonar-centralmanagement-sca-auth.persistence.size" - } - }, - { - "type": "SHARED", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "nmaas-perfsonar-centralmanagement-pwa-pub.persistence.enabled", - "PERSISTENCE_NAME": "nmaas-perfsonar-centralmanagement-pwa-pub.persistence.name", - "PERSISTENCE_STORAGE_CLASS": "nmaas-perfsonar-centralmanagement-pwa-pub.persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "nmaas-perfsonar-centralmanagement-pwa-pub.persistence.size" - } - }, - { - "type": "SHARED", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "nmaas-perfsonar-centralmanagement-pwa-admin.persistence.enabled", - "PERSISTENCE_NAME": "nmaas-perfsonar-centralmanagement-pwa-admin.persistence.name", - "PERSISTENCE_STORAGE_CLASS": "nmaas-perfsonar-centralmanagement-pwa-admin.persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "nmaas-perfsonar-centralmanagement-pwa-admin.persistence.size" - } - }, - { - "type": "SHARED", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "nmaas-perfsonar-centralmanagement-nginx.persistence.enabled", - "PERSISTENCE_NAME": "nmaas-perfsonar-centralmanagement-nginx.persistence.name", - "PERSISTENCE_STORAGE_CLASS": "nmaas-perfsonar-centralmanagement-nginx.persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "nmaas-perfsonar-centralmanagement-nginx.persistence.size" - } - } - ], - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "PWA", - "tag": "pwa", - "deployParameters": { - "INGRESS_ENABLED": "nmaas-perfsonar-centralmanagement-nginx.ingress.enabled", - "INGRESS_HOSTS": "nmaas-perfsonar-centralmanagement-nginx.ingress.hosts", - "INGRESS_TLS_ENABLED": "nmaas-perfsonar-centralmanagement-nginx.ingress.tls.enabled", - "INGRESS_CLASS": "nmaas-perfsonar-centralmanagement-nginx.ingress.class", - "INGRESS_LETSENCRYPT": "nmaas-perfsonar-centralmanagement-nginx.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "nmaas-perfsonar-centralmanagement-nginx.ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app09-librebooking.json b/src/test/shell/data/apps/app09-librebooking.json deleted file mode 100644 index 9f5bb5c5e78344c2f17a3ea249e14f4d2d6cbd16..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app09-librebooking.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "LibreBooking", - "license": "GPL 3.0", - "licenseUrl": "https://www.gnu.org/licenses/gpl-3.0.html", - "wwwUrl": "https://www.bookedscheduler.com", - "sourceUrl": "https://github.com/LibreBooking/app", - "issuesUrl": "https://github.com/LibreBooking/app/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Booked", - "descriptions": [ - { - "language": "en", - "briefDescription": "Web-based calendar and schedule", - "fullDescription": "A web-based calendar and resource scheduling system that allows administered management of reservations on any number of resources. Typical applications are conference room or machine reservation management." - }, - { - "language": "de", - "briefDescription": "Web-based calendar and schedule", - "fullDescription": "A web-based calendar and resource scheduling system that allows administered management of reservations on any number of resources. Typical applications are conference room or machine reservation management." - }, - { - "language": "fr", - "briefDescription": "Web-based calendar and schedule", - "fullDescription": "A web-based calendar and resource scheduling system that allows administered management of reservations on any number of resources. Typical applications are conference room or machine reservation management." - }, - { - "language": "pl", - "briefDescription": "Web-based calendar and schedule", - "fullDescription": "A web-based calendar and resource scheduling system that allows administered management of reservations on any number of resources. Typical applications are conference room or machine reservation management." - } - ], - "tags": [ - "management", - "calendar" - ] - }, - "application": { - "id": null, - "name": "LibreBooking", - "version": "2.8.5", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Administrator user email address", - "type": "email", - "input": true, - "key": "booked#config#BOOKED_ADMIN_EMAIL", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - }, - { - "type": "htmlelement", - "input": false, - "content": "<p>Default credentials for administrator user are: admin/password</p>", - "tab": 0 - }, - { - "label": "Enable email notifications", - "type": "checkbox", - "defaultValue": true, - "input": true, - "key": "booked#config#BOOKED_ENABLE_EMAIL", - "inputFormat": "plain", - "tab": 0 - }, - { - "label": "Enable user registration", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "booked#config#BOOKED_REGISTRATION", - "inputFormat": "plain", - "tab": 0 - }, - { - "label": "Enable use of Booked API", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "booked#config#BOOKED_ENABLE_API", - "inputFormat": "plain", - "tab": 0 - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 1GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-booked", - "version": "3.0.0" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "deployParameters": { - "BASE_URL": "baseDomain" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Booked", - "tag": "booked", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app10-spa-inventory.json b/src/test/shell/data/apps/app10-spa-inventory.json deleted file mode 100644 index 8e3bf5aa2509b70b5b5ea748d2e148ef3b5ac50e..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app10-spa-inventory.json +++ /dev/null @@ -1,173 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "SPA Inventory", - "license": "", - "licenseUrl": "", - "wwwUrl": "https://wiki.geant.org/display/NETDEV/SPA", - "sourceUrl": "", - "issuesUrl": "", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-SPAInventory", - "descriptions": [ - { - "language": "en", - "briefDescription": "Resource and Service Inventory with TMF-compliant API", - "fullDescription": "SPA Inventory - a database that stores the information about topology resources and service instances and offers TMF Open APIs for standardised access." - }, - { - "language": "de", - "briefDescription": "Resource and Service Inventory with TMF-compliant API", - "fullDescription": "SPA Inventory - a database that stores the information about topology resources and service instances and offers TMF Open APIs for standardised access." - }, - { - "language": "fr", - "briefDescription": "Resource and Service Inventory with TMF-compliant API", - "fullDescription": "SPA Inventory - a database that stores the information about topology resources and service instances and offers TMF Open APIs for standardised access." - }, - { - "language": "pl", - "briefDescription": "Resource and Service Inventory with TMF-compliant API", - "fullDescription": "SPA Inventory - a database that stores the information about topology resources and service instances and offers TMF Open APIs for standardised access." - } - ], - "tags": [ - "management", "inventory" - ] - }, - "application": { - "id": null, - "name": "SPA Inventory", - "version": "2.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Inventory access username", - "type": "textfield", - "input": true, - "key": "properties#inventory#user", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Inventory access password", - "type": "password", - "input": true, - "key": "properties#inventory#password", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 1GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-spa-inventory", - "version": "2.0.1" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 1, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "globalDeployParameters": { - "image.tag": "2.0.0" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "SPA Inventory", - "tag": "spa", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app11-statping.json b/src/test/shell/data/apps/app11-statping.json deleted file mode 100644 index e99f4208497323078c8abc647dc796b468c5adbf..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app11-statping.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Statping", - "license": "GPL 3.0", - "licenseUrl": "https://www.gnu.org/licenses/gpl-3.0.html", - "wwwUrl": "https://statping.com", - "sourceUrl": "https://github.com/statping/statping", - "issuesUrl": "https://github.com/statping/statping/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Statping", - "descriptions": [ - { - "language": "en", - "briefDescription": "Status Page & Monitoring Server", - "fullDescription": "An easy to use Status Page for your websites and applications. Statping will automatically fetch the application and render a beautiful status page with tons of features for you to build an even better status page. This Status Page generator allows you to use MySQL, Postgres, or SQLite on multiple operating systems." - }, - { - "language": "de", - "briefDescription": "Status Page & Monitoring Server", - "fullDescription": "An easy to use Status Page for your websites and applications. Statping will automatically fetch the application and render a beautiful status page with tons of features for you to build an even better status page. This Status Page generator allows you to use MySQL, Postgres, or SQLite on multiple operating systems." - }, - { - "language": "fr", - "briefDescription": "Status Page & Monitoring Server", - "fullDescription": "An easy to use Status Page for your websites and applications. Statping will automatically fetch the application and render a beautiful status page with tons of features for you to build an even better status page. This Status Page generator allows you to use MySQL, Postgres, or SQLite on multiple operating systems." - }, - { - "language": "pl", - "briefDescription": "Status Page & Monitoring Server", - "fullDescription": "An easy to use Status Page for your websites and applications. Statping will automatically fetch the application and render a beautiful status page with tons of features for you to build an even better status page. This Status Page generator allows you to use MySQL, Postgres, or SQLite on multiple operating systems." - } - ], - "tags": [ - "monitoring", - "visualization" - ] - }, - "application": { - "id": null, - "name": "Statping", - "version": "0.90.17", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Statping admin username", - "type": "textfield", - "input": true, - "key": "properties#statping#user", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Statping admin password", - "type": "password", - "input": true, - "key": "properties#statping#password", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 2GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-statping", - "version": "2.0.1" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 2, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Statping", - "tag": "statping", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app12-perfsonar-maddash.json b/src/test/shell/data/apps/app12-perfsonar-maddash.json deleted file mode 100644 index 98285de979971b3fa0d2d2d53d4ee19f2e7852f6..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app12-perfsonar-maddash.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "MaDDash", - "license": "", - "licenseUrl": "", - "wwwUrl": "http://docs.perfsonar.net/maddash_intro.html", - "sourceUrl": "https://github.com/perfsonar/maddash", - "issuesUrl": "https://github.com/perfsonar/maddash/issues", - "nmaasDocumentationUrl": null, - "descriptions": [ - { - "language": "en", - "briefDescription": "Monitoring and Debugging Dashboard", - "fullDescription": "The Monitoring and Debugging Dashboard (MaDDash) is a tool for collecting large amounts of inherently two-dimensional data and presenting it in visually useful ways. The project consists of the server side that schedules jobs to collect data and a web front-end to display that data. A summary of the collected data is also made available as a JSON REST API. This initial use case was collecting point-to-point network measurements published by perfSONAR and displaying them as an organized collection grids on the web front-end. These were presented with one endpoint as the row and the second endpoint as the column. In principle though, MaDDash can be extended to support any two-dimensional data." - }, - { - "language": "de", - "briefDescription": "Monitoring and Debugging Dashboard", - "fullDescription": "The Monitoring and Debugging Dashboard (MaDDash) is a tool for collecting large amounts of inherently two-dimensional data and presenting it in visually useful ways. The project consists of the server side that schedules jobs to collect data and a web front-end to display that data. A summary of the collected data is also made available as a JSON REST API. This initial use case was collecting point-to-point network measurements published by perfSONAR and displaying them as an organized collection grids on the web front-end. These were presented with one endpoint as the row and the second endpoint as the column. In principle though, MaDDash can be extended to support any two-dimensional data." - }, - { - "language": "fr", - "briefDescription": "Monitoring and Debugging Dashboard", - "fullDescription": "The Monitoring and Debugging Dashboard (MaDDash) is a tool for collecting large amounts of inherently two-dimensional data and presenting it in visually useful ways. The project consists of the server side that schedules jobs to collect data and a web front-end to display that data. A summary of the collected data is also made available as a JSON REST API. This initial use case was collecting point-to-point network measurements published by perfSONAR and displaying them as an organized collection grids on the web front-end. These were presented with one endpoint as the row and the second endpoint as the column. In principle though, MaDDash can be extended to support any two-dimensional data." - }, - { - "language": "pl", - "briefDescription": "Monitoring and Debugging Dashboard", - "fullDescription": "The Monitoring and Debugging Dashboard (MaDDash) is a tool for collecting large amounts of inherently two-dimensional data and presenting it in visually useful ways. The project consists of the server side that schedules jobs to collect data and a web front-end to display that data. A summary of the collected data is also made available as a JSON REST API. This initial use case was collecting point-to-point network measurements published by perfSONAR and displaying them as an organized collection grids on the web front-end. These were presented with one endpoint as the row and the second endpoint as the column. In principle though, MaDDash can be extended to support any two-dimensional data." - } - ], - "tags": [ - "visualization" - ] - }, - "application": { - "id": null, - "name": "MaDDash", - "version": "4.3.4", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Admin username", - "type": "textfield", - "input": true, - "key": "env#MADDASH_USERNAME", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Admin password", - "type": "password", - "input": true, - "key": "env#MADDASH_PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Log access username", - "type": "textfield", - "input": true, - "key": "env#LOG_USERNAME", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Log access password", - "type": "password", - "input": true, - "key": "env#LOG_PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Access options", - "type": "radio", - "input": true, - "tableView": true, - "inputType": "radio", - "key": "accessmethods#public#maddash", - "values": [ - { - "value": "yes", - "label": "Public" - }, - { - "value": "no", - "label": "VPN" - } - ], - "defaultValue": "yes", - "validate": { - "required": true - }, - "labelPosition": "top", - "optionsLabelPosition": "right" - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 5GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-perfsonar-maddash", - "version": "2.2.4" - }, - "mainDeploymentName": "maddash" - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 5, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "exposesWebUI": true, - "allowSshAccess": true, - "accessMethods": [ - { - "type": "PUBLIC", - "name": "MaDDash", - "tag": "maddash", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - }, - { - "type": "EXTERNAL", - "name": "Logs", - "tag": "logs", - "deployParameters": { - "INGRESS_HOSTS": "logs.ingress.hosts", - "INGRESS_CLASS": "logs.ingress.class" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "mesh.txt", - "configFileTemplateContent": "" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app13-debian-repository.json b/src/test/shell/data/apps/app13-debian-repository.json deleted file mode 100644 index 61ff2903e93043e917f3446638750b4c8f5dbc2f..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app13-debian-repository.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Debian repository", - "license": "Debian", - "licenseUrl": "", - "wwwUrl": "https://wiki.debian.org/DebianRepository/SetupWithReprepro", - "sourceUrl": "", - "issuesUrl": "", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Debianrepository", - "descriptions": [ - { - "language": "en", - "briefDescription": "Debian package repository based on Reprepro", - "fullDescription": "Reprepro is a tool for managing APT repositories.<br><br>Reprepro is able to manage multiple repositories for multiple distribution versions and one package pool. It can process updates from an incoming directory, copy package (references) between distribution versions, list all packages and/or package versions available in the repository, etc.<br><br>More information about the tool can be found at <a href=https://wiki.debian.org/DebianRepository/SetupWithReprepro>Debian Wiki</a>." - }, - { - "language": "de", - "briefDescription": "Debian package repository based on Reprepro", - "fullDescription": "Reprepro is a tool for managing APT repositories.<br><br>Reprepro is able to manage multiple repositories for multiple distribution versions and one package pool. It can process updates from an incoming directory, copy package (references) between distribution versions, list all packages and/or package versions available in the repository, etc.<br><br>More information about the tool can be found at <a href=https://wiki.debian.org/DebianRepository/SetupWithReprepro>Debian Wiki</a>." - }, - { - "language": "fr", - "briefDescription": "Debian package repository based on Reprepro", - "fullDescription": "Reprepro is a tool for managing APT repositories.<br><br>Reprepro is able to manage multiple repositories for multiple distribution versions and one package pool. It can process updates from an incoming directory, copy package (references) between distribution versions, list all packages and/or package versions available in the repository, etc.<br><br>More information about the tool can be found at <a href=https://wiki.debian.org/DebianRepository/SetupWithReprepro>Debian Wiki</a>." - }, - { - "language": "pl", - "briefDescription": "Debian package repository based on Reprepro", - "fullDescription": "Reprepro is a tool for managing APT repositories.<br><br>Reprepro is able to manage multiple repositories for multiple distribution versions and one package pool. It can process updates from an incoming directory, copy package (references) between distribution versions, list all packages and/or package versions available in the repository, etc.<br><br>More information about the tool can be found at <a href=https://wiki.debian.org/DebianRepository/SetupWithReprepro>Debian Wiki</a>." - } - ], - "tags": [ - "management" - ] - }, - "application": { - "id": null, - "name": "Debian repository", - "version": "1.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "SSH keys (comma separated)", - "type": "textfield", - "input": true, - "key": "env#ssh_keys", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 10GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-reprepro", - "version": "2.0.1" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 10, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "deployParameters": { - "DOMAIN_CODENAME": "metallb.subnet_name" - }, - "exposesWebUI": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Reprepro", - "tag": "reprepro", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - }, - { - "type": "INTERNAL", - "name": "SSH", - "tag": "reprepro", - "deployParameters": { - "K8S_SERVICE_PORT": "22" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app14-influxdb.json b/src/test/shell/data/apps/app14-influxdb.json deleted file mode 100644 index 62195a18a7943dd73cfc7e9ad4b34823ca1eadc7..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app14-influxdb.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "InfluxDB", - "license": "MIT", - "licenseUrl": "https://github.com/influxdata/influxdb/blob/master/LICENSE", - "wwwUrl": "https://www.influxdata.com/products/influxdb-overview", - "sourceUrl": "https://github.com/influxdata/influxdb", - "issuesUrl": "https://github.com/influxdata/influxdb/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-InfluxDB", - "descriptions": [ - { - "language": "en", - "briefDescription": "Time series database", - "fullDescription": "InfluxDB is an open-source time series database (TSDB) developed by InfluxData. It is written in Go and optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring, application metrics, Internet of Things sensor data, and real-time analytics. It also has support for processing data from Graphite.<br><br>InfluxDB has no external dependencies and provides a SQL-like language, listening on port 8086, with built-in time-centric functions for querying a data structure composed of measurements, series, and points. Each point consists of several key-value pairs called the fieldset and a timestamp. When grouped together by a set of key-value pairs called the tagset, these define a series. Finally, series are grouped together by a string identifier to form a measurement.<br><br>Values can be 64-bit integers, 64-bit floating points, strings, and booleans. Points are indexed by their time and tagset. Retention policies are defined on a measurement and control how data is downsampled and deleted. Continuous Queries run periodically, storing results in a target measurement." - }, - { - "language": "de", - "briefDescription": "Time series database", - "fullDescription": "InfluxDB is an open-source time series database (TSDB) developed by InfluxData. It is written in Go and optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring, application metrics, Internet of Things sensor data, and real-time analytics. It also has support for processing data from Graphite.<br><br>InfluxDB has no external dependencies and provides a SQL-like language, listening on port 8086, with built-in time-centric functions for querying a data structure composed of measurements, series, and points. Each point consists of several key-value pairs called the fieldset and a timestamp. When grouped together by a set of key-value pairs called the tagset, these define a series. Finally, series are grouped together by a string identifier to form a measurement.<br><br>Values can be 64-bit integers, 64-bit floating points, strings, and booleans. Points are indexed by their time and tagset. Retention policies are defined on a measurement and control how data is downsampled and deleted. Continuous Queries run periodically, storing results in a target measurement." - }, - { - "language": "fr", - "briefDescription": "Time series database", - "fullDescription": "InfluxDB is an open-source time series database (TSDB) developed by InfluxData. It is written in Go and optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring, application metrics, Internet of Things sensor data, and real-time analytics. It also has support for processing data from Graphite.<br><br>InfluxDB has no external dependencies and provides a SQL-like language, listening on port 8086, with built-in time-centric functions for querying a data structure composed of measurements, series, and points. Each point consists of several key-value pairs called the fieldset and a timestamp. When grouped together by a set of key-value pairs called the tagset, these define a series. Finally, series are grouped together by a string identifier to form a measurement.<br><br>Values can be 64-bit integers, 64-bit floating points, strings, and booleans. Points are indexed by their time and tagset. Retention policies are defined on a measurement and control how data is downsampled and deleted. Continuous Queries run periodically, storing results in a target measurement." - }, - { - "language": "pl", - "briefDescription": "Time series database", - "fullDescription": "InfluxDB is an open-source time series database (TSDB) developed by InfluxData. It is written in Go and optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring, application metrics, Internet of Things sensor data, and real-time analytics. It also has support for processing data from Graphite.<br><br>InfluxDB has no external dependencies and provides a SQL-like language, listening on port 8086, with built-in time-centric functions for querying a data structure composed of measurements, series, and points. Each point consists of several key-value pairs called the fieldset and a timestamp. When grouped together by a set of key-value pairs called the tagset, these define a series. Finally, series are grouped together by a string identifier to form a measurement.<br><br>Values can be 64-bit integers, 64-bit floating points, strings, and booleans. Points are indexed by their time and tagset. Retention policies are defined on a measurement and control how data is downsampled and deleted. Continuous Queries run periodically, storing results in a target measurement." - } - ], - "tags": [ - "database" - ] - }, - "application": { - "id": null, - "name": "InfluxDB", - "version": "1.7.10", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "InfluxDB admin username", - "type": "textfield", - "input": true, - "key": "setDefaultUser#user#username", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "InfluxDB admin password", - "type": "password", - "input": true, - "key": "setDefaultUser#user#password", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 20GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "influxdata/influxdb", - "version": "4.4.8" - } - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 20, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "deployParameters": { - "DOMAIN_CODENAME": "service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%" - }, - "globalDeployParameters": { - "service.type": "LoadBalancer", - "resources.requests.memory": "512Mi", - "resources.requests.cpu": "250m", - "resources.limits.memory": "2Gi", - "resources.limits.cpu": "2000m", - "setDefaultUser.enabled": "true" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "InfluxDB", - "tag": "influxdb", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hostname=%VALUE%", - "INGRESS_CLASS": "ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_ENABLED": "ingress.tls" - } - }, - { - "type": "LOCAL", - "name": "in-cluster", - "tag": "influxdb" - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app15-jenkins.json b/src/test/shell/data/apps/app15-jenkins.json deleted file mode 100644 index 3b96ca63489b88453de4ca8d39d59b747f71caa7..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app15-jenkins.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Jenkins", - "license": "MIT", - "licenseUrl": "https://github.com/jenkinsci/jenkins/blob/master/LICENSE.txt", - "wwwUrl": "https://www.jenkins.io", - "sourceUrl": "https://github.com/jenkinsci/jenkins", - "issuesUrl": "", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Jenkins", - "descriptions": [ - { - "language": "en", - "briefDescription": "Leading open-source automation server", - "fullDescription": "Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software." - }, - { - "language": "de", - "briefDescription": "Leading open-source automation server", - "fullDescription": "Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software." - }, - { - "language": "fr", - "briefDescription": "Leading open-source automation server", - "fullDescription": "Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software." - }, - { - "language": "pl", - "briefDescription": "Leading open-source automation server", - "fullDescription": "Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software." - } - ], - "tags": [ - "ci" - ] - }, - "application": { - "id": null, - "name": "Jenkins", - "version": "2.263.4", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Jenkins admin username", - "type": "textfield", - "input": true, - "key": "controller#adminUser", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Jenkins admin password", - "type": "password", - "input": true, - "key": "controller#adminPassword", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Administrator email address", - "type": "email", - "input": true, - "key": "controller#jenkinsAdminEmail", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - } - ] - }, - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 1, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 8GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-jenkins", - "version": "3.1.13" - }, - "mainDeploymentName": "nmaas-jenkins" - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 8, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_NAME": "persistence.name", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "deployParameters": { - "DOMAIN_CODENAME": "agent.namespace" - }, - "globalDeployParameters": { - "clusterZone": "geant.local", - "controller.installPlugins[0]": "kubernetes:1.29.0", - "controller.installPlugins[1]": "workflow-job:2.40", - "controller.installPlugins[2]": "workflow-aggregator:2.6", - "controller.installPlugins[3]": "credentials-binding:1.24", - "controller.installPlugins[4]": "git:4.5.2", - "controller.installPlugins[5]": "configuration-as-code:1.51", - "controller.installPlugins[6]": "locale:1.4", - "controller.installPlugins[7]": "ssh:2.6.1", - "controller.installPlugins[8]": "ansible:1.1", - "runAsUser": "1000", - "fsGroup": "1000", - "useSecurity": "true" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Jenkins", - "tag": "jenkins", - "deployParameters": { - "INGRESS_ENABLED": "controller.ingress.enabled", - "INGRESS_HOSTS": "controller.ingress.hostName=%VALUE%", - "INGRESS_CLASS": "controller.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "controller.ingress.tls[0].hosts" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app16-elasticstack.json b/src/test/shell/data/apps/app16-elasticstack.json deleted file mode 100644 index c92c4cde8ef0389da0332ef5062e7cd101d8feec..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app16-elasticstack.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "ELK Stack", - "license": "Apache 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://www.elastic.co", - "sourceUrl": "https://github.com/elastic", - "issuesUrl": "https://github.com/elastic/elasticsearch/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-ELK", - "descriptions": [ - { - "language": "en", - "briefDescription": "Elasticsearch, Logstash and Kibana", - "fullDescription": "\"ELK\" is the acronym for three open source projects: Elasticsearch, Logstash, and Kibana. Elasticsearch is a search and analytics engine. Logstash is a server-side data processing pipeline that ingests data from multiple sources simultaneously, transforms it, and then sends it to a \"stash\" like Elasticsearch. Kibana lets users visualize data with charts and graphs in Elasticsearch." - }, - { - "language": "de", - "briefDescription": "Elasticsearch, Logstash and Kibana", - "fullDescription": "\"ELK\" is the acronym for three open source projects: Elasticsearch, Logstash, and Kibana. Elasticsearch is a search and analytics engine. Logstash is a server-side data processing pipeline that ingests data from multiple sources simultaneously, transforms it, and then sends it to a \"stash\" like Elasticsearch. Kibana lets users visualize data with charts and graphs in Elasticsearch." - }, - { - "language": "fr", - "briefDescription": "Elasticsearch, Logstash and Kibana", - "fullDescription": "\"ELK\" is the acronym for three open source projects: Elasticsearch, Logstash, and Kibana. Elasticsearch is a search and analytics engine. Logstash is a server-side data processing pipeline that ingests data from multiple sources simultaneously, transforms it, and then sends it to a \"stash\" like Elasticsearch. Kibana lets users visualize data with charts and graphs in Elasticsearch." - }, - { - "language": "pl", - "briefDescription": "Elasticsearch, Logstash and Kibana", - "fullDescription": "\"ELK\" is the acronym for three open source projects: Elasticsearch, Logstash, and Kibana. Elasticsearch is a search and analytics engine. Logstash is a server-side data processing pipeline that ingests data from multiple sources simultaneously, transforms it, and then sends it to a \"stash\" like Elasticsearch. Kibana lets users visualize data with charts and graphs in Elasticsearch." - } - ], - "tags": [ - "monitoring", - "visualization" - ] - }, - "application": { - "id": null, - "name": "ELK Stack", - "version": "7.7.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Elasticsearch storage space (GB):", - "type": "textfield", - "input": true, - "key": "elasticsearch#volumeClaimTemplate#resources#requests#storage", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "10Gi" - }, - { - "label": "Logstash storage space (GB):", - "type": "textfield", - "input": true, - "key": "logstash#volumeClaimTemplate#resources#requests#storage", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "5Gi" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "elastic-stack", - "version": "1.8.0" - }, - "mainDeploymentName": "pllabprod" - }, - "deployParameters": { - "DOMAIN_CODENAME_ELASTICSEARCH": "elasticsearch.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%", - "DOMAIN_CODENAME_LOGSTASH": "logstash.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%", - "RELEASE_NAME_ELASTICSEARCH_CLUSTER_NAME": "elasticsearch.clusterName", - "RELEASE_NAME_KIBANA": "kibana.elasticsearchHosts=http://%VALUE%-pllabprod:9200", - "RELEASE_NAME_LOGSTASH": "logstash.logstashPipeline.\"uptime\\.conf\"=\"input { exec { command => \"uptime\" interval => 30 } } output { elasticsearch { hosts => [\"http://%VALUE%-pllabprod:9200\"] index => \"logstash\" } }\"", - "RELEASE_NAME_ELASTICSEARCH_MASTER_SERVICE": "elasticsearch.masterService=%VALUE%-pllabprod" - }, - "globalDeployParameters": { - "elasticsearch.nodeGroup": "pllabprod", - "elasticsearch.imageTag": "7.7.1", - "logstash.imageTag": "7.7.1", - "kibana.imageTag": "7.7.1", - "elasticsearch.clusterHealthCheckParams": "\"wait_for_status=yellow&timeout=1s\"" - }, - "exposesWebUI": true, - "accessMethods": [ - { - "type": "EXTERNAL", - "name": "Elasticsearch", - "tag": "elasticsearch", - "deployParameters": { - "INGRESS_ENABLED": "elasticsearch.ingress.enabled", - "INGRESS_HOSTS": "elasticsearch.ingress.hosts", - "INGRESS_CLASS": "elasticsearch.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "elasticsearch.ingress.tls[0].hosts" - } - }, - { - "type": "EXTERNAL", - "name": "Kibana", - "tag": "kibana", - "deployParameters": { - "INGRESS_ENABLED": "kibana.ingress.enabled", - "INGRESS_HOSTS": "kibana.ingress.hosts", - "INGRESS_CLASS": "kibana.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "kibana.ingress.tls[0].hosts" - } - }, - { - "type": "INTERNAL", - "name": "DATA", - "tag": "logstash", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "logstash" - } - }, - { - "type": "INTERNAL", - "name": "DATA", - "tag": "elasticsearch", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "pllabprod" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "kibana.yml", - "configFileDirectory": "kibana", - "configFileTemplateContent": "server.name: kibana\nserver.host: \"0\"\nelasticsearch.hosts: [ \"http://elasticsearch:9200\" ]\nmonitoring.ui.container.elasticsearch.enabled: true\nelasticsearch.username: \"kibana\"\nelasticsearch.password: \"pristap\" \nxpack.security.encryptionKey: \"${helper.randomString(32)}\"\nxpack.encryptedSavedObjects.encryptionKey: \"${helper.randomString(32)}\"" - }, - { - "configFileName": "logstash.yml", - "configFileDirectory": "logstash", - "configFileTemplateContent": "" - }, - { - "configFileName": "elasticsearch.yml", - "configFileDirectory": "es-config", - "configFileTemplateContent": "cluster.name: \"${RELEASE_NAME}\"\nnetwork.host: 0.0.0.0\nxpack.security.enabled: true\nxpack.monitoring.enabled: true\nxpack.monitoring.collection.enabled: true\nxpack.security.transport.ssl.enabled: true" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app17-perfsonar-esmond.json b/src/test/shell/data/apps/app17-perfsonar-esmond.json deleted file mode 100644 index 32432b1c9318c8ca6db562c41bc0b6da70c6626e..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app17-perfsonar-esmond.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "esmond", - "license": "", - "licenseUrl": "", - "wwwUrl": "https://docs.perfsonar.net/multi_ma_install.html", - "sourceUrl": "https://github.com/perfsonar/esmond", - "issuesUrl": "https://github.com/perfsonar/esmond/issues", - "nmaasDocumentationUrl": null, - "descriptions": [ - { - "language": "en", - "briefDescription": "Central Measurement Archive", - "fullDescription": "esmond is a system for collecting, storing, visualizing and analysing large sets of timeseries data. esmond has a RESTful API which allows easy access to the data which is collected. The original focus was on collecting SNMP timeseries data which is still the system's forte, but there is support for generalized timeseries data. The perfSONAR project has begun using esmond to store timeseries of network measurements.\nesmond uses a hybrid model for storing data. Timeseries data such as interface counters is stored using Cassandra. esmond will save the raw data, and create summarizations similar to RRD. However, the system never discards data through summarization, which distinguishes it from RRD (and whisper/ceres). Metadata (such as interface description and interface types from SNMP) are stored in an SQL database. Storing this data in an SQL database allows us to use the full expressiveness of SQL to query this data. Data can be visualized using Graphite or through custom visualizations which can query the RESTful API." - }, - { - "language": "de", - "briefDescription": "Central Measurement Archive", - "fullDescription": "esmond is a system for collecting, storing, visualizing and analysing large sets of timeseries data. esmond has a RESTful API which allows easy access to the data which is collected. The original focus was on collecting SNMP timeseries data which is still the system's forte, but there is support for generalized timeseries data. The perfSONAR project has begun using esmond to store timeseries of network measurements.\nesmond uses a hybrid model for storing data. Timeseries data such as interface counters is stored using Cassandra. esmond will save the raw data, and create summarizations similar to RRD. However, the system never discards data through summarization, which distinguishes it from RRD (and whisper/ceres). Metadata (such as interface description and interface types from SNMP) are stored in an SQL database. Storing this data in an SQL database allows us to use the full expressiveness of SQL to query this data. Data can be visualized using Graphite or through custom visualizations which can query the RESTful API." - }, - { - "language": "fr", - "briefDescription": "Central Measurement Archive", - "fullDescription": "esmond is a system for collecting, storing, visualizing and analysing large sets of timeseries data. esmond has a RESTful API which allows easy access to the data which is collected. The original focus was on collecting SNMP timeseries data which is still the system's forte, but there is support for generalized timeseries data. The perfSONAR project has begun using esmond to store timeseries of network measurements.\nesmond uses a hybrid model for storing data. Timeseries data such as interface counters is stored using Cassandra. esmond will save the raw data, and create summarizations similar to RRD. However, the system never discards data through summarization, which distinguishes it from RRD (and whisper/ceres). Metadata (such as interface description and interface types from SNMP) are stored in an SQL database. Storing this data in an SQL database allows us to use the full expressiveness of SQL to query this data. Data can be visualized using Graphite or through custom visualizations which can query the RESTful API." - }, - { - "language": "pl", - "briefDescription": "Central Measurement Archive", - "fullDescription": "esmond is a system for collecting, storing, visualizing and analysing large sets of timeseries data. esmond has a RESTful API which allows easy access to the data which is collected. The original focus was on collecting SNMP timeseries data which is still the system's forte, but there is support for generalized timeseries data. The perfSONAR project has begun using esmond to store timeseries of network measurements.\nesmond uses a hybrid model for storing data. Timeseries data such as interface counters is stored using Cassandra. esmond will save the raw data, and create summarizations similar to RRD. However, the system never discards data through summarization, which distinguishes it from RRD (and whisper/ceres). Metadata (such as interface description and interface types from SNMP) are stored in an SQL database. Storing this data in an SQL database allows us to use the full expressiveness of SQL to query this data. Data can be visualized using Graphite or through custom visualizations which can query the RESTful API." - } - ], - "tags": [ - "database", - "archive" - ] - }, - "application": { - "id": null, - "name": "esmond", - "version": "4.3.4", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Advanced", - "key": "advancedTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Access options", - "type": "radio", - "input": true, - "tableView": true, - "inputType": "radio", - "key": "accessmethods#public#esmond", - "values": [ - { - "value": "yes", - "label": "Public" - }, - { - "value": "no", - "label": "VPN" - } - ], - "defaultValue": "yes", - "validate": { - "required": true - }, - "labelPosition": "top", - "optionsLabelPosition": "right" - }, - { - "label": "Log access username", - "type": "textfield", - "input": true, - "key": "env#LOG_USERNAME", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Log access password", - "type": "password", - "input": true, - "key": "env#LOG_PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - }, - { - "label": "Advanced", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "advanced", - "components": [ - { - "label": "Storage space (GB):", - "type": "number", - "input": true, - "key": "storageSpace", - "placeholder": "Default value: 10GB", - "tab": 1 - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-perfsonar-esmond", - "version": "2.2.0" - }, - "mainDeploymentName": "esmond" - }, - "storageVolumes": [ - { - "type": "MAIN", - "defaultStorageSpace": 10, - "deployParameters": { - "PERSISTENCE_ENABLED": "persistence.enabled", - "PERSISTENCE_STORAGE_CLASS": "persistence.storageClass", - "PERSISTENCE_STORAGE_SPACE": "persistence.size" - } - } - ], - "exposesWebUI": true, - "allowSshAccess": true, - "accessMethods": [ - { - "type": "PUBLIC", - "name": "esmond", - "tag": "esmond", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class", - "INGRESS_LETSENCRYPT": "ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls.certOrIssuer" - } - }, - { - "type": "EXTERNAL", - "name": "Logs", - "tag": "logs", - "deployParameters": { - "INGRESS_HOSTS": "logs.ingress.hosts", - "INGRESS_CLASS": "logs.ingress.class" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "ip-auth.txt", - "configFileTemplateContent": "" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app18-wifimon.json b/src/test/shell/data/apps/app18-wifimon.json deleted file mode 100644 index 7953c27720ca98fb71e923310288741ae8a38eea..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app18-wifimon.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "WiFiMon", - "license": "GÉANT Standard Open Source Software Outward Licence", - "licenseUrl": "https://geant3plus.archive.geant.net/About/Documents/GN3_10_325GEANTIPRPolicyv1.2_30SEP11.pdf", - "wwwUrl": "https://www.geant.org/wifimon", - "sourceUrl": "https://bitbucket.software.geant.org/projects/WFMON/repos/agent/browse", - "issuesUrl": "https://jira.software.geant.org/projects/WIFIM", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Wifimon", - "descriptions": [ - { - "language": "en", - "briefDescription": "Wireless Crowdsourced Performance Monitoring and Verification", - "fullDescription": "WiFiMon is a WiFi network monitoring and performance verification system. It is capable of detecting performance issues, to visualise the workload of the network, and to provide technical information about the WiFi network (e.g. signal strength, link quality, bit rate, etc.)." - }, - { - "language": "de", - "briefDescription": "Wireless Crowdsourced Performance Monitoring and Verification", - "fullDescription": "WiFiMon is a WiFi network monitoring and performance verification system. It is capable of detecting performance issues, to visualise the workload of the network, and to provide technical information about the WiFi network (e.g. signal strength, link quality, bit rate, etc.)." - }, - { - "language": "fr", - "briefDescription": "Wireless Crowdsourced Performance Monitoring and Verification", - "fullDescription": "WiFiMon is a WiFi network monitoring and performance verification system. It is capable of detecting performance issues, to visualise the workload of the network, and to provide technical information about the WiFi network (e.g. signal strength, link quality, bit rate, etc.)." - }, - { - "language": "pl", - "briefDescription": "Wireless Crowdsourced Performance Monitoring and Verification", - "fullDescription": "WiFiMon is a WiFi network monitoring and performance verification system. It is capable of detecting performance issues, to visualise the workload of the network, and to provide technical information about the WiFi network (e.g. signal strength, link quality, bit rate, etc.)." - } - ], - "tags": [ - "monitoring", "wifi" - ] - }, - "application": { - "id": null, - "name": "WiFiMon", - "version": "0.1.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "WiFiMon UI default user email address", - "type": "email", - "input": true, - "key": "defaultEmailAddress", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - }, - { - "label": "WiFiMon UI default access password", - "type": "password", - "input": true, - "key": "defaultAccessPassword", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - } - ] - }, - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "WiFiMon UI storage space (GB):", - "type": "textfield", - "input": true, - "key": "ui#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "1Gi" - }, - { - "label": "WiFiMon SP storage space (GB):", - "type": "textfield", - "input": true, - "key": "sp#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "1Gi" - }, - { - "label": "WiFiMon SP number of instances:", - "type": "number", - "input": true, - "key": "sp#replicas", - "tab": 0, - "validate": { - "required": true, - "min": 1, - "max": 8, - "step": "any", - "integer": "", - "multiple": "", - "custom": "" - }, - "inputFormat": "number", - "defaultValue": 1 - }, - { - "label": "Elasticsearch storage space (GB):", - "type": "textfield", - "input": true, - "key": "elastic-stack#elasticsearch#volumeClaimTemplate#resources#requests#storage", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "10Gi" - }, - { - "label": "Logstash storage space (GB):", - "type": "textfield", - "input": true, - "key": "elastic-stack#logstash#volumeClaimTemplate#resources#requests#storage", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "5Gi" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-wifimon", - "version": "2.0.1" - }, - "mainDeploymentName": "ui" - }, - "deployParameters": { - "DOMAIN_CODENAME_ELASTICSEARCH": "elastic-stack.elasticsearch.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%", - "DOMAIN_CODENAME_LOGSTASH": "elastic-stack.logstash.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%", - "RELEASE_NAME_ELASTICSEARCH_CLUSTER_NAME": "elastic-stack.elasticsearch.clusterName", - "RELEASE_NAME_KIBANA": "elastic-stack.kibana.elasticsearchHosts=http://%VALUE%-pllabprod:9200", - "RELEASE_NAME_ELASTICSEARCH_MASTER_SERVICE": "elastic-stack.elasticsearch.masterService=%VALUE%-pllabprod" - }, - "globalDeployParameters": { - "elastic-stack.elasticsearch.nodeGroup": "pllabprod", - "elastic-stack.elasticsearch.imageTag": "7.7.1", - "elastic-stack.logstash.imageTag": "7.7.1", - "elastic-stack.kibana.imageTag": "7.7.1", - "elastic-stack.elasticsearch.clusterHealthCheckParams": "\"wait_for_status=yellow&timeout=1s\"", - "elastic-stack.logstash.extraEnvs[0].name": "ENCRYPTION_STRING", - "elastic-stack.logstash.extraEnvs[0].value": "%RANDOM_STRING_32%" - }, - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "EXTERNAL", - "name": "WiFiMon UI", - "tag": "ui", - "deployParameters": { - "INGRESS_ENABLED": "ui.ingress.enabled", - "INGRESS_HOSTS": "ui.ingress.hosts", - "INGRESS_TLS_ENABLED": "ui.ingress.tls.enabled", - "INGRESS_CLASS": "ui.ingress.class", - "INGRESS_LETSENCRYPT": "ui.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ui.ingress.tls.certOrIssuer" - } - }, - { - "type": "PUBLIC", - "name": "WiFiMon SP", - "tag": "sp", - "deployParameters": { - "INGRESS_ENABLED": "sp.ingress.enabled", - "INGRESS_HOSTS": "sp.ingress.hosts", - "INGRESS_TLS_ENABLED": "sp.ingress.tls.enabled", - "INGRESS_CLASS": "sp.ingress.class", - "INGRESS_LETSENCRYPT": "sp.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "sp.ingress.tls.certOrIssuer" - } - }, - { - "type": "EXTERNAL", - "name": "Elasticsearch", - "tag": "elasticsearch", - "deployParameters": { - "INGRESS_ENABLED": "elastic-stack.elasticsearch.ingress.enabled", - "INGRESS_HOSTS": "elastic-stack.elasticsearch.ingress.hosts", - "INGRESS_CLASS": "elastic-stack.elasticsearch.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "elastic-stack.elasticsearch.ingress.tls[0].hosts" - } - }, - { - "type": "EXTERNAL", - "name": "Kibana", - "tag": "kibana", - "deployParameters": { - "INGRESS_ENABLED": "elastic-stack.kibana.ingress.enabled", - "INGRESS_HOSTS": "elastic-stack.kibana.ingress.hosts", - "INGRESS_CLASS": "elastic-stack.kibana.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "elastic-stack.kibana.ingress.tls[0].hosts" - } - }, - { - "type": "INTERNAL", - "name": "DATA", - "tag": "logstash", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "logstash" - } - }, - { - "type": "INTERNAL", - "name": "DATA", - "tag": "elasticsearch", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "pllabprod" - } - } - ], - "storageVolumes": [] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": false, - "templates": [ - { - "configFileName": "init.sql", - "configFileDirectory": "ui-init", - "configFileTemplateContent": "CREATE TABLE subnets (\nsubnet text,\nsubnet_id serial PRIMARY KEY );\nCREATE TABLE users (\nid serial PRIMARY KEY,\nemail text NOT NULL,\npassword_hash text NOT NULL,\nrole text NOT NULL);\nCREATE TABLE accesspoints (\napid serial PRIMARY KEY,\nmac text NOT NULL,\nlatitude text,\nlongitude text,\nbuilding text,\nfloor text,\nnotes text);\nCREATE TABLE options (\noptionsid serial PRIMARY KEY,\nuserdata text NOT NULL,\nuservisualoption text NOT NULL,\ncorrelationmethod text NOT NULL\n);\nGRANT USAGE ON SCHEMA public to wifimon_user;\nGRANT CONNECT ON DATABASE wifimon_database to wifimon_user;\nGRANT USAGE ON SCHEMA public to wifimon_user;\nGRANT SELECT ON subnets, users, accesspoints, options TO wifimon_user;\nGRANT INSERT ON subnets, users, accesspoints, options TO wifimon_user;\nGRANT DELETE ON subnets, users, accesspoints, options TO wifimon_user;\nGRANT UPDATE ON accesspoints, options TO wifimon_user;\nGRANT USAGE, SELECT ON SEQUENCE subnets_subnet_id_seq TO wifimon_user;\nGRANT USAGE, SELECT ON SEQUENCE users_id_seq TO wifimon_user;\nGRANT USAGE, SELECT, UPDATE ON SEQUENCE options_optionsid_seq TO wifimon_user;\nGRANT USAGE, SELECT, UPDATE ON SEQUENCE accesspoints_apid_seq TO wifimon_user;\nINSERT INTO users VALUES ('1', '${defaultEmailAddress}', '${helper.encode(defaultAccessPassword)}', 'ADMIN');" - }, - { - "configFileName": "uptime.conf", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "input { exec { command => \"uptime\" interval => 30 } } output { elasticsearch { hosts => [\"http://${RELEASE_NAME}-pllabprod:9200\"] index => \"logstash\" } }" - }, - { - "configFileName": "beats-pipeline.yml", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "input {\n beats {\n port => 5044\n }\n}\n\noutput {\n if ([logtype] == \"radius\") {\n pipeline { send_to => radiuslogs }\n } else { \n pipeline { send_to => dhcplogs }\n }\n}\n" - }, - { - "configFileName": "dhcp-pipeline.yml", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "input {\n pipeline { address => dhcplogs }\n}\n\nfilter {\n dissect {\n mapping => {\n \"message\" => \"%{} DHCPACK on %{ip} to %{mac} %{}\"\n }\n\n remove_field => [\n \"logtype\",\n \"message\",\n \"@version\"\n ]\n }\n\n if \"beats_input_codec_plain_applied\" in [tags] {\n mutate { remove_tag => [\"beats_input_codec_plain_applied\"] }\n }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"ip\"\n target => \"ip\"\n }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"mac\"\n target => \"mac\"\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\"http://${RELEASE_NAME}-pllabprod:9200\"]\n index => \"dhcplogs\"\n }\n}\n" - }, - { - "configFileName": "radius-pipeline.yml", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "input {\n pipeline { address => radiuslogs }\n}\n\nfilter {\n mutate { gsub => [ \"message\", \"[\\n\\t]+\", \" \" ] }\n\n kv {\n allow_duplicate_values => false\n\n include_keys => [\n \"Calling-Station-Id\",\n \"Framed-IP-Address\",\n \"Timestamp\",\n \"Called-Station-Id\",\n \"NAS-IP-Address\",\n \"Acct-Status-Type\"\n ]\n\n remove_field => [\n \"logtype\",\n \"message\",\n \"@version\"\n ]\n }\n\n if \"beats_input_codec_plain_applied\" in [tags] {\n mutate { remove_tag => [\"beats_input_codec_plain_applied\"] }\n }\n\n geoip { source => \"NAS-IP-Address\" }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"Calling-Station-Id\"\n target => \"Calling-Station-Id\"\n }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"Framed-IP-Address\"\n target => \"Framed-IP-Address\"\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\"http://${RELEASE_NAME}-pllabprod:9200\"]\n index => \"radiuslogs\"\n }\n}\n" - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app18-wifimon_v1.6.0.json b/src/test/shell/data/apps/app18-wifimon_v1.6.0.json deleted file mode 100644 index 1729dd3c90216d6972a18e66b4a2d8aabcce5a9f..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app18-wifimon_v1.6.0.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "id": null, - "name": "WiFiMon", - "version": "1.6.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "WiFiMon UI default user email address", - "type": "email", - "input": true, - "key": "defaultEmailAddress", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - }, - { - "label": "WiFiMon UI default access password", - "type": "password", - "input": true, - "key": "defaultAccessPassword", - "inputFormat": "plain", - "validate": { - "required": true - }, - "tab": 0 - } - ] - }, - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "WiFiMon UI storage space (GB):", - "type": "textfield", - "input": true, - "key": "ui#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "1Gi" - }, - { - "label": "WiFiMon SP storage space (GB):", - "type": "textfield", - "input": true, - "key": "sp#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "1Gi" - }, - { - "label": "WiFiMon SP number of instances:", - "type": "number", - "input": true, - "key": "sp#replicas", - "tab": 0, - "validate": { - "required": true, - "min": 1, - "max": 8, - "step": "any", - "integer": "", - "multiple": "", - "custom": "" - }, - "inputFormat": "number", - "defaultValue": 1 - }, - { - "label": "Elasticsearch storage space (GB):", - "type": "textfield", - "input": true, - "key": "elastic-stack#elasticsearch#volumeClaimTemplate#resources#requests#storage", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "10Gi" - }, - { - "label": "Logstash storage space (GB):", - "type": "textfield", - "input": true, - "key": "elastic-stack#logstash#volumeClaimTemplate#resources#requests#storage", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "5Gi" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-wifimon", - "version": "2.0.2" - }, - "mainDeploymentName": "ui" - }, - "deployParameters": { - "DOMAIN_CODENAME_ELASTICSEARCH": "elastic-stack.elasticsearch.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%", - "DOMAIN_CODENAME_LOGSTASH": "elastic-stack.logstash.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%", - "RELEASE_NAME_ELASTICSEARCH_CLUSTER_NAME": "elastic-stack.elasticsearch.clusterName", - "RELEASE_NAME_KIBANA": "elastic-stack.kibana.elasticsearchHosts=http://%VALUE%-pllabprod:9200", - "RELEASE_NAME_ELASTICSEARCH_MASTER_SERVICE": "elastic-stack.elasticsearch.masterService=%VALUE%-pllabprod" - }, - "globalDeployParameters": { - "elastic-stack.elasticsearch.nodeGroup": "pllabprod", - "elastic-stack.elasticsearch.clusterHealthCheckParams": "\"wait_for_status=yellow&timeout=1s\"", - "elastic-stack.logstash.extraEnvs[0].name": "ENCRYPTION_STRING", - "elastic-stack.logstash.extraEnvs[0].value": "%RANDOM_STRING_32%" - }, - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "EXTERNAL", - "name": "WiFiMon UI", - "tag": "ui", - "deployParameters": { - "INGRESS_ENABLED": "ui.ingress.enabled", - "INGRESS_HOSTS": "ui.ingress.hosts", - "INGRESS_TLS_ENABLED": "ui.ingress.tls.enabled", - "INGRESS_CLASS": "ui.ingress.class", - "INGRESS_LETSENCRYPT": "ui.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "ui.ingress.tls.certOrIssuer" - } - }, - { - "type": "PUBLIC", - "name": "WiFiMon SP", - "tag": "sp", - "deployParameters": { - "INGRESS_ENABLED": "sp.ingress.enabled", - "INGRESS_HOSTS": "sp.ingress.hosts", - "INGRESS_TLS_ENABLED": "sp.ingress.tls.enabled", - "INGRESS_CLASS": "sp.ingress.class", - "INGRESS_LETSENCRYPT": "sp.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "sp.ingress.tls.certOrIssuer" - } - }, - { - "type": "EXTERNAL", - "name": "Elasticsearch", - "tag": "elasticsearch", - "deployParameters": { - "INGRESS_ENABLED": "elastic-stack.elasticsearch.ingress.enabled", - "INGRESS_HOSTS": "elastic-stack.elasticsearch.ingress.hosts", - "INGRESS_CLASS": "elastic-stack.elasticsearch.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "elastic-stack.elasticsearch.ingress.tls[0].hosts" - } - }, - { - "type": "EXTERNAL", - "name": "Kibana", - "tag": "kibana", - "deployParameters": { - "INGRESS_ENABLED": "elastic-stack.kibana.ingress.enabled", - "INGRESS_HOSTS": "elastic-stack.kibana.ingress.hosts", - "INGRESS_CLASS": "elastic-stack.kibana.ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_TLS_HOSTS": "elastic-stack.kibana.ingress.tls[0].hosts" - } - }, - { - "type": "INTERNAL", - "name": "DATA", - "tag": "logstash", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "logstash" - } - }, - { - "type": "INTERNAL", - "name": "DATA", - "tag": "elasticsearch", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "pllabprod" - } - } - ], - "storageVolumes": [] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "init.sql", - "configFileDirectory": "ui-init", - "configFileTemplateContent": "CREATE TABLE subnets (\nsubnet text,\nsubnet_id serial PRIMARY KEY );\nCREATE TABLE users (\nid serial PRIMARY KEY,\nemail text NOT NULL,\npassword_hash text NOT NULL,\nrole text NOT NULL);\nCREATE TABLE accesspoints (\napid serial PRIMARY KEY,\nmac text NOT NULL,\nlatitude text,\nlongitude text,\nbuilding text,\nfloor text,\nnotes text);\nCREATE TABLE options (\noptionsid serial PRIMARY KEY,\nuserdata text NOT NULL,\nuservisualoption text NOT NULL,\ncorrelationmethod text NOT NULL\n);\nGRANT USAGE ON SCHEMA public to wifimon_user;\nGRANT CONNECT ON DATABASE wifimon_database to wifimon_user;\nGRANT USAGE ON SCHEMA public to wifimon_user;\nGRANT SELECT ON subnets, users, accesspoints, options TO wifimon_user;\nGRANT INSERT ON subnets, users, accesspoints, options TO wifimon_user;\nGRANT DELETE ON subnets, users, accesspoints, options TO wifimon_user;\nGRANT UPDATE ON accesspoints, options TO wifimon_user;\nGRANT USAGE, SELECT ON SEQUENCE subnets_subnet_id_seq TO wifimon_user;\nGRANT USAGE, SELECT ON SEQUENCE users_id_seq TO wifimon_user;\nGRANT USAGE, SELECT, UPDATE ON SEQUENCE options_optionsid_seq TO wifimon_user;\nGRANT USAGE, SELECT, UPDATE ON SEQUENCE accesspoints_apid_seq TO wifimon_user;\nINSERT INTO users VALUES ('1', '${defaultEmailAddress}', '${helper.encode(defaultAccessPassword)}', 'ADMIN');" - }, - { - "configFileName": "beats-pipeline.yml", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "#\n# beats pipeline\n#\ninput {\n beats {\n port => 5044\n }\n}\n\noutput {\n\tif [logtype] == \"radius\" {\n\t\tpipeline { send_to => radiuslogs }\n\t} else if [logtype] == \"dhcp\" { # logtype is dhcp\n\t\tpipeline { send_to => dhcplogs }\n\t}\n}" - }, - { - "configFileName": "dhcp-pipeline.yml", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "#\n# dhcp pipeline\n#\n\ninput {\n pipeline { address => dhcplogs }\n}\n\nfilter {\n dissect {\n mapping => {\n \"message\" => \"%{Timestamp} %{+Timestamp} %{+Timestamp} %{} DHCPACK on %{IP-Address} to %{MAC-Address} %{}\"\n }\n\n remove_field => [\n \"logtype\",\n \"message\",\n \"@version\"\n ]\n }\n\n date {\n match => [ \"Timestamp\", \"MMM d HH:mm:ss\", \"MMM dd HH:mm:ss\" ]\n target => \"DHCP-Timestamp\"\n remove_field => [ \"Timestamp\" ]\n }\n\n if \"beats_input_codec_plain_applied\" in [tags] {\n mutate { remove_tag => [\"beats_input_codec_plain_applied\"] }\n }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"IP-Address\"\n target => \"IP-Address\"\n }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"MAC-Address\"\n target => \"MAC-Address\"\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\"http://${RELEASE_NAME}-pllabprod:9200\"]\n index => \"dhcplogs\"\n ilm_enabled => true\n ilm_policy => \"wifimon_policy\"\n }\n}" - }, - { - "configFileName": "radius-pipeline.yml", - "configFileDirectory": "pipelines", - "configFileTemplateContent": "#\n# radius pipeline\n#\n\ninput {\n pipeline { address => radiuslogs }\n}\n\nfilter {\n mutate { gsub => [ \"message\", \"[\\n\\t]+\", \" \" ] }\n\n kv {\n allow_duplicate_values => false\n\n include_keys => [\n \"Calling-Station-Id\",\n \"Framed-IP-Address\",\n \"Event-Timestamp\",\n \"Called-Station-Id\",\n \"NAS-IP-Address\",\n \"Acct-Status-Type\"\n ]\n\n remove_field => [\n \"logtype\",\n \"message\",\n \"@version\"\n ]\n }\n\n date {\n match => [ \"Event-Timestamp\", \"MMM d yyyy HH:mm:ss ZZZ\", \"MMM dd yyyy HH:mm:ss ZZZ\" ]\n target => \"RADIUS-Timestamp\"\n remove_field => [ \"Event-Timestamp\" ]\n }\n\n if \"beats_input_codec_plain_applied\" in [tags] {\n mutate { remove_tag => [\"beats_input_codec_plain_applied\"] }\n }\n\n geoip { source => \"NAS-IP-Address\" }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"Calling-Station-Id\"\n target => \"Calling-Station-Id\"\n }\n\n fingerprint {\n key => \"${r\"${ENCRYPTION_STRING}\"}\"\n method => \"SHA512\"\n source => \"Framed-IP-Address\"\n target => \"Framed-IP-Address\"\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\"http://${RELEASE_NAME}-pllabprod:9200\"]\n index => \"radiuslogs\"\n ilm_enabled => true\n ilm_policy => \"wifimon_policy\"\n }\n}\n" - } - ] - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app19-perfsonar-centralmanagement.json b/src/test/shell/data/apps/app19-perfsonar-centralmanagement.json deleted file mode 100644 index 640b2421a24d34aaf208fac94a7bf36e86a5e011..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app19-perfsonar-centralmanagement.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Central Management", - "license": "", - "licenseUrl": "", - "wwwUrl": "https://docs.perfsonar.net", - "sourceUrl": "https://github.com/perfsonar", - "issuesUrl": "https://github.com/perfsonar", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-perfSONARCentralManagement", - "descriptions": [ - { - "language": "en", - "briefDescription": "perfSONAR Central Management", - "fullDescription": "A set of perfSONAR central management components comprising psConfig Web Admin, MaDDash and Esmond." - }, - { - "language": "de", - "briefDescription": "perfSONAR Central Management", - "fullDescription": "A set of perfSONAR central management components comprising psConfig Web Admin, MaDDash and Esmond." - }, - { - "language": "fr", - "briefDescription": "perfSONAR Central Management", - "fullDescription": "A set of perfSONAR central management components comprising psConfig Web Admin, MaDDash and Esmond." - }, - { - "language": "pl", - "briefDescription": "perfSONAR Central Management", - "fullDescription": "A set of perfSONAR central management components comprising psConfig Web Admin, MaDDash and Esmond." - } - ], - "tags": [ - "database", - "archive", - "visualization", - "dashboard", - "management", - "configuration" - ] - }, - "application": { - "id": null, - "name": "Central Management", - "version": "4.3.4", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "title": "pSConfig Web Admin", - "key": "nmaas-perfsonar-pwa", - "input": false, - "tableView": false, - "type": "panel", - "theme": "default", - "breadcrumb": "default", - "hideLabel": false, - "components": [ - { - "label": "Default username", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#env#username", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default password", - "type": "password", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#env#password", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default email", - "type": "email", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#env#email", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Allocated storage space (GB)", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-centralmanagement-sca-auth#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "1Gi", - "placeholder": "Default value: 1Gi" - } - ], - "style": { - "margin-bottom": "5px" - } - }, - { - "title": "MaDDash", - "key": "nmaas-perfsonar-maddash", - "input": false, - "tableView": false, - "type": "panel", - "theme": "default", - "breadcrumb": "default", - "hideLabel": false, - "components": [ - { - "label": "Default admin username", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-maddash#env#MADDASH_USERNAME", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default admin password", - "type": "password", - "input": true, - "key": "nmaas-perfsonar-maddash#env#MADDASH_PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Log access username", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-maddash#env#LOG_USERNAME", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Log access password", - "type": "password", - "input": true, - "key": "nmaas-perfsonar-maddash#env#LOG_PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Access options", - "type": "radio", - "input": true, - "tableView": true, - "inputType": "radio", - "key": "accessmethods#public#maddash", - "values": [ - { - "value": "yes", - "label": "Public" - }, - { - "value": "no", - "label": "VPN" - } - ], - "defaultValue": "yes", - "validate": { - "required": true - }, - "labelPosition": "top", - "optionsLabelPosition": "right" - }, - { - "label": "Allocated storage space (GB)", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-maddash#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "5Gi", - "placeholder": "Default value: 5Gi" - } - ], - "style": { - "margin-bottom": "5px" - } - }, - { - "title": "Esmond", - "key": "nmaas-perfsonar-esmond", - "input": false, - "tableView": false, - "type": "panel", - "theme": "default", - "breadcrumb": "default", - "hideLabel": false, - "components": [ - { - "label": "Log access username", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-esmond#env#LOG_USERNAME", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Log access password", - "type": "password", - "input": true, - "key": "nmaas-perfsonar-esmond#env#LOG_PASSWORD", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Access options", - "type": "radio", - "input": true, - "tableView": true, - "inputType": "radio", - "key": "accessmethods#public#esmond", - "values": [ - { - "value": "yes", - "label": "Public" - }, - { - "value": "no", - "label": "VPN" - } - ], - "defaultValue": "yes", - "validate": { - "required": true - }, - "labelPosition": "top", - "optionsLabelPosition": "right" - }, - { - "label": "Allocated storage space (GB)", - "type": "textfield", - "input": true, - "key": "nmaas-perfsonar-esmond#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "defaultValue": "10Gi", - "placeholder": "Default value: 10Gi" - } - ], - "style": { - "margin-bottom": "5px" - } - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-perfsonar-centralmanagement", - "version": "2.2.0" - }, - "mainDeploymentName": "pwa-admin" - }, - "deployParameters": { - "RELEASE_NAME_PWA_SCA_AUTH_PV_NAME": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-sca-auth.persistence.name=%VALUE%-pwa", - "RELEASE_NAME_PWA_NGINX_PV_NAME": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.persistence.name=%VALUE%-pwa", - "RELEASE_NAME_PWA_ADMIN_PV_NAME": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-pwa-admin.persistence.name=%VALUE%-pwa", - "RELEASE_NAME_PWA_PUB_AUTH_PV_NAME": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-pwa-pub.persistence.name=%VALUE%-pwa", - "RELEASE_NAME_ESMOND_PV_NAME": "nmaas-perfsonar-esmond.persistence.name=%VALUE%-esmond", - "RELEASE_NAME_MADDASH_PV_NAME": "nmaas-perfsonar-maddash.persistence.name=%VALUE%-maddash", - "RELEASE_NAME_ESMOND_SERVICE_ACCOUNT_NAME": "nmaas-perfsonar-esmond.serviceAccount.name=%VALUE%-esmond", - "RELEASE_NAME_MADDASH_SERVICE_ACCOUNT_NAME": "nmaas-perfsonar-maddash.serviceAccount.name=%VALUE%-maddash" - }, - "globalDeployParameters": { - "nmaas-perfsonar-pwa.mongodb.nameOverride": "mongodb" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": true, - "accessMethods": [ - { - "type": "EXTERNAL", - "name": "PWA", - "tag": "pwa", - "deployParameters": { - "INGRESS_ENABLED": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.ingress.enabled", - "INGRESS_HOSTS": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.ingress.hosts", - "INGRESS_TLS_ENABLED": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.ingress.tls.enabled", - "INGRESS_CLASS": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.ingress.class", - "INGRESS_LETSENCRYPT": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "nmaas-perfsonar-pwa.nmaas-perfsonar-centralmanagement-nginx.ingress.tls.certOrIssuer" - } - }, - { - "type": "PUBLIC", - "name": "MaDDash", - "tag": "maddash", - "deployParameters": { - "INGRESS_ENABLED": "nmaas-perfsonar-maddash.ingress.enabled", - "INGRESS_HOSTS": "nmaas-perfsonar-maddash.ingress.hosts", - "INGRESS_TLS_ENABLED": "nmaas-perfsonar-maddash.ingress.tls.enabled", - "INGRESS_CLASS": "nmaas-perfsonar-maddash.ingress.class", - "INGRESS_LETSENCRYPT": "nmaas-perfsonar-maddash.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "nmaas-perfsonar-maddash.ingress.tls.certOrIssuer" - } - }, - { - "type": "EXTERNAL", - "name": "MaDDash logs", - "tag": "maddash-logs", - "deployParameters": { - "INGRESS_HOSTS": "nmaas-perfsonar-maddash.logs.ingress.hosts", - "INGRESS_CLASS": "nmaas-perfsonar-maddash.logs.ingress.class" - } - }, - { - "type": "PUBLIC", - "name": "Esmond", - "tag": "esmond", - "deployParameters": { - "INGRESS_ENABLED": "nmaas-perfsonar-esmond.ingress.enabled", - "INGRESS_HOSTS": "nmaas-perfsonar-esmond.ingress.hosts", - "INGRESS_TLS_ENABLED": "nmaas-perfsonar-esmond.ingress.tls.enabled", - "INGRESS_CLASS": "nmaas-perfsonar-esmond.ingress.class", - "INGRESS_LETSENCRYPT": "nmaas-perfsonar-esmond.ingress.tls.acme", - "INGRESS_WILDCARD_OR_ISSUER": "nmaas-perfsonar-esmond.ingress.tls.certOrIssuer" - } - }, - { - "type": "EXTERNAL", - "name": "Esmond logs", - "tag": "esmond-logs", - "deployParameters": { - "INGRESS_HOSTS": "nmaas-perfsonar-esmond.logs.ingress.hosts", - "INGRESS_CLASS": "nmaas-perfsonar-esmond.logs.ingress.class" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "mesh.txt", - "configFileDirectory": "maddash", - "configFileTemplateContent": " " - }, - { - "configFileName": "ip-auth.txt", - "configFileDirectory": "esmond", - "configFileTemplateContent": " " - } - ] - } - } -} \ No newline at end of file diff --git a/src/test/shell/data/apps/app20-icinga.json b/src/test/shell/data/apps/app20-icinga.json deleted file mode 100644 index 4c17d6921001430d2624d0fae699c1cc5dc53c10..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app20-icinga.json +++ /dev/null @@ -1,245 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Icinga2", - "license": "GPL 2.0", - "licenseUrl": "https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt", - "wwwUrl": "https://icinga.com", - "sourceUrl": "https://github.com/Icinga/icinga2", - "issuesUrl": "https://github.com/Icinga/icinga2/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Icinga2", - "descriptions": [ - { - "language": "en", - "briefDescription": "Scalable and extensible monitoring system", - "fullDescription": "Icinga is a monitoring system which checks the availability of your network resources, notifies users of outages, and generates performance data for reporting. Scalable and extensible, Icinga can monitor large, complex environments across multiple locations. <br><br>Icinga 2 is the monitoring server and requires Icinga Web 2 on top in your Icinga Stack, which is already included as part of the NMaaS deployment. <br><br>The configuration can be easily managed with either the Icinga Director, config management tools or plain text within the Icinga DSL." - }, - { - "language": "de", - "briefDescription": "Scalable and extensible monitoring system", - "fullDescription": "Icinga is a monitoring system which checks the availability of your network resources, notifies users of outages, and generates performance data for reporting. Scalable and extensible, Icinga can monitor large, complex environments across multiple locations. <br><br>Icinga 2 is the monitoring server and requires Icinga Web 2 on top in your Icinga Stack, which is already included as part of the NMaaS deployment. <br><br>The configuration can be easily managed with either the Icinga Director, config management tools or plain text within the Icinga DSL." - }, - { - "language": "fr", - "briefDescription": "Scalable and extensible monitoring system", - "fullDescription": "Icinga is a monitoring system which checks the availability of your network resources, notifies users of outages, and generates performance data for reporting. Scalable and extensible, Icinga can monitor large, complex environments across multiple locations. <br><br>Icinga 2 is the monitoring server and requires Icinga Web 2 on top in your Icinga Stack, which is already included as part of the NMaaS deployment. <br><br>The configuration can be easily managed with either the Icinga Director, config management tools or plain text within the Icinga DSL." - }, - { - "language": "pl", - "briefDescription": "Scalable and extensible monitoring system", - "fullDescription": "Icinga is a monitoring system which checks the availability of your network resources, notifies users of outages, and generates performance data for reporting. Scalable and extensible, Icinga can monitor large, complex environments across multiple locations. <br><br>Icinga 2 is the monitoring server and requires Icinga Web 2 on top in your Icinga Stack, which is already included as part of the NMaaS deployment. <br><br>The configuration can be easily managed with either the Icinga Director, config management tools or plain text within the Icinga DSL." - } - ], - "tags": [ - "monitoring", - "visualization", - "alerting" - ] - }, - "application": { - "id": null, - "name": "Icinga2", - "version": "2.11.4", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Mandatory parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "mandatoryParameters", - "components": [ - { - "label": "Default web admin user", - "type": "textfield", - "input": true, - "key": "env#ICINGAWEB2_ADMIN_USER", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Default web admin password", - "type": "password", - "input": true, - "key": "env#ICINGAWEB2_ADMIN_PASS", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Allocated configuration directory storage (GB)", - "type": "textfield", - "input": true, - "key": "persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "1Gi", - "placeholder": "Default value: 1Gi", - "inputFormat": "plain" - }, - { - "label": "Allocated SQL database storage (GB)", - "type": "textfield", - "input": true, - "key": "mariadb#primary#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "16Gi", - "placeholder": "Default value: 16Gi", - "inputFormat": "plain" - } - ] - }, - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Email address for sending email alerts", - "type": "email", - "input": true, - "key": "notificationsEmail", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-icinga2", - "version": "2.0.1" - } - }, - "deployParameters": { - "DOMAIN_CODENAME": "metallb.subnetName=%VALUE%" - }, - "globalDeployParameters": { - "manualConfig": "false" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Icinga", - "tag": "icinga", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_CLASS": "ingress.class", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled" - } - }, - { - "type": "INTERNAL", - "name": "API", - "tag": "api", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "api", - "K8S_SERVICE_PORT": "5665" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "app.conf", - "configFileTemplateContent": "object IcingaApplication \"app\" { }" - }, - { - "configFileName": "apt.conf", - "configFileTemplateContent": "apply Service \"apt\" {\n import \"generic-service\"\n\n check_command = \"apt\"\n\n assign where host.name == NodeName\n}" - }, - { - "configFileName": "commands.conf", - "configFileTemplateContent": "/* Command objects */\n\n/* Notification Commands\n *\n * Please check the documentation for all required and\n * optional parameters.\n */\n\nobject NotificationCommand \"mail-host-notification\" {\n command = [ ConfigDir + \"/scripts/mail-host-notification.sh\" ]\n\n arguments += {\n\t\"-4\" = \"$notification_address$\"\n\t\"-6\" = \"$notification_address6$\"\n\t\"-b\" = \"$notification_author$\"\n\t\"-c\" = \"$notification_comment$\"\n\t\"-d\" = {\n\t required = true\n\t value = \"$notification_date$\"\n\t}\n\t\"-f\" = {\n\t value = \"$notification_from$\"\n\t description = \"Set from address. Requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)\"\n\t}\n\t\"-i\" = \"$notification_icingaweb2url$\"\n\t\"-l\" = {\n\t required = true\n\t value = \"$notification_hostname$\"\n\t}\n\t\"-n\" = {\n\t required = true\n\t value = \"$notification_hostdisplayname$\"\n\t}\n\t\"-o\" = {\n\t required = true\n\t value = \"$notification_hostoutput$\"\n\t}\n\t\"-r\" = {\n\t required = true\n\t value = \"$notification_useremail$\"\n\t}\n\t\"-s\" = {\n\t required = true\n\t value = \"$notification_hoststate$\"\n\t}\n\t\"-t\" = {\n\t required = true\n\t value = \"$notification_type$\"\n\t}\n\t\"-v\" = \"$notification_logtosyslog$\"\n }\n\n vars += {\n\tnotification_address = \"$address$\"\n\tnotification_address6 = \"$address6$\"\n\tnotification_author = \"$notification.author$\"\n\tnotification_comment = \"$notification.comment$\"\n\tnotification_type = \"$notification.type$\"\n\tnotification_date = \"$icinga.long_date_time$\"\n\tnotification_hostname = \"$host.name$\"\n\tnotification_hostdisplayname = \"$host.display_name$\"\n\tnotification_hostoutput = \"$host.output$\"\n\tnotification_hoststate = \"$host.state$\"\n\tnotification_useremail = \"$user.email$\"\n }\n}\n\nobject NotificationCommand \"mail-service-notification\" {\n command = [ ConfigDir + \"/scripts/mail-service-notification.sh\" ]\n\n arguments += {\n\t\"-4\" = \"$notification_address$\"\n\t\"-6\" = \"$notification_address6$\"\n\t\"-b\" = \"$notification_author$\"\n\t\"-c\" = \"$notification_comment$\"\n\t\"-d\" = {\n\t required = true\n\t value = \"$notification_date$\"\n\t}\n\t\"-e\" = {\n\t required = true\n\t value = \"$notification_servicename$\"\n\t}\n\t\"-f\" = {\n\t value = \"$notification_from$\"\n\t description = \"Set from address. Requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)\"\n\t}\n\t\"-i\" = \"$notification_icingaweb2url$\"\n\t\"-l\" = {\n\t required = true\n\t value = \"$notification_hostname$\"\n\t}\n\t\"-n\" = {\n\t required = true\n\t value = \"$notification_hostdisplayname$\"\n\t}\n\t\"-o\" = {\n\t required = true\n\t value = \"$notification_serviceoutput$\"\n\t}\n\t\"-r\" = {\n\t required = true\n\t value = \"$notification_useremail$\"\n\t}\n\t\"-s\" = {\n\t required = true\n\t value = \"$notification_servicestate$\"\n\t}\n\t\"-t\" = {\n\t required = true\n\t value = \"$notification_type$\"\n\t}\n\t\"-u\" = {\n\t required = true\n\t value = \"$notification_servicedisplayname$\"\n\t}\n\t\"-v\" = \"$notification_logtosyslog$\"\n }\n\n vars += {\n\tnotification_address = \"$address$\"\n\tnotification_address6 = \"$address6$\"\n\tnotification_author = \"$notification.author$\"\n\tnotification_comment = \"$notification.comment$\"\n\tnotification_type = \"$notification.type$\"\n\tnotification_date = \"$icinga.long_date_time$\"\n\tnotification_hostname = \"$host.name$\"\n\tnotification_hostdisplayname = \"$host.display_name$\"\n\tnotification_servicename = \"$service.name$\"\n\tnotification_serviceoutput = \"$service.output$\"\n\tnotification_servicestate = \"$service.state$\"\n\tnotification_useremail = \"$user.email$\"\n\tnotification_servicedisplayname = \"$service.display_name$\"\n }\n}\n\n/*\n * If you prefer to use the notification scripts with environment\n * variables instead of command line parameters, you can use\n * the following commands. They have been updated from < 2.7\n * to support the new notification scripts and should help\n * with an upgrade.\n * Remove the comment blocks and comment the notification commands above.\n */\n\n/*\n\nobject NotificationCommand \"mail-host-notification\" {\n command = [ ConfigDir + \"/scripts/mail-host-notification.sh\" ]\n\n env = {\n\tNOTIFICATIONTYPE = \"$notification.type$\"\n\tHOSTDISPLAYNAME = \"$host.display_name$\"\n\tHOSTNAME = \"$host.name$\"\n\tHOSTADDRESS = \"$address$\"\n\tHOSTSTATE = \"$host.state$\"\n\tLONGDATETIME = \"$icinga.long_date_time$\"\n\tHOSTOUTPUT = \"$host.output$\"\n\tNOTIFICATIONAUTHORNAME = \"$notification.author$\"\n\tNOTIFICATIONCOMMENT = \"$notification.comment$\"\n\tHOSTDISPLAYNAME = \"$host.display_name$\"\n\tUSEREMAIL = \"$user.email$\"\n }\n}\n\nobject NotificationCommand \"mail-service-notification\" {\n command = [ ConfigDir + \"/scripts/mail-service-notification.sh\" ]\n\n env = {\n\tNOTIFICATIONTYPE = \"$notification.type$\"\n\tSERVICENAME = \"$service.name$\"\n\tHOSTNAME = \"$host.name$\"\n\tHOSTDISPLAYNAME = \"$host.display_name$\"\n\tHOSTADDRESS = \"$address$\"\n\tSERVICESTATE = \"$service.state$\"\n\tLONGDATETIME = \"$icinga.long_date_time$\"\n\tSERVICEOUTPUT = \"$service.output$\"\n\tNOTIFICATIONAUTHORNAME = \"$notification.author$\"\n\tNOTIFICATIONCOMMENT = \"$notification.comment$\"\n\tHOSTDISPLAYNAME = \"$host.display_name$\"\n\tSERVICEDISPLAYNAME = \"$service.display_name$\"\n\tUSEREMAIL = \"$user.email$\"\n }\n}\n\n*/\n" - }, - { - "configFileName": "downtimes.conf", - "configFileTemplateContent": "/**\n * The example downtime apply rule.\n */\n\napply ScheduledDowntime \"backup-downtime\" to Service {\n author = \"icingaadmin\"\n comment = \"Scheduled downtime for backup\"\n\n ranges = {\n monday = service.vars.backup_downtime\n tuesday = service.vars.backup_downtime\n wednesday = service.vars.backup_downtime\n thursday = service.vars.backup_downtime\n friday = service.vars.backup_downtime\n saturday = service.vars.backup_downtime\n sunday = service.vars.backup_downtime\n }\n\n assign where service.vars.backup_downtime != \"\"\n}" - }, - { - "configFileName": "groups.conf", - "configFileTemplateContent": "/**\n * Host group examples.\n */\n\nobject HostGroup \"linux-servers\" {\n display_name = \"Linux Servers\"\n\n assign where host.vars.os == \"Linux\"\n}\n\nobject HostGroup \"windows-servers\" {\n display_name = \"Windows Servers\"\n\n assign where host.vars.os == \"Windows\"\n}\n\n/**\n * Service group examples.\n */\n\nobject ServiceGroup \"ping\" {\n display_name = \"Ping Checks\"\n\n assign where match(\"ping*\", service.name)\n}\n\nobject ServiceGroup \"http\" {\n display_name = \"HTTP Checks\"\n\n assign where match(\"http*\", service.check_command)\n}\n\nobject ServiceGroup \"disk\" {\n display_name = \"Disk Checks\"\n\n assign where match(\"disk*\", service.check_command)\n}" - }, - { - "configFileName": "hosts.conf", - "configFileTemplateContent": "/*\n * Host definitions with object attributes\n * used for apply rules for Service, Notification,\n * Dependency and ScheduledDowntime objects.\n *\n * Tip: Use `icinga2 object list --type Host` to\n * list all host objects after running\n * configuration validation (`icinga2 daemon -C`).\n */\n\n/*\n * This is an example host based on your\n * local host's FQDN. Specify the NodeName\n * constant in `constants.conf` or use your\n * own description, e.g. \"db-host-1\".\n */" - }, - { - "configFileName": "notifications.conf", - "configFileTemplateContent": "/**\n * The example notification apply rules.\n *\n * Only applied if host/service objects have\n * the custom variable `notification` defined\n * and containing `mail` as key.\n *\n * Check `hosts.conf` for an example.\n */\n\napply Notification \"mail-icingaadmin\" to Host {\n import \"mail-host-notification\"\n user_groups = host.vars.notification.mail.groups\n users = host.vars.notification.mail.users\n\n //interval = 2h\n\n //vars.notification_logtosyslog = true\n\n assign where host.vars.notification.mail\n}\n\napply Notification \"mail-icingaadmin\" to Service {\n import \"mail-service-notification\"\n user_groups = host.vars.notification.mail.groups\n users = host.vars.notification.mail.users\n\n //interval = 2h\n\n //vars.notification_logtosyslog = true\n\n assign where host.vars.notification.mail\n}" - }, - { - "configFileName": "services.conf", - "configFileTemplateContent": "/*\n * Service apply rules.\n *\n * The CheckCommand objects `ping4`, `ping6`, etc\n * are provided by the plugin check command templates.\n * Check the documentation for details.\n *\n * Tip: Use `icinga2 object list --type Service` to\n * list all service objects after running\n * configuration validation (`icinga2 daemon -C`).\n */\n\n/*\n * This is an example host based on your\n * local host's FQDN. Specify the NodeName\n * constant in `constants.conf` or use your\n * own description, e.g. \"db-host-1\".\n */\n\n/*\n * These are generic `ping4` and `ping6`\n * checks applied to all hosts having the\n * `address` resp. `address6` attribute\n * defined.\n */\napply Service \"ping4\" {\n import \"generic-service\"\n\n check_command = \"ping4\"\n\n assign where host.address\n}\n\n/*\n * Apply the `ssh` service to all hosts\n * with the `address` attribute defined and\n * the custom variable `os` set to `Linux`.\n */\napply Service \"ssh\" {\n import \"generic-service\"\n\n check_command = \"ssh\"\n\n assign where (host.address || host.address6) && host.vars.os == \"Linux\"\n}\n\n\n\napply Service for (http_vhost => config in host.vars.http_vhosts) {\n import \"generic-service\"\n\n check_command = \"http\"\n\n vars += config\n}\n\napply Service for (disk => config in host.vars.disks) {\n import \"generic-service\"\n\n check_command = \"disk\"\n\n vars += config\n}\n\napply Service \"icinga\" {\n import \"generic-service\"\n\n check_command = \"icinga\"\n\n assign where host.name == NodeName\n}\n\napply Service \"load\" {\n import \"generic-service\"\n\n check_command = \"load\"\n\n /* Used by the ScheduledDowntime apply rule in `downtimes.conf`. */\n vars.backup_downtime = \"02:00-03:00\"\n\n assign where host.name == NodeName\n}\n\napply Service \"procs\" {\n import \"generic-service\"\n\n check_command = \"procs\"\n\n assign where host.name == NodeName\n}\n\napply Service \"swap\" {\n import \"generic-service\"\n\n check_command = \"swap\"\n\n assign where host.name == NodeName\n}\n\napply Service \"users\" {\n import \"generic-service\"\n\n check_command = \"users\"\n\n assign where host.name == NodeName\n}" - }, - { - "configFileName": "templates.conf", - "configFileTemplateContent": "/*\n * Generic template examples.\n */\n\n\n/**\n * Provides default settings for hosts. By convention\n * all hosts should import this template.\n *\n * The CheckCommand object `hostalive` is provided by\n * the plugin check command templates.\n * Check the documentation for details.\n */\ntemplate Host \"generic-host\" {\n max_check_attempts = 3\n check_interval = 1m\n retry_interval = 30s\n\n check_command = \"hostalive\"\n}\n\n/**\n * Provides default settings for services. By convention\n * all services should import this template.\n */\ntemplate Service \"generic-service\" {\n max_check_attempts = 5\n check_interval = 1m\n retry_interval = 30s\n}\n\n/**\n * Provides default settings for users. By convention\n * all users should inherit from this template.\n */\n\ntemplate User \"generic-user\" {\n\n}\n\n/**\n * Provides default settings for host notifications.\n * By convention all host notifications should import\n * this template.\n */\ntemplate Notification \"mail-host-notification\" {\n command = \"mail-host-notification\"\n\n states = [ Up, Down ]\n types = [ Problem, Acknowledgement, Recovery, Custom,\n\t\t\tFlappingStart, FlappingEnd,\n\t\t\tDowntimeStart, DowntimeEnd, DowntimeRemoved ]\n\n vars += {\n\t// notification_icingaweb2url = \"https://www.example.com/icingaweb2\"\n\t// notification_from = \"Icinga 2 Host Monitoring <icinga@example.com>\"\n\tnotification_logtosyslog = false\n }\n\n period = \"24x7\"\n}\n\n/**\n * Provides default settings for service notifications.\n * By convention all service notifications should import\n * this template.\n */\ntemplate Notification \"mail-service-notification\" {\n command = \"mail-service-notification\"\n\n states = [ OK, Warning, Critical, Unknown ]\n types = [ Problem, Acknowledgement, Recovery, Custom,\n\t\t\tFlappingStart, FlappingEnd,\n\t\t\tDowntimeStart, DowntimeEnd, DowntimeRemoved ]\n\n vars += {\n\t// notification_icingaweb2url = \"https://www.example.com/icingaweb2\"\n\t// notification_from = \"Icinga 2 Service Monitoring <icinga@example.com>\"\n\tnotification_logtosyslog = false\n }\n\n period = \"24x7\"\n}" - }, - { - "configFileName": "timeperiods.conf", - "configFileTemplateContent": "/**\n * Sample timeperiods for Icinga 2.\n * Check the documentation for details.\n */\n\nobject TimePeriod \"24x7\" {\n display_name = \"Icinga 2 24x7 TimePeriod\"\n ranges = {\n \"monday\" \t= \"00:00-24:00\"\n \"tuesday\" \t= \"00:00-24:00\"\n \"wednesday\" = \"00:00-24:00\"\n \"thursday\" \t= \"00:00-24:00\"\n \"friday\" \t= \"00:00-24:00\"\n \"saturday\" \t= \"00:00-24:00\"\n \"sunday\" \t= \"00:00-24:00\"\n }\n}\n\nobject TimePeriod \"9to5\" {\n display_name = \"Icinga 2 9to5 TimePeriod\"\n ranges = {\n \"monday\" \t= \"09:00-17:00\"\n \"tuesday\" \t= \"09:00-17:00\"\n \"wednesday\" = \"09:00-17:00\"\n \"thursday\" \t= \"09:00-17:00\"\n \"friday\" \t= \"09:00-17:00\"\n }\n}\n\nobject TimePeriod \"never\" {\n display_name = \"Icinga 2 never TimePeriod\"\n ranges = {\n }\n}" - }, - { - "configFileName": "users.conf", - "configFileTemplateContent": "/**\n * The example user 'icingaadmin' and the example\n * group 'icingaadmins'.\n */\n\nobject User \"icingaadmin\" {\n import \"generic-user\"\n\n display_name = \"Icinga 2 Admin\"\n groups = [ \"icingaadmins\" ]\n\n email = \"${notificationsEmail}\"\n}\n\nobject UserGroup \"icingaadmins\" {\n display_name = \"Icinga 2 Admin Group\"\n}" - } - ] - } - } -} diff --git a/src/test/shell/data/apps/app21-victoria-metrics.json b/src/test/shell/data/apps/app21-victoria-metrics.json deleted file mode 100644 index be61f2c7f0b19d023668b79d006e3cd3f00040d2..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app21-victoria-metrics.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Victoria Metrics", - "license": "Apache License 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://victoriametrics.com/", - "sourceUrl": "https://github.com/VictoriaMetrics/VictoriaMetrics", - "issuesUrl": "https://github.com/VictoriaMetrics/VictoriaMetrics/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-VictoriaMetrics", - "descriptions": [ - { - "language": "en", - "briefDescription": "Scalable monitoring solution and time series database", - "fullDescription": "VictoriaMetrics is a highly scalable high-performance database that can be used as an external long-term storage for Prometheus metrics. <br><br>It can also completely replace Prometheus and perform the polling by itself, using a configuration format that is compatible with existing Prometheus deployments. <br>Apart from Prometheus, it can also substitute InfluxDB, OpenTSDB, and Graphite, as a result of providing compatible interfaces for these protocols. <br>Stored metrics can be easily visualized by Grafana, by adding the VictoriaMetrics instance as a Prometheus datastore. <br>No matter what protocol is used to store data in VictoriaMetrics, it is queried using the same web endpoint, and only a single datasource is required in Prometheus. <br>Another feature of VictoriaMetrics is to use advanced PromQL expressions, not available in the Prometheus implementation. <br><br>More details about this can be obtained from the <a href='https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL'>official documentation page</a>." - }, - { - "language": "de", - "briefDescription": "Scalable monitoring solution and time series database", - "fullDescription": "VictoriaMetrics is a highly scalable high-performance database that can be used as an external long-term storage for Prometheus metrics. <br><br>It can also completely replace Prometheus and perform the polling by itself, using a configuration format that is compatible with existing Prometheus deployments. <br>Apart from Prometheus, it can also substitute InfluxDB, OpenTSDB, and Graphite, as a result of providing compatible interfaces for these protocols. <br>Stored metrics can be easily visualized by Grafana, by adding the VictoriaMetrics instance as a Prometheus datastore. <br>No matter what protocol is used to store data in VictoriaMetrics, it is queried using the same web endpoint, and only a single datasource is required in Prometheus. <br>Another feature of VictoriaMetrics is to use advanced PromQL expressions, not available in the Prometheus implementation. <br><br>More details about this can be obtained from the <a href='https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL'>official documentation page</a>." - }, - { - "language": "fr", - "briefDescription": "Scalable monitoring solution and time series database", - "fullDescription": "VictoriaMetrics is a highly scalable high-performance database that can be used as an external long-term storage for Prometheus metrics. <br><br>It can also completely replace Prometheus and perform the polling by itself, using a configuration format that is compatible with existing Prometheus deployments. <br>Apart from Prometheus, it can also substitute InfluxDB, OpenTSDB, and Graphite, as a result of providing compatible interfaces for these protocols. <br>Stored metrics can be easily visualized by Grafana, by adding the VictoriaMetrics instance as a Prometheus datastore. <br>No matter what protocol is used to store data in VictoriaMetrics, it is queried using the same web endpoint, and only a single datasource is required in Prometheus. <br>Another feature of VictoriaMetrics is to use advanced PromQL expressions, not available in the Prometheus implementation. <br><br>More details about this can be obtained from the <a href='https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL'>official documentation page</a>." - }, - { - "language": "pl", - "briefDescription": "Scalable monitoring solution and time series database", - "fullDescription": "VictoriaMetrics is a highly scalable high-performance database that can be used as an external long-term storage for Prometheus metrics. <br><br>It can also completely replace Prometheus and perform the polling by itself, using a configuration format that is compatible with existing Prometheus deployments. <br>Apart from Prometheus, it can also substitute InfluxDB, OpenTSDB, and Graphite, as a result of providing compatible interfaces for these protocols. <br>Stored metrics can be easily visualized by Grafana, by adding the VictoriaMetrics instance as a Prometheus datastore. <br>No matter what protocol is used to store data in VictoriaMetrics, it is queried using the same web endpoint, and only a single datasource is required in Prometheus. <br>Another feature of VictoriaMetrics is to use advanced PromQL expressions, not available in the Prometheus implementation. <br><br>More details about this can be obtained from the <a href='https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL'>official documentation page</a>." - } - ], - "tags": [ - "monitoring", - "timeseries", - "database" - ] - }, - "application": { - "id": null, - "name": "Victoria Metrics", - "version": "1.46.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Global configuration", - "hideLabel": true, - "type": "container", - "persistent": true, - "key": "global_config", - "components": [ - { - "label": "Global scrape", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "defaultValue": "15s", - "key": "global_scrape" - }, - { - "label": "Global evaluation", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "defaultValue": "30s", - "key": "global_evaluation" - } - ] - }, - { - "label": "Jobs", - "disableAddingRemovingRows": false, - "addAnother": "Add jobs", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "type": "datagrid", - "input": true, - "key": "targets", - "validate": { - "required": true - }, - "components": [ - { - "label": "Job name", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "key": "jobName", - "validate": { - "required": true, - "minLength": 1 - }, - "row": "0-0" - }, - { - "label": "Scrape interval", - "type": "textfield", - "input": true, - "defaultValue": "15s", - "inputFormat": "plain", - "key": "scrape_interval", - "validate": { - "required": true - }, - "row": "0-1" - }, - { - "label": "Metrics path", - "type": "textfield", - "input": true, - "defaultValue": "/metrics", - "inputFormat": "plain", - "key": "metrics_path", - "validate": { - "required": true - }, - "row": "0-2" - }, - { - "label": "Targets", - "hideLabel": false, - "disableAddingRemovingRows": false, - "addAnother": "Add address", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "alwaysEnabled": false, - "type": "datagrid", - "input": true, - "key": "Addresses", - "validate": { - "required": true - }, - "components": [ - { - "label": "IP address and port", - "hideLabel": false, - "tableView": true, - "type": "textfield", - "input": true, - "key": "ipAddress", - "placeholder": "127.0.0.1:9001", - "validate": { - "required": true, - "pattern": "[\\s\\S]+\\:[0-9]{1,6}$" - }, - "inputFormat": "plain", - "row": "0-0" - } - ], - "row": "0-3" - }, - { - "label": "Labels", - "hideLabel": false, - "disableAddingRemovingRows": false, - "addAnother": "Add label", - "addAnotherPosition": "bottom", - "multiple": true, - "tableView": true, - "alwaysEnabled": false, - "type": "datagrid", - "input": true, - "key": "Labels", - "components": [ - { - "label": "Label name", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "key": "label_name", - "row": "0-4" - }, - { - "label": "Label value", - "type": "textfield", - "input": true, - "inputFormat": "plain", - "key": "label_value", - "row": "0-0" - } - ], - "row": "0-5" - } - ] - } - ] - } - ] - }, - { - "label": "Additional", - "key": "additionalParametersTab", - "components": [ - { - "label": "additionalParameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 2, - "key": "additionalParameters", - "components": [ - { - "label": "Retention period (in months)", - "placeholder": "1", - "defaultValue": "1", - "mask": false, - "spellcheck": true, - "delimiter": false, - "requireDecimal": false, - "inputFormat": "plain", - "key": "server#retentionPeriod", - "tab": 2, - "type": "number", - "input": true - }, - { - "label": "Allocated storage space (in GB)", - "type": "textfield", - "input": true, - "key": "server#persistentVolume#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "16Gi", - "placeholder": "Default value: 16Gi", - "inputFormat": "plain" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-victoria", - "version": "2.0.1" - }, - "mainDeploymentName": "nmaas-victoria-server" - }, - "deployParameters": { - "DOMAIN_CODENAME": "server.service.metallb.subnetName=%VALUE%" - }, - "globalDeployParameters": { - "server.image.tag": "v1.46.0" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "EXTERNAL", - "name": "Victoria", - "tag": "victoria", - "deployParameters": { - "INGRESS_ENABLED": "server.ingress.enabled", - "INGRESS_HOSTS": "server.ingress.host=%VALUE%", - "INGRESS_CLASS": "server.ingress.class" - } - }, - { - "type": "INTERNAL", - "name": "OpenTSDB", - "tag": "opentsdb", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-victoria-server", - "K8S_SERVICE_PORT": "4242" - } - }, - { - "type": "INTERNAL", - "name": "Graphite", - "tag": "graphite", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-victoria-server", - "K8S_SERVICE_PORT": "8080" - } - }, - { - "type": "INTERNAL", - "name": "Victoria", - "tag": "victoria", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-victoria-server", - "K8S_SERVICE_PORT": "8428" - } - }, - { - "type": "LOCAL", - "name": "in-cluster", - "tag": "victoria", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-victoria-server" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "prometheus.yml", - "configFileTemplateContent": "global:\n scrape_interval: ${global_config.global_scrape}\n evaluation_interval: ${global_config.global_evaluation}\nalerting:\n alertmanagers:\n - static_configs:\n - targets:\nrule_files:\nscrape_configs:\n<#list targets as target>\n - job_name: '${target.jobName}'\n metrics_path: ${target.metrics_path}\n scrape_interval: ${target.scrape_interval}\n static_configs:\n - targets: [<#list target.Addresses as address>'${address.ipAddress}'<#sep>,</#list>]\n<#if target.Labels?has_content>\n labels:\n<#list target.Labels as labels>\n<#if labels.label_name?has_content>\n ${labels.label_name}: ${labels.label_value}\n</#if>\n</#list>\n</#if>\n<#sep>\n</#list>" - } - ] - } - } -} diff --git a/src/test/shell/data/apps/app22-synapse.json b/src/test/shell/data/apps/app22-synapse.json deleted file mode 100644 index b9504052031f6802d327e8ab20e9557f7c6edf60..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app22-synapse.json +++ /dev/null @@ -1,256 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Synapse", - "license": "Apache License 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://matrix.org/docs/projects/server/synapse", - "sourceUrl": "https://github.com/matrix-org/synapse", - "issuesUrl": "https://github.com/matrix-org/synapse/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Synapse", - "descriptions": [ - { - "language": "en", - "briefDescription": "Secured instant messaging for teams", - "fullDescription": "<a href=\"https://matrix.org/\">Matrix</a> is an open and secure instant messaging protocol providing rich functionality. <br><br><a href=\"https://matrix.org/docs/projects/server/synapse\">Synapse</a> is an open-source server implementing the Matrix protocol. <br><br><a href=\"https://element.io/\">Element</a> (formerly Riot) is an open-source web-client that can connect to any accessible Matrix server." - }, - { - "language": "de", - "briefDescription": "Secured instant messaging for teams", - "fullDescription": "<a href=\"https://matrix.org/\">Matrix</a> is an open and secure instant messaging protocol providing rich functionality. <br><br><a href=\"https://matrix.org/docs/projects/server/synapse\">Synapse</a> is an open-source server implementing the Matrix protocol. <br><br><a href=\"https://element.io/\">Element</a> (formerly Riot) is an open-source web-client that can connect to any accessible Matrix server." - }, - { - "language": "fr", - "briefDescription": "Secured instant messaging for teams", - "fullDescription": "<a href=\"https://matrix.org/\">Matrix</a> is an open and secure instant messaging protocol providing rich functionality. <br><br><a href=\"https://matrix.org/docs/projects/server/synapse\">Synapse</a> is an open-source server implementing the Matrix protocol. <br><br><a href=\"https://element.io/\">Element</a> (formerly Riot) is an open-source web-client that can connect to any accessible Matrix server." - }, - { - "language": "pl", - "briefDescription": "Secured instant messaging for teams", - "fullDescription": "<a href=\"https://matrix.org/\">Matrix</a> is an open and secure instant messaging protocol providing rich functionality. <br><br><a href=\"https://matrix.org/docs/projects/server/synapse\">Synapse</a> is an open-source server implementing the Matrix protocol. <br><br><a href=\"https://element.io/\">Element</a> (formerly Riot) is an open-source web-client that can connect to any accessible Matrix server." - } - ], - "tags": [ - "messaging" - ] - }, - "application": { - "id": null, - "name": "Synapse", - "version": "1.22.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "Element instance name (shown on the login page)", - "type": "textfield", - "input": true, - "key": "riot#branding#brand", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Allocated capacity for the media volume", - "type": "textfield", - "input": true, - "key": "volumes#media#capacity", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "10Gi", - "placeholder": "Default value: 10Gi", - "inputFormat": "plain" - }, - { - "label": "Allocated database storage space", - "type": "textfield", - "input": true, - "key": "postgresql#persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "4Gi", - "placeholder": "Default value: 4Gi", - "inputFormat": "plain" - } - ] - }, - { - "label": "Configuration", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "configuration", - "components": [ - { - "label": "Administrator email address", - "type": "email", - "input": true, - "key": "matrixAdminEmail", - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Block regular users inviting others to rooms", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "matrixBlockNonAdminInvites", - "inputFormat": "plain" - }, - { - "label": "Registrations are opened", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "matrixRegistrationEnabled", - "inputFormat": "plain" - }, - { - "label": "Guests allowed to register", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "matrixRegistrationAllowGuests", - "inputFormat": "plain" - }, - { - "label": "User online/offline indicators enabled", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "matrixPresence", - "inputFormat": "plain" - }, - { - "label": "Expose Prometheus metrics", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "synapseMetricsEnabled", - "inputFormat": "plain" - }, - { - "label": "Outgoing emails enabled", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "mailEnabled", - "inputFormat": "plain" - }, - { - "label": "Default \"email from\" phrase", - "type": "textfield", - "input": true, - "key": "mailFrom", - "inputFormat": "plain", - "defaultValue": "Matrix NMaaS <no-reply@nmaas.eu>", - "placeholder": "Matrix NMaaS <no-reply@nmaas.eu>", - "validate": { - "required": true - } - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-matrix", - "version": "3.0.0" - }, - "mainDeploymentName": "synapse" - }, - "deployParameters": { - "RELEASE_NAME": "fullnameOverride=%VALUE%" - }, - "globalDeployParameters": { - "manualDeployment": "false", - "mail.relay.enabled": "false", - "coturn.enabled": "false", - "postgresql.password": "matrix" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Synapse", - "tag": "synapse", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_CLASS": "ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_HOSTS": "ingress.hosts.synapse=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%" - } - }, - { - "type": "EXTERNAL", - "name": "Element", - "tag": "element", - "deployParameters": { - "INGRESS_HOSTS": "ingress.hosts.riot=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[1]=%VALUE%" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "templates": [ - { - "configFileName": "homeserver.yaml", - "configFileDirectory": "homeserver-config-simplified", - "configFileTemplateContent": "## Server ##\n\n# The domain name of the server, with optional explicit port.\n# This is used by remote servers to connect to this server,\n# e.g. matrix.org, localhost:8080, etc.\n# This is also the last part of your UserID.\n#\nserver_name: ${APP_INSTANCE_NAME}.${DOMAIN_CODENAME}.${BASE_URL}\n\n# When running as a daemon, the file to store the pid in\n#\npid_file: /data/homeserver.pid\n\n# The absolute URL to the web client which /_matrix/client will redirect\n# to if 'webclient' is configured under the 'listeners' configuration.\n#\n# This option can be also set to the filesystem path to the web client\n# which will be served at /_matrix/client/ if 'webclient' is configured\n# under the 'listeners' configuration, however this is a security risk:\n# https://github.com/matrix-org/synapse#security-note\n#\n#web_client_location: https://riot.example.com/\n\n# The public-facing base URL that clients use to access this HS\n# (not including _matrix/...). This is the same URL a user would\n# enter into the 'custom HS URL' field on their client. If you\n# use synapse with a reverse proxy, this should be the URL to reach\n# synapse via the proxy.\n#\npublic_baseurl: \"https://${APP_INSTANCE_NAME}.${DOMAIN_CODENAME}.${BASE_URL}\"\n# Set the soft limit on the number of file descriptors synapse can use\n# Zero is used to indicate synapse should set the soft limit to the\n# hard limit.\n#\n#soft_file_limit: 0\n\n# Set to false to disable presence tracking on this homeserver (online/offline indicators)\n#\nuse_presence: ${matrixPresence?c}\n\n# Whether to require authentication to retrieve profile data (avatars,\n# display names) of other users through the client API. Defaults to\n# 'false'. Note that profile data is also available via the federation\n# API, so this setting is of limited value if federation is enabled on\n# the server.\n#\n#require_auth_for_profile_requests: true\n\n# Uncomment to require a user to share a room with another user in order\n# to retrieve their profile information. Only checked on Client-Server\n# requests. Profile requests from other servers should be checked by the\n# requesting server. Defaults to 'false'.\n#\n#limit_profile_requests_to_users_who_share_rooms: true\n\n# If set to 'true', removes the need for authentication to access the server's\n# public rooms directory through the client API, meaning that anyone can\n# query the room directory. Defaults to 'false'.\n#\n#allow_public_rooms_without_auth: true\n\n# If set to 'true', allows any other homeserver to fetch the server's public\n# rooms directory via federation. Defaults to 'false'.\n#\nallow_public_rooms_over_federation: false\n\n# The default room version for newly created rooms.\n#\n# Known room versions are listed here:\n# https://matrix.org/docs/spec/#complete-list-of-room-versions\n#\n# For example, for room version 1, default_room_version should be set\n# to \"1\".\n#\n#default_room_version: \"5\"\n\n# The GC threshold parameters to pass to `gc.set_threshold`, if defined\n#\n#gc_thresholds: [700, 10, 10]\n\n# Set the limit on the returned events in the timeline in the get\n# and sync operations. The default value is -1, means no upper limit.\n#\n#filter_timeline_limit: 5000\n\n# Whether room invites to users on this server should be blocked\n# (except those sent by local server admins). The default is False.\n#\nblock_non_admin_invites: ${matrixBlockNonAdminInvites?c}\n\n# Room searching\n#\n# If disabled, new messages will not be indexed for searching and users\n# will receive errors when searching for messages. Defaults to enabled.\n#\nenable_search: true\n\n# Restrict federation to the following whitelist of domains.\n# N.B. we recommend also firewalling your federation listener to limit\n# inbound federation traffic as early as possible, rather than relying\n# purely on this application-layer restriction. If not specified, the\n# default is to whitelist everything.\n\n# Prevent federation requests from being sent to the following\n# blacklist IP address CIDR ranges. If this option is not specified, or\n# specified with an empty list, no ip range blacklist will be enforced.\n#\n# As of Synapse v1.4.0 this option also affects any outbound requests to identity\n# servers provided by user input.\n#\n# (0.0.0.0 and :: are always blacklisted, whether or not they are explicitly\n# listed here, since they correspond to unroutable addresses.)\n\nfederation_ip_range_blacklist:\n - '127.0.0.0/8'\n - '10.0.0.0/8'\n - '172.16.0.0/12'\n - '192.168.0.0/16'\n - '100.64.0.0/10'\n - '169.254.0.0/16'\n - '::1/128'\n - 'fe80::/64'\n - 'fc00::/7'\n\n# List of ports that Synapse should listen on, their purpose and their\n# configuration.\n#\n# Options for each listener include:\n#\n# port: the TCP port to bind to\n#\n# bind_addresses: a list of local addresses to listen on. The default is\n# 'all local interfaces'.\n#\n# type: the type of listener. Normally 'http', but other valid options are:\n# 'manhole' (see docs/manhole.md),\n# 'metrics' (see docs/metrics-howto.md),\n# 'replication' (see docs/workers.md).\n#\n# tls: set to true to enable TLS for this listener. Will use the TLS\n# key/cert specified in tls_private_key_path / tls_certificate_path.\n#\n# x_forwarded: Only valid for an 'http' listener. Set to true to use the\n# X-Forwarded-For header as the client IP. Useful when Synapse is\n# behind a reverse-proxy.\n#\n# resources: Only valid for an 'http' listener. A list of resources to host\n# on this port. Options for each resource are:\n#\n# names: a list of names of HTTP resources. See below for a list of\n# valid resource names.\n#\n# compress: set to true to enable HTTP comression for this resource.\n#\n# additional_resources: Only valid for an 'http' listener. A map of\n# additional endpoints which should be loaded via dynamic modules.\n#\n# Valid resource names are:\n#\n# client: the client-server API (/_matrix/client), and the synapse admin\n# API (/_synapse/admin). Also implies 'media' and 'static'.\n#\n# consent: user consent forms (/_matrix/consent). See\n# docs/consent_tracking.md.\n#\n# federation: the server-server API (/_matrix/federation). Also implies\n# 'media', 'keys', 'openid'\n#\n# keys: the key discovery API (/_matrix/keys).\n#\n# media: the media API (/_matrix/media).\n#\n# metrics: the metrics interface. See docs/metrics-howto.md.\n#\n# openid: OpenID authentication.\n#\n# replication: the HTTP replication API (/_synapse/replication). See\n# docs/workers.md.\n#\n# static: static resources under synapse/static (/_matrix/static). (Mostly\n# useful for 'fallback authentication'.)\n#\n# webclient: A web client. Requires web_client_location to be set.\n#\nlisteners:\n # TLS-enabled listener: for when matrix traffic is sent directly to synapse.\n #\n # Disabled by default. To enable it, uncomment the following. (Note that you\n # will also need to give Synapse a TLS key and certificate: see the TLS section\n # below.)\n #\n #- port: 8448\n # type: http\n # tls: true\n # resources:\n # - names: [client, federation]\n\n # Unsecure HTTP listener: for when matrix traffic passes through a reverse proxy\n # that unwraps TLS.\n #\n # If you plan to use a reverse proxy, please see\n # https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md.\n #\n - port: 8008\n tls: false\n type: http\n x_forwarded: true\n bind_addresses: ['0.0.0.0']\n\n resources:\n - names: [client, federation]\n compress: false\n\n # example additional_resources:\n #\n #additional_resources:\n # \"/_matrix/my/custom/endpoint\":\n # module: my_module.CustomRequestHandler\n # config: {}\n\n - type: metrics\n port: 9092\n bind_addresses: ['0.0.0.0']\n\n resources:\n - names: [metrics]\n # Turn on the twisted ssh manhole service on localhost on the given\n # port.\n #\n #- port: 9000\n # bind_addresses: ['::1', '127.0.0.1']\n # type: manhole\n\n# Forward extremities can build up in a room due to networking delays between\n# homeservers. Once this happens in a large room, calculation of the state of\n# that room can become quite expensive. To mitigate this, once the number of\n# forward extremities reaches a given threshold, Synapse will send an\n# org.matrix.dummy_event event, which will reduce the forward extremities\n# in the room.\n#\n# This setting defines the threshold (i.e. number of forward extremities in the\n# room) at which dummy events are sent. The default value is 10.\n#\n#dummy_events_threshold: 5\n\n\n## Homeserver blocking ##\n\n# How to reach the server admin, used in ResourceLimitError\n#\nadmin_contact: 'mailto:${matrixAdminEmail}'\n\n# Global blocking\n#\nhs_disabled: false\nhs_disabled_message: \"\"\n\n# Monthly Active User Blocking\n#\n# Used in cases where the admin or server owner wants to limit to the\n# number of monthly active users.\n#\n# 'limit_usage_by_mau' disables/enables monthly active user blocking. When\n# enabled and a limit is reached the server returns a 'ResourceLimitError'\n# with error type Codes.RESOURCE_LIMIT_EXCEEDED\n#\n# 'max_mau_value' is the hard limit of monthly active users above which\n# the server will start blocking user actions.\n#\n# 'mau_trial_days' is a means to add a grace period for active users. It\n# means that users must be active for this number of days before they\n# can be considered active and guards against the case where lots of users\n# sign up in a short space of time never to return after their initial\n# session.\n#\n# 'mau_limit_alerting' is a means of limiting client side alerting\n# should the mau limit be reached. This is useful for small instances\n# where the admin has 5 mau seats (say) for 5 specific people and no\n# interest increasing the mau limit further. Defaults to True, which\n# means that alerting is enabled\n#\n#limit_usage_by_mau: false\n#max_mau_value: 50\n#mau_trial_days: 2\n#mau_limit_alerting: false\n\n# If enabled, the metrics for the number of monthly active users will\n# be populated, however no one will be limited. If limit_usage_by_mau\n# is true, this is implied to be true.\n#\n#mau_stats_only: false\n\n# Sometimes the server admin will want to ensure certain accounts are\n# never blocked by mau checking. These accounts are specified here.\n#\n#mau_limit_reserved_threepids:\n# - medium: 'email'\n# address: 'reserved_user@example.com'\n\n# Used by phonehome stats to group together related servers.\n#server_context: context\n\n# Resource-constrained homeserver settings\n#\n# When this is enabled, the room \"complexity\" will be checked before a user\n# joins a new remote room. If it is above the complexity limit, the server will\n# disallow joining, or will instantly leave.\n#\n# Room complexity is an arbitrary measure based on factors such as the number of\n# users in the room.\n#\nlimit_remote_rooms:\n # Uncomment to enable room complexity checking.\n #\n #enabled: true\n\n # the limit above which rooms cannot be joined. The default is 1.0.\n #\n #complexity: 0.5\n\n # override the error which is returned when the room is too complex.\n #\n #complexity_error: \"This room is too complex.\"\n\n# Whether to require a user to be in the room to add an alias to it.\n# Defaults to 'true'.\n#\n#require_membership_for_aliases: false\n\n# Whether to allow per-room membership profiles through the send of membership\n# events with profile information that differ from the target's global profile.\n# Defaults to 'true'.\n#\n#allow_per_room_profiles: false\n\n# How long to keep redacted events in unredacted form in the database. After\n# this period redacted events get replaced with their redacted form in the DB.\n#\n# Defaults to `7d`. Set to `null` to disable.\n#\nredaction_retention_period: 7d\n\n# How long to track users' last seen time and IPs in the database.\n#\n# Defaults to `28d`. Set to `null` to disable clearing out of old rows.\n#\n#user_ips_max_age: 14d\n\n# Message retention policy at the server level.\n#\n# Room admins and mods can define a retention period for their rooms using the\n# 'm.room.retention' state event, and server admins can cap this period by setting\n# the 'allowed_lifetime_min' and 'allowed_lifetime_max' config options.\n#\n# If this feature is enabled, Synapse will regularly look for and purge events\n# which are older than the room's maximum retention period. Synapse will also\n# filter events received over federation so that events that should have been\n# purged are ignored and not stored again.\n#\nretention:\n # The message retention policies feature is disabled by default. Uncomment the\n # following line to enable it.\n #\n #enabled: true\n\n # Default retention policy. If set, Synapse will apply it to rooms that lack the\n # 'm.room.retention' state event. Currently, the value of 'min_lifetime' doesn't\n # matter much because Synapse doesn't take it into account yet.\n #\n #default_policy:\n # min_lifetime: 1d\n # max_lifetime: 1y\n\n # Retention policy limits. If set, a user won't be able to send a\n # 'm.room.retention' event which features a 'min_lifetime' or a 'max_lifetime'\n # that's not within this range. This is especially useful in closed federations,\n # in which server admins can make sure every federating server applies the same\n # rules.\n #\n #allowed_lifetime_min: 1d\n #allowed_lifetime_max: 1y\n\n # Server admins can define the settings of the background jobs purging the\n # events which lifetime has expired under the 'purge_jobs' section.\n #\n # If no configuration is provided, a single job will be set up to delete expired\n # events in every room daily.\n #\n # Each job's configuration defines which range of message lifetimes the job\n # takes care of. For example, if 'shortest_max_lifetime' is '2d' and\n # 'longest_max_lifetime' is '3d', the job will handle purging expired events in\n # rooms whose state defines a 'max_lifetime' that's both higher than 2 days, and\n # lower than or equal to 3 days. Both the minimum and the maximum value of a\n # range are optional, e.g. a job with no 'shortest_max_lifetime' and a\n # 'longest_max_lifetime' of '3d' will handle every room with a retention policy\n # which 'max_lifetime' is lower than or equal to three days.\n #\n # The rationale for this per-job configuration is that some rooms might have a\n # retention policy with a low 'max_lifetime', where history needs to be purged\n # of outdated messages on a more frequent basis than for the rest of the rooms\n # (e.g. every 12h), but not want that purge to be performed by a job that's\n # iterating over every room it knows, which could be heavy on the server.\n #\n #purge_jobs:\n # - shortest_max_lifetime: 1d\n # longest_max_lifetime: 3d\n # interval: 12h\n # - shortest_max_lifetime: 3d\n # longest_max_lifetime: 1y\n # interval: 1d\n\n# Inhibits the /requestToken endpoints from returning an error that might leak\n# information about whether an e-mail address is in use or not on this\n# homeserver.\n# Note that for some endpoints the error situation is the e-mail already being\n# used, and for others the error is entering the e-mail being unused.\n# If this option is enabled, instead of returning an error, these endpoints will\n# act as if no error happened and return a fake session ID ('sid') to clients.\n#\n#request_token_inhibit_3pid_errors: true\n\n\n## TLS ##\n\n# PEM-encoded X509 certificate for TLS.\n# This certificate, as of Synapse 1.0, will need to be a valid and verifiable\n# certificate, signed by a recognised Certificate Authority.\n#\n# See 'ACME support' below to enable auto-provisioning this certificate via\n# Let's Encrypt.\n#\n# If supplying your own, be sure to use a `.pem` file that includes the\n# full certificate chain including any intermediate certificates (for\n# instance, if using certbot, use `fullchain.pem` as your certificate,\n# not `cert.pem`).\n#\n#tls_certificate_path: \"CONFDIR/SERVERNAME.tls.crt\"\n\n# PEM-encoded private key for TLS\n#\n#tls_private_key_path: \"CONFDIR/SERVERNAME.tls.key\"\n\n# Whether to verify TLS server certificates for outbound federation requests.\n#\n# Defaults to `true`. To disable certificate verification, uncomment the\n# following line.\n#\n#federation_verify_certificates: false\n\n# The minimum TLS version that will be used for outbound federation requests.\n#\n# Defaults to `1`. Configurable to `1`, `1.1`, `1.2`, or `1.3`. Note\n# that setting this value higher than `1.2` will prevent federation to most\n# of the public Matrix network: only configure it to `1.3` if you have an\n# entirely private federation setup and you can ensure TLS 1.3 support.\n#\n#federation_client_minimum_tls_version: 1.2\n\n# Skip federation certificate verification on the following whitelist\n# of domains.\n#\n# This setting should only be used in very specific cases, such as\n# federation over Tor hidden services and similar. For private networks\n# of homeservers, you likely want to use a private CA instead.\n#\n# Only effective if federation_verify_certicates is `true`.\n#\n#federation_certificate_verification_whitelist:\n# - lon.example.com\n# - *.domain.com\n# - *.onion\n\n# List of custom certificate authorities for federation traffic.\n#\n# This setting should only normally be used within a private network of\n# homeservers.\n#\n# Note that this list will replace those that are provided by your\n# operating environment. Certificates must be in PEM format.\n#\n#federation_custom_ca_list:\n# - myCA1.pem\n# - myCA2.pem\n# - myCA3.pem\n\n# ACME support: This will configure Synapse to request a valid TLS certificate\n# for your configured `server_name` via Let's Encrypt.\n#\n# Note that ACME v1 is now deprecated, and Synapse currently doesn't support\n# ACME v2. This means that this feature currently won't work with installs set\n# up after November 2019. For more info, and alternative solutions, see\n# https://github.com/matrix-org/synapse/blob/master/docs/ACME.md#deprecation-of-acme-v1\n#\n# Note that provisioning a certificate in this way requires port 80 to be\n# routed to Synapse so that it can complete the http-01 ACME challenge.\n# By default, if you enable ACME support, Synapse will attempt to listen on\n# port 80 for incoming http-01 challenges - however, this will likely fail\n# with 'Permission denied' or a similar error.\n#\n# There are a couple of potential solutions to this:\n#\n# * If you already have an Apache, Nginx, or similar listening on port 80,\n# you can configure Synapse to use an alternate port, and have your web\n# server forward the requests. For example, assuming you set 'port: 8009'\n# below, on Apache, you would write:\n#\n# ProxyPass /.well-known/acme-challenge http://localhost:8009/.well-known/acme-challenge\n#\n# * Alternatively, you can use something like `authbind` to give Synapse\n# permission to listen on port 80.\n#\nacme:\n # ACME support is disabled by default. Set this to `true` and uncomment\n # tls_certificate_path and tls_private_key_path above to enable it.\n #\n enabled: false\n\n # Endpoint to use to request certificates. If you only want to test,\n # use Let's Encrypt's staging url:\n # https://acme-staging.api.letsencrypt.org/directory\n #\n #url: https://acme-v01.api.letsencrypt.org/directory\n\n # Port number to listen on for the HTTP-01 challenge. Change this if\n # you are forwarding connections through Apache/Nginx/etc.\n #\n port: 80\n\n # Local addresses to listen on for incoming connections.\n # Again, you may want to change this if you are forwarding connections\n # through Apache/Nginx/etc.\n #\n bind_addresses: ['::', '0.0.0.0']\n\n # How many days remaining on a certificate before it is renewed.\n #\n reprovision_threshold: 30\n\n # The domain that the certificate should be for. Normally this\n # should be the same as your Matrix domain (i.e., 'server_name'), but,\n # by putting a file at 'https://<server_name>/.well-known/matrix/server',\n # you can delegate incoming traffic to another server. If you do that,\n # you should give the target of the delegation here.\n #\n # For example: if your 'server_name' is 'example.com', but\n # 'https://example.com/.well-known/matrix/server' delegates to\n # 'matrix.example.com', you should put 'matrix.example.com' here.\n #\n # If not set, defaults to your 'server_name'.\n #\n domain: matrix.example.com\n\n # file to use for the account key. This will be generated if it doesn't\n # exist.\n #\n # If unspecified, we will use CONFDIR/client.key.\n #\n account_key_file: DATADIR/acme_account.key\n\n# List of allowed TLS fingerprints for this server to publish along\n# with the signing keys for this server. Other matrix servers that\n# make HTTPS requests to this server will check that the TLS\n# certificates returned by this server match one of the fingerprints.\n#\n# Synapse automatically adds the fingerprint of its own certificate\n# to the list. So if federation traffic is handled directly by synapse\n# then no modification to the list is required.\n#\n# If synapse is run behind a load balancer that handles the TLS then it\n# will be necessary to add the fingerprints of the certificates used by\n# the loadbalancers to this list if they are different to the one\n# synapse is using.\n#\n# Homeservers are permitted to cache the list of TLS fingerprints\n# returned in the key responses up to the \"valid_until_ts\" returned in\n# key. It may be necessary to publish the fingerprints of a new\n# certificate and wait until the \"valid_until_ts\" of the previous key\n# responses have passed before deploying it.\n#\n# You can calculate a fingerprint from a given TLS listener via:\n# openssl s_client -connect $host:$port < /dev/null 2> /dev/null |\n# openssl x509 -outform DER | openssl sha256 -binary | base64 | tr -d '='\n# or by checking matrix.org/federationtester/api/report?server_name=$host\n#\n#tls_fingerprints: [{\"sha256\": \"<base64_encoded_sha256_fingerprint>\"}]\n\n## Database ##\n\ndatabase:\n # The database engine name\n name: \"psycopg2\"\n # Arguments to pass to the engine\n args:\n user: \"matrix\"\n password: \"matrix\"\n database: \"matrix\"\n \n host: \"${RELEASE_NAME}-postgresql\"\n port: \"5432\"\n sslmode: prefer\n cp_min: 5\n cp_max: 10\n\n# Number of events to cache in memory.\n#\n#event_cache_size: 10K\n\n\n## Logging ##\n\n# A yaml python logging config file as described by\n# https://docs.python.org/3.7/library/logging.config.html#configuration-dictionary-schema\n#\nlog_config: \"/data/${APP_INSTANCE_NAME}.${DOMAIN_CODENAME}.${BASE_URL}.log.config\"\n\n\n## Ratelimiting ##\n\n# Ratelimiting settings for client actions (registration, login, messaging).\n#\n# Each ratelimiting configuration is made of two parameters:\n# - per_second: number of requests a client can send per second.\n# - burst_count: number of requests a client can send before being throttled.\n#\n# Synapse currently uses the following configurations:\n# - one for messages that ratelimits sending based on the account the client\n# is using\n# - one for registration that ratelimits registration requests based on the\n# client's IP address.\n# - one for login that ratelimits login requests based on the client's IP\n# address.\n# - one for login that ratelimits login requests based on the account the\n# client is attempting to log into.\n# - one for login that ratelimits login requests based on the account the\n# client is attempting to log into, based on the amount of failed login\n# attempts for this account.\n# - one for ratelimiting redactions by room admins. If this is not explicitly\n# set then it uses the same ratelimiting as per rc_message. This is useful\n# to allow room admins to deal with abuse quickly.\n#\n# The defaults are as shown below.\n#\n#rc_message:\n# per_second: 0.2\n# burst_count: 10\n#\n#rc_registration:\n# per_second: 0.17\n# burst_count: 3\n#\n#rc_login:\n# address:\n# per_second: 0.17\n# burst_count: 3\n# account:\n# per_second: 0.17\n# burst_count: 3\n# failed_attempts:\n# per_second: 0.17\n# burst_count: 3\n#\n#rc_admin_redaction:\n# per_second: 1\n# burst_count: 50\n\n\n# Ratelimiting settings for incoming federation\n#\n# The rc_federation configuration is made up of the following settings:\n# - window_size: window size in milliseconds\n# - sleep_limit: number of federation requests from a single server in\n# a window before the server will delay processing the request.\n# - sleep_delay: duration in milliseconds to delay processing events\n# from remote servers by if they go over the sleep limit.\n# - reject_limit: maximum number of concurrent federation requests\n# allowed from a single server\n# - concurrent: number of federation requests to concurrently process\n# from a single server\n#\n# The defaults are as shown below.\n#\n#rc_federation:\n# window_size: 1000\n# sleep_limit: 10\n# sleep_delay: 500\n# reject_limit: 50\n# concurrent: 3\n\n# Target outgoing federation transaction frequency for sending read-receipts,\n# per-room.\n#\n# If we end up trying to send out more read-receipts, they will get buffered up\n# into fewer transactions.\n#\n#federation_rr_transactions_per_room_per_second: 50\n\n\n\n## Media Store ##\n\n# Enable the media store service in the Synapse master. Uncomment the\n# following if you are using a separate media store worker.\n#\n#enable_media_repo: false\n\n# Directory where uploaded images and attachments are stored.\n#\nmedia_store_path: \"/data/media_store\"\n\n# Media storage providers allow media to be stored in different\n# locations.\n#\n#media_storage_providers:\n# - module: file_system\n# # Whether to write new local files.\n# store_local: false\n# # Whether to write new remote media\n# store_remote: false\n# # Whether to block upload requests waiting for write to this\n# # provider to complete\n# store_synchronous: false\n# config:\n# directory: /mnt/some/other/directory\n\n# Directory where in-progress uploads are stored.\n#\nuploads_path: \"/data/uploads\"\n\n# The largest allowed upload size in bytes\n\nmax_upload_size: 10M\n\n# Maximum number of pixels that will be thumbnailed\n\nmax_image_pixels: 32M\n\n# Whether to generate new thumbnails on the fly to precisely match\n# the resolution requested by the client. If true then whenever\n# a new resolution is requested by the client the server will\n# generate a new thumbnail. If false the server will pick a thumbnail\n# from a precalculated list.\n#\n#dynamic_thumbnails: false\n\n# List of thumbnails to precalculate when an image is uploaded.\n#\n#thumbnail_sizes:\n# - width: 32\n# height: 32\n# method: crop\n# - width: 96\n# height: 96\n# method: crop\n# - width: 320\n# height: 240\n# method: scale\n# - width: 640\n# height: 480\n# method: scale\n# - width: 800\n# height: 600\n# method: scale\n\n# Is the preview URL API enabled?\n#\n# 'false' by default: uncomment the following to enable it (and specify a\n# url_preview_ip_range_blacklist blacklist).\n#\nurl_preview_enabled: false\n\n# The largest allowed URL preview spidering size in bytes\n\nmax_spider_size: 1M\n\n## Captcha ##\n# See docs/CAPTCHA_SETUP for full details of configuring this.\n\n# This homeserver's ReCAPTCHA public key.\n#\n#recaptcha_public_key: \"YOUR_PUBLIC_KEY\"\n\n# This homeserver's ReCAPTCHA private key.\n#\n#recaptcha_private_key: \"YOUR_PRIVATE_KEY\"\n\n# Enables ReCaptcha checks when registering, preventing signup\n# unless a captcha is answered. Requires a valid ReCaptcha\n# public/private key.\n#\n#enable_registration_captcha: false\n\n# A secret key used to bypass the captcha test entirely.\n#\n#captcha_bypass_secret: \"YOUR_SECRET_HERE\"\n\n# The API endpoint to use for verifying m.login.recaptcha responses.\n#\n#recaptcha_siteverify_api: \"https://www.recaptcha.net/recaptcha/api/siteverify\"\n \n## Registration ##\n#\n# Registration can be rate-limited using the parameters in the \"Ratelimiting\"\n# section of this file.\n\n# Enable registration for new users.\n#\nenable_registration: ${matrixRegistrationEnabled?c}\n\n# Optional account validity configuration. This allows for accounts to be denied\n# any request after a given period.\n#\n# ``enabled`` defines whether the account validity feature is enabled. Defaults\n# to False.\n#\n# ``period`` allows setting the period after which an account is valid\n# after its registration. When renewing the account, its validity period\n# will be extended by this amount of time. This parameter is required when using\n# the account validity feature.\n#\n# ``renew_at`` is the amount of time before an account's expiry date at which\n# Synapse will send an email to the account's email address with a renewal link.\n# This needs the ``email`` and ``public_baseurl`` configuration sections to be\n# filled.\n#\n# ``renew_email_subject`` is the subject of the email sent out with the renewal\n# link. ``%(app)s`` can be used as a placeholder for the ``app_name`` parameter\n# from the ``email`` section.\n#\n# Once this feature is enabled, Synapse will look for registered users without an\n# expiration date at startup and will add one to every account it found using the\n# current settings at that time.\n# This means that, if a validity period is set, and Synapse is restarted (it will\n# then derive an expiration date from the current validity period), and some time\n# after that the validity period changes and Synapse is restarted, the users'\n# expiration dates won't be updated unless their account is manually renewed. This\n# date will be randomly selected within a range [now + period - d ; now + period],\n# where d is equal to 10% of the validity period.\n#\n#account_validity:\n# enabled: true\n# period: 6w\n# renew_at: 1w\n# renew_email_subject: \"Renew your %(app)s account\"\n# # Directory in which Synapse will try to find the HTML files to serve to the\n# # user when trying to renew an account. Optional, defaults to\n# # synapse/res/templates.\n# template_dir: \"res/templates\"\n# # HTML to be displayed to the user after they successfully renewed their\n# # account. Optional.\n# account_renewed_html_path: \"account_renewed.html\"\n# # HTML to be displayed when the user tries to renew an account with an invalid\n# # renewal token. Optional.\n# invalid_token_html_path: \"invalid_token.html\"\n\n# Time that a user's session remains valid for, after they log in.\n#\n# Note that this is not currently compatible with guest logins.\n#\n# Note also that this is calculated at login time: changes are not applied\n# retrospectively to users who have already logged in.\n#\n# By default, this is infinite.\n#\n#session_lifetime: 24h\n\n# Explicitly disable asking for MSISDNs from the registration\n# flow (overrides registrations_require_3pid if MSISDNs are set as required)\n#\n#disable_msisdn_registration: true\n\n# Mandate that users are only allowed to associate certain formats of\n# 3PIDs with accounts on this server.\n#\n#allowed_local_3pids:\n# - medium: email\n# pattern: '.*@matrix\\.org'\n# - medium: email\n# pattern: '.*@vector\\.im'\n# - medium: msisdn\n# pattern: '\\+44'\n\n# Enable 3PIDs lookup requests to identity servers from this server.\n#\n#enable_3pid_lookup: true\n\n\n# Set the number of bcrypt rounds used to generate password hash.\n# Larger numbers increase the work factor needed to generate the hash.\n# The default number is 12 (which equates to 2^12 rounds).\n# N.B. that increasing this will exponentially increase the time required\n# to register or login - e.g. 24 => 2^24 rounds which will take >20 mins.\n#\n#bcrypt_rounds: 12\n\n# Allows users to register as guests without a password/email/etc, and\n# participate in rooms hosted on this server which have been made\n# accessible to anonymous users.\n\nallow_guest_access: ${matrixRegistrationAllowGuests?c}\n\n# The identity server which we suggest that clients should use when users log\n# in on this server.\n#\n# (By default, no suggestion is made, so it is left up to the client.\n# This setting is ignored unless public_baseurl is also set.)\n#\n#default_identity_server: https://matrix.org\n\n# The list of identity servers trusted to verify third party\n# identifiers by this server.\n#\n# Also defines the ID server which will be called when an account is\n# deactivated (one will be picked arbitrarily).\n#\n# Note: This option is deprecated. Since v0.99.4, Synapse has tracked which identity\n# server a 3PID has been bound to. For 3PIDs bound before then, Synapse runs a\n# background migration script, informing itself that the identity server all of its\n# 3PIDs have been bound to is likely one of the below.\n#\n# As of Synapse v1.4.0, all other functionality of this option has been deprecated, and\n# it is now solely used for the purposes of the background migration script, and can be\n# removed once it has run.\n#trusted_third_party_id_servers:\n# - matrix.org\n# - vector.im\n\n# Handle threepid (email/phone etc) registration and password resets through a set of\n# *trusted* identity servers. Note that this allows the configured identity server to\n# reset passwords for accounts!\n#\n# Be aware that if `email` is not set, and SMTP options have not been\n# configured in the email config block, registration and user password resets via\n# email will be globally disabled.\n#\n# Additionally, if `msisdn` is not set, registration and password resets via msisdn\n# will be disabled regardless. This is due to Synapse currently not supporting any\n# method of sending SMS messages on its own.\n#\n# To enable using an identity server for operations regarding a particular third-party\n# identifier type, set the value to the URL of that identity server as shown in the\n# examples below.\n#\n# Servers handling the these requests must answer the `/requestToken` endpoints defined\n# by the Matrix Identity Service API specification:\n# https://matrix.org/docs/spec/identity_service/latest\n#\n# If a delegate is specified, the config option public_baseurl must also be filled out.\n#\naccount_threepid_delegates:\n#email: https://example.com # Delegate email sending to example.com\n#msisdn: http://localhost:8090 # Delegate SMS sending to this local process\n\n# Whether users are allowed to change their displayname after it has\n# been initially set. Useful when provisioning users based on the\n# contents of a third-party directory.\n#\n# Does not apply to server administrators. Defaults to 'true'\n#\n#enable_set_displayname: false\n\n# Whether users are allowed to change their avatar after it has been\n# initially set. Useful when provisioning users based on the contents\n# of a third-party directory.\n#\n# Does not apply to server administrators. Defaults to 'true'\n#\n#enable_set_avatar_url: false\n\n# Whether users can change the 3PIDs associated with their accounts\n# (email address and msisdn).\n#\n# Defaults to 'true'\n#\n#enable_3pid_changes: false\n\n# Users who register on this homeserver will automatically be joined\n# to these rooms\n\nauto_join_rooms: []\n\n# Where auto_join_rooms are specified, setting this flag ensures that the\n# the rooms exist by creating them when the first user on the\n# homeserver registers.\n#\n# By default the auto-created rooms are publicly joinable from any federated\n# server. Use the autocreate_auto_join_rooms_federated and\n# autocreate_auto_join_room_preset settings below to customise this behaviour.\n#\n# Setting to false means that if the rooms are not manually created,\n# users cannot be auto-joined since they do not exist.\n#\n# Defaults to true. Uncomment the following line to disable automatically\n# creating auto-join rooms.\n#\n#autocreate_auto_join_rooms: false\n\n# Whether the auto_join_rooms that are auto-created are available via\n# federation. Only has an effect if autocreate_auto_join_rooms is true.\n#\n# Note that whether a room is federated cannot be modified after\n# creation.\n#\n# Defaults to true: the room will be joinable from other servers.\n# Uncomment the following to prevent users from other homeservers from\n# joining these rooms.\n#\n#autocreate_auto_join_rooms_federated: false\n\n# The room preset to use when auto-creating one of auto_join_rooms. Only has an\n# effect if autocreate_auto_join_rooms is true.\n#\n# This can be one of \"public_chat\", \"private_chat\", or \"trusted_private_chat\".\n# If a value of \"private_chat\" or \"trusted_private_chat\" is used then\n# auto_join_mxid_localpart must also be configured.\n#\n# Defaults to \"public_chat\", meaning that the room is joinable by anyone, including\n# federated servers if autocreate_auto_join_rooms_federated is true (the default).\n# Uncomment the following to require an invitation to join these rooms.\n#\n#autocreate_auto_join_room_preset: private_chat\n\n# The local part of the user id which is used to create auto_join_rooms if\n# autocreate_auto_join_rooms is true. If this is not provided then the\n# initial user account that registers will be used to create the rooms.\n#\n# The user id is also used to invite new users to any auto-join rooms which\n# are set to invite-only.\n#\n# It *must* be configured if autocreate_auto_join_room_preset is set to\n# \"private_chat\" or \"trusted_private_chat\".\n#\n# Note that this must be specified in order for new users to be correctly\n# invited to any auto-join rooms which have been set to invite-only (either\n# at the time of creation or subsequently).\n#\n# Note that, if the room already exists, this user must be joined and\n# have the appropriate permissions to invite new members.\n#\n#auto_join_mxid_localpart: system\n\n# When auto_join_rooms is specified, setting this flag to false prevents\n# guest accounts from being automatically joined to the rooms.\n#\n# Defaults to true.\n#\n#auto_join_rooms_for_guests: false\n\n\n## Metrics ###\n\n# Enable collection and rendering of performance metrics\n#\n\nenable_metrics: ${synapseMetricsEnabled?c}\n\n# Enable sentry integration\n# NOTE: While attempts are made to ensure that the logs don't contain\n# any sensitive information, this cannot be guaranteed. By enabling\n# this option the sentry server may therefore receive sensitive\n# information, and it in turn may then diseminate sensitive information\n# through insecure notification channels if so configured.\n#\n#sentry:\n# dsn: \"...\"\n\n# Flags to enable Prometheus metrics which are not suitable to be\n# enabled by default, either for performance reasons or limited use.\n#\nmetrics_flags:\n # Publish synapse_federation_known_servers, a gauge of the number of\n # servers this homeserver knows about, including itself. May cause\n # performance problems on large homeservers.\n #\n #known_servers: true\n\n# Whether or not to report anonymized homeserver usage statistics.\nreport_stats: false\n\n# The endpoint to report the anonymized homeserver usage statistics to.\n# Defaults to https://matrix.org/report-usage-stats/push\n#\n#report_stats_endpoint: https://example.com/report-usage-stats/push\n\n\n## API Configuration ##\n\n# A list of event types that will be included in the room_invite_state\n#\n#room_invite_state_types:\n# - \"m.room.join_rules\"\n# - \"m.room.canonical_alias\"\n# - \"m.room.avatar\"\n# - \"m.room.encryption\"\n# - \"m.room.name\"\n\n\n# A list of application service config files to use\n#\napp_service_config_files: []\n\n# Uncomment to enable tracking of application service IP addresses. Implicitly\n# enables MAU tracking for application service users.\n#\n#track_appservice_user_ips: true \n\n# a secret which is used to calculate HMACs for form values, to stop\n# falsification of values. Must be specified for the User Consent\n# forms to work.\n#\n# form_secret: <PRIVATE STRING>\n\n## Signing Keys ##\n\n# Path to the signing key to sign messages with\n#\nsigning_key_path: \"/data/keys/${APP_INSTANCE_NAME}.${DOMAIN_CODENAME}.${BASE_URL}.signing.key\"\n\n# The keys that the server used to sign messages with but won't use\n# to sign new messages. E.g. it has lost its private key\n#\n#old_signing_keys:\n# \"ed25519:auto\":\n# # Base64 encoded public key\n# key: \"The public part of your old signing key.\"\n# # Millisecond POSIX timestamp when the key expired.\n# expired_ts: 123456789123\n\n# How long key response published by this server is valid for.\n# Used to set the valid_until_ts in /key/v2 APIs.\n# Determines how quickly servers will query to check which keys\n# are still valid.\n#\n#key_refresh_interval: 1d\n\n# The trusted servers to download signing keys from.\n#\n# When we need to fetch a signing key, each server is tried in parallel.\n#\n# Normally, the connection to the key server is validated via TLS certificates.\n# Additional security can be provided by configuring a `verify key`, which\n# will make synapse check that the response is signed by that key.\n#\n# This setting supercedes an older setting named `perspectives`. The old format\n# is still supported for backwards-compatibility, but it is deprecated.\n#\n# 'trusted_key_servers' defaults to matrix.org, but using it will generate a\n# warning on start-up. To suppress this warning, set\n# 'suppress_key_server_warning' to true.\n#\n# Options for each entry in the list include:\n#\n# server_name: the name of the server. required.\n#\n# verify_keys: an optional map from key id to base64-encoded public key.\n# If specified, we will check that the response is signed by at least\n# one of the given keys.\n#\n# accept_keys_insecurely: a boolean. Normally, if `verify_keys` is unset,\n# and federation_verify_certificates is not `true`, synapse will refuse\n# to start, because this would allow anyone who can spoof DNS responses\n# to masquerade as the trusted key server. If you know what you are doing\n# and are sure that your network environment provides a secure connection\n# to the key server, you can set this to `true` to override this\n# behaviour.\n#\n# An example configuration might look like:\n#\n#trusted_key_servers:\n# - server_name: \"my_trusted_server.example.com\"\n# verify_keys:\n# \"ed25519:auto\": \"abcdefghijklmnopqrstuvwxyzabcdefghijklmopqr\"\n# - server_name: \"my_other_trusted_server.example.com\"\n#\n\n# Uncomment the following to disable the warning that is emitted when the\n# trusted_key_servers include 'matrix.org'.\n#\nsuppress_key_server_warning: true\n\n\n# The signing keys to use when acting as a trusted key server. If not specified\n# defaults to the server signing key.\n#\n# Can contain multiple keys, one per line.\n#\n#key_server_signing_keys_path: \"key_server_signing_keys.key\"\n\n\n# Enable SAML2 for registration and login. Uses pysaml2.\n#\n# At least one of `sp_config` or `config_path` must be set in this section to\n# enable SAML login.\n#\n# (You will probably also want to set the following options to `false` to\n# disable the regular login/registration flows:\n# * enable_registration\n# * password_config.enabled\n#\n# Once SAML support is enabled, a metadata file will be exposed at\n# https://<server>:<port>/_matrix/saml2/metadata.xml, which you may be able to\n# use to configure your SAML IdP with. Alternatively, you can manually configure\n# the IdP to use an ACS location of\n# https://<server>:<port>/_matrix/saml2/authn_response.\n#\nsaml2_config:\n # `sp_config` is the configuration for the pysaml2 Service Provider.\n # See pysaml2 docs for format of config.\n #\n # Default values will be used for the 'entityid' and 'service' settings,\n # so it is not normally necessary to specify them unless you need to\n # override them.\n #\n #sp_config:\n # # point this to the IdP's metadata. You can use either a local file or\n # # (preferably) a URL.\n # metadata:\n # #local: [\"saml2/idp.xml\"]\n # remote:\n # - url: https://our_idp/metadata.xml\n #\n # # By default, the user has to go to our login page first. If you'd like\n # # to allow IdP-initiated login, set 'allow_unsolicited: true' in a\n # # 'service.sp' section:\n # #\n # #service:\n # # sp:\n # # allow_unsolicited: true\n #\n # # The examples below are just used to generate our metadata xml, and you\n # # may well not need them, depending on your setup. Alternatively you\n # # may need a whole lot more detail - see the pysaml2 docs!\n #\n # description: [\"My awesome SP\", \"en\"]\n # name: [\"Test SP\", \"en\"]\n #\n # organization:\n # name: Example com\n # display_name:\n # - [\"Example co\", \"en\"]\n # url: \"http://example.com\"\n #\n # contact_person:\n # - given_name: Bob\n # sur_name: \"the Sysadmin\"\n # email_address\": [\"admin@example.com\"]\n # contact_type\": technical\n\n # Instead of putting the config inline as above, you can specify a\n # separate pysaml2 configuration file:\n #\n #config_path: \"CONFDIR/sp_conf.py\"\n\n # The lifetime of a SAML session. This defines how long a user has to\n # complete the authentication process, if allow_unsolicited is unset.\n # The default is 15 minutes.\n #\n #saml_session_lifetime: 5m\n\n # An external module can be provided here as a custom solution to\n # mapping attributes returned from a saml provider onto a matrix user.\n #\n user_mapping_provider:\n # The custom module's class. Uncomment to use a custom module.\n #\n #module: mapping_provider.SamlMappingProvider\n\n # Custom configuration values for the module. Below options are\n # intended for the built-in provider, they should be changed if\n # using a custom module. This section will be passed as a Python\n # dictionary to the module's `parse_config` method.\n #\n config:\n # The SAML attribute (after mapping via the attribute maps) to use\n # to derive the Matrix ID from. 'uid' by default.\n #\n # Note: This used to be configured by the\n # saml2_config.mxid_source_attribute option. If that is still\n # defined, its value will be used instead.\n #\n #mxid_source_attribute: displayName\n\n # The mapping system to use for mapping the saml attribute onto a\n # matrix ID.\n #\n # Options include:\n # * 'hexencode' (which maps unpermitted characters to '=xx')\n # * 'dotreplace' (which replaces unpermitted characters with\n # '.').\n # The default is 'hexencode'.\n #\n # Note: This used to be configured by the\n # saml2_config.mxid_mapping option. If that is still defined, its\n # value will be used instead.\n #\n #mxid_mapping: dotreplace\n\n # In previous versions of synapse, the mapping from SAML attribute to\n # MXID was always calculated dynamically rather than stored in a\n # table. For backwards- compatibility, we will look for user_ids\n # matching such a pattern before creating a new account.\n #\n # This setting controls the SAML attribute which will be used for this\n # backwards-compatibility lookup. Typically it should be 'uid', but if\n # the attribute maps are changed, it may be necessary to change it.\n #\n # The default is 'uid'.\n #\n #grandfathered_mxid_source_attribute: upn\n\n # Directory in which Synapse will try to find the template files below.\n # If not set, default templates from within the Synapse package will be used.\n #\n # DO NOT UNCOMMENT THIS SETTING unless you want to customise the templates.\n # If you *do* uncomment it, you will need to make sure that all the templates\n # below are in the directory.\n #\n # Synapse will look for the following templates in this directory:\n #\n # * HTML page to display to users if something goes wrong during the\n # authentication process: 'saml_error.html'.\n #\n # When rendering, this template is given the following variables:\n # * code: an HTML error code corresponding to the error that is being\n # returned (typically 400 or 500)\n #\n # * msg: a textual message describing the error.\n #\n # The variables will automatically be HTML-escaped.\n #\n # You can see the default templates at:\n # https://github.com/matrix-org/synapse/tree/master/synapse/res/templates\n #\n #template_dir: \"res/templates\"\n\n\n# OpenID Connect integration. The following settings can be used to make Synapse\n# use an OpenID Connect Provider for authentication, instead of its internal\n# password database.\n#\n# See https://github.com/matrix-org/synapse/blob/master/docs/openid.md.\n#\noidc_config:\n # Uncomment the following to enable authorization against an OpenID Connect\n # server. Defaults to false.\n #\n #enabled: true\n\n # Uncomment the following to disable use of the OIDC discovery mechanism to\n # discover endpoints. Defaults to true.\n #\n #discover: false\n\n # the OIDC issuer. Used to validate tokens and (if discovery is enabled) to\n # discover the provider's endpoints.\n #\n # Required if 'enabled' is true.\n #\n #issuer: \"https://accounts.example.com/\"\n\n # oauth2 client id to use.\n #\n # Required if 'enabled' is true.\n #\n #client_id: \"provided-by-your-issuer\"\n\n # oauth2 client secret to use.\n #\n # Required if 'enabled' is true.\n #\n #client_secret: \"provided-by-your-issuer\"\n\n # auth method to use when exchanging the token.\n # Valid values are 'client_secret_basic' (default), 'client_secret_post' and\n # 'none'.\n #\n #client_auth_method: client_secret_post\n\n # list of scopes to request. This should normally include the \"openid\" scope.\n # Defaults to [\"openid\"].\n #\n #scopes: [\"openid\", \"profile\"]\n\n # the oauth2 authorization endpoint. Required if provider discovery is disabled.\n #\n #authorization_endpoint: \"https://accounts.example.com/oauth2/auth\"\n\n # the oauth2 token endpoint. Required if provider discovery is disabled.\n #\n #token_endpoint: \"https://accounts.example.com/oauth2/token\"\n\n # the OIDC userinfo endpoint. Required if discovery is disabled and the\n # \"openid\" scope is not requested.\n #\n #userinfo_endpoint: \"https://accounts.example.com/userinfo\"\n\n # URI where to fetch the JWKS. Required if discovery is disabled and the\n # \"openid\" scope is used.\n #\n #jwks_uri: \"https://accounts.example.com/.well-known/jwks.json\"\n\n # Uncomment to skip metadata verification. Defaults to false.\n #\n # Use this if you are connecting to a provider that is not OpenID Connect\n # compliant.\n # Avoid this in production.\n #\n #skip_verification: true\n\n # An external module can be provided here as a custom solution to mapping\n # attributes returned from a OIDC provider onto a matrix user.\n #\n user_mapping_provider:\n # The custom module's class. Uncomment to use a custom module.\n # Default is 'synapse.handlers.oidc_handler.JinjaOidcMappingProvider'.\n #\n # See https://github.com/matrix-org/synapse/blob/master/docs/sso_mapping_providers.md#openid-mapping-providers\n # for information on implementing a custom mapping provider.\n #\n #module: mapping_provider.OidcMappingProvider\n\n # Custom configuration values for the module. This section will be passed as\n # a Python dictionary to the user mapping provider module's `parse_config`\n # method.\n #\n # The examples below are intended for the default provider: they should be\n # changed if using a custom provider.\n #\n config:\n # name of the claim containing a unique identifier for the user.\n # Defaults to `sub`, which OpenID Connect compliant providers should provide.\n #\n #subject_claim: \"sub\"\n # Jinja2 template for the localpart of the MXID.\n #\n # When rendering, this template is given the following variables:\n # * user: The claims returned by the UserInfo Endpoint and/or in the ID\n # Token\n #\n # This must be configured if using the default mapping provider.\n #\n # Jinja2 template for the display name to set on first login.\n #\n # If unset, no displayname will be set.\n #\n\n# Enable CAS for registration and login.\n#\n#cas_config:\n# enabled: true\n# server_url: \"https://cas-server.com\"\n# service_url: \"https://homeserver.domain.com:8448\"\n# #displayname_attribute: name\n# #required_attributes:\n# # name: value\n\n\n# Additional settings to use with single-sign on systems such as OpenID Connect,\n# SAML2 and CAS.\n#\nsso:\n # A list of client URLs which are whitelisted so that the user does not\n # have to confirm giving access to their account to the URL. Any client\n # whose URL starts with an entry in the following list will not be subject\n # to an additional confirmation step after the SSO login is completed.\n #\n # WARNING: An entry such as \"https://my.client\" is insecure, because it\n # will also match \"https://my.client.evil.site\", exposing your users to\n # phishing attacks from evil.site. To avoid this, include a slash after the\n # hostname: \"https://my.client/\".\n #\n # If public_baseurl is set, then the login fallback page (used by clients\n # that don't natively support the required login flows) is whitelisted in\n # addition to any URLs in this list.\n #\n # By default, this list is empty.\n #\n #client_whitelist:\n # - https://riot.im/develop\n # - https://my.custom.client/\n\n # Directory in which Synapse will try to find the template files below.\n # If not set, default templates from within the Synapse package will be used.\n #\n # DO NOT UNCOMMENT THIS SETTING unless you want to customise the templates.\n # If you *do* uncomment it, you will need to make sure that all the templates\n # below are in the directory.\n #\n # Synapse will look for the following templates in this directory:\n #\n # * HTML page for a confirmation step before redirecting back to the client\n # with the login token: 'sso_redirect_confirm.html'.\n #\n # When rendering, this template is given three variables:\n # * redirect_url: the URL the user is about to be redirected to. Needs\n # manual escaping (see\n # https://jinja.palletsprojects.com/en/2.11.x/templates/#html-escaping).\n #\n # * display_url: the same as `redirect_url`, but with the query\n # parameters stripped. The intention is to have a\n # human-readable URL to show to users, not to use it as\n # the final address to redirect to. Needs manual escaping\n # (see https://jinja.palletsprojects.com/en/2.11.x/templates/#html-escaping).\n #\n # * server_name: the homeserver's name.\n #\n # * HTML page which notifies the user that they are authenticating to confirm\n # an operation on their account during the user interactive authentication\n # process: 'sso_auth_confirm.html'.\n #\n # When rendering, this template is given the following variables:\n # * redirect_url: the URL the user is about to be redirected to. Needs\n # manual escaping (see\n # https://jinja.palletsprojects.com/en/2.11.x/templates/#html-escaping).\n #\n # * description: the operation which the user is being asked to confirm\n #\n # * HTML page shown after a successful user interactive authentication session:\n # 'sso_auth_success.html'.\n #\n # Note that this page must include the JavaScript which notifies of a successful authentication\n # (see https://matrix.org/docs/spec/client_server/r0.6.0#fallback).\n #\n # This template has no additional variables.\n #\n # * HTML page shown during single sign-on if a deactivated user (according to Synapse's database)\n # attempts to login: 'sso_account_deactivated.html'.\n #\n # This template has no additional variables.\n #\n # * HTML page to display to users if something goes wrong during the\n # OpenID Connect authentication process: 'sso_error.html'.\n #\n # When rendering, this template is given two variables:\n # * error: the technical name of the error\n # * error_description: a human-readable message for the error\n #\n # You can see the default templates at:\n # https://github.com/matrix-org/synapse/tree/master/synapse/res/templates\n #\n #template_dir: \"res/templates\"\n\n\n# JSON web token integration. The following settings can be used to make\n# Synapse JSON web tokens for authentication, instead of its internal\n# password database.\n#\n# Each JSON Web Token needs to contain a \"sub\" (subject) claim, which is\n# used as the localpart of the mxid.\n#\n# Additionally, the expiration time (\"exp\"), not before time (\"nbf\"),\n# and issued at (\"iat\") claims are validated if present.\n#\n# Note that this is a non-standard login type and client support is\n# expected to be non-existant.\n#\n# See https://github.com/matrix-org/synapse/blob/master/docs/jwt.md.\n#\n#jwt_config:\n # Uncomment the following to enable authorization using JSON web\n # tokens. Defaults to false.\n #\n #enabled: true\n\n # This is either the private shared secret or the public key used to\n # decode the contents of the JSON web token.\n #\n # Required if 'enabled' is true.\n #\n #secret: \"provided-by-your-issuer\"\n\n # The algorithm used to sign the JSON web token.\n #\n # Supported algorithms are listed at\n # https://pyjwt.readthedocs.io/en/latest/algorithms.html\n #\n # Required if 'enabled' is true.\n #\n #algorithm: \"provided-by-your-issuer\"\n\n # The issuer to validate the \"iss\" claim against.\n #\n # Optional, if provided the \"iss\" claim will be required and\n # validated for all JSON web tokens.\n #\n #issuer: \"provided-by-your-issuer\"\n\n # A list of audiences to validate the \"aud\" claim against.\n #\n # Optional, if provided the \"aud\" claim will be required and\n # validated for all JSON web tokens.\n #\n # Note that if the \"aud\" claim is included in a JSON web token then\n # validation will fail without configuring audiences.\n #\n #audiences:\n # - \"provided-by-your-issuer\"\n\n\npassword_config:\n # Uncomment to disable password login\n #\n #enabled: false\n\n # Uncomment to disable authentication against the local password\n # database. This is ignored if `enabled` is false, and is only useful\n # if you have other password_providers.\n #\n #localdb_enabled: false\n\n # Uncomment and change to a secret random string for extra security.\n # DO NOT CHANGE THIS AFTER INITIAL SETUP!\n #\n #pepper: \"EVEN_MORE_SECRET\"\n\n # Define and enforce a password policy. Each parameter is optional.\n # This is an implementation of MSC2000.\n #\n policy:\n # Whether to enforce the password policy.\n # Defaults to 'false'.\n #\n #enabled: true\n\n # Minimum accepted length for a password.\n # Defaults to 0.\n #\n #minimum_length: 15\n\n # Whether a password must contain at least one digit.\n # Defaults to 'false'.\n #\n #require_digit: true\n\n # Whether a password must contain at least one symbol.\n # A symbol is any character that's not a number or a letter.\n # Defaults to 'false'.\n #\n #require_symbol: true\n\n # Whether a password must contain at least one lowercase letter.\n # Defaults to 'false'.\n #\n #require_lowercase: true\n\n # Whether a password must contain at least one lowercase letter.\n # Defaults to 'false'.\n #\n #require_uppercase: true\n\n\n# Configuration for sending emails from Synapse.\n#\nemail:\n enable_notifs: ${mailEnabled?c}\n notif_from: ${mailFrom}\n smtp_host: ${SMTP_HOSTNAME}\n smtp_port: ${SMTP_PORT}\n\n\n # notif_from defines the \"From\" address to use when sending emails.\n # It must be set if email sending is enabled.\n #\n # The placeholder '%(app)s' will be replaced by the application name,\n # which is normally 'app_name' (below), but may be overridden by the\n # Matrix client application.\n #\n # Note that the placeholder must be written '%(app)s', including the\n # trailing 's'.\n #\n # Uncomment the following to enable sending emails for messages that the user\n # has missed. Disabled by default.\n #\n #enable_notifs: true\n\n # Uncomment the following to disable automatic subscription to email\n # notifications for new users. Enabled by default.\n #\n #notif_for_new_users: false\n\n # Custom URL for client links within the email notifications. By default\n # links will be based on \"https://matrix.to\".\n #\n # (This setting used to be called riot_base_url; the old name is still\n # supported for backwards-compatibility but is now deprecated.)\n client_base_url: element-${APP_INSTANCE_NAME}.${DOMAIN_CODENAME}.${BASE_URL}\n\n # Configure the time that a validation email will expire after sending.\n # Defaults to 1h.\n #\n #validation_token_lifetime: 15m\n\n # DO NOT UNCOMMENT THIS SETTING unless you want to customise the templates.\n # If you *do* uncomment it, you will need to make sure that all the templates\n # below are in the directory.\n #\n # Synapse will look for the following templates in this directory:\n #\n # * The contents of email notifications of missed events: 'notif_mail.html' and\n # 'notif_mail.txt'.\n #\n # * The contents of account expiry notice emails: 'notice_expiry.html' and\n # 'notice_expiry.txt'.\n #\n # * The contents of password reset emails sent by the homeserver:\n # 'password_reset.html' and 'password_reset.txt'\n #\n # * HTML pages for success and failure that a user will see when they follow\n # the link in the password reset email: 'password_reset_success.html' and\n # 'password_reset_failure.html'\n #\n # * The contents of address verification emails sent during registration:\n # 'registration.html' and 'registration.txt'\n #\n # * HTML pages for success and failure that a user will see when they follow\n # the link in an address verification email sent during registration:\n # 'registration_success.html' and 'registration_failure.html'\n #\n # * The contents of address verification emails sent when an address is added\n # to a Matrix account: 'add_threepid.html' and 'add_threepid.txt'\n #\n # * HTML pages for success and failure that a user will see when they follow\n # the link in an address verification email sent when an address is added\n # to a Matrix account: 'add_threepid_success.html' and\n # 'add_threepid_failure.html'\n #\n # You can see the default templates at:\n # https://github.com/matrix-org/synapse/tree/master/synapse/res/templates\n #\n #template_dir: \"res/templates\"\n\n # Subjects to use when sending emails from Synapse.\n #\n # The placeholder '%(app)s' will be replaced with the value of the 'app_name'\n # setting above, or by a value dictated by the Matrix client application.\n #\n # If a subject isn't overridden in this configuration file, the value used as\n # its example will be used.\n #\n #subjects:\n\n # Subjects for notification emails.\n #\n # On top of the '%(app)s' placeholder, these can use the following\n # placeholders:\n #\n # * '%(person)s', which will be replaced by the display name of the user(s)\n # that sent the message(s), e.g. \"Alice and Bob\".\n # * '%(room)s', which will be replaced by the name of the room the\n # message(s) have been sent to, e.g. \"My super room\".\n #\n # See the example provided for each setting to see which placeholder can be\n # used and how to use them.\n #\n # Subject to use to notify about one message from one or more user(s) in a\n # room which has a name.\n #message_from_person_in_room: \"[%(app)s] You have a message on %(app)s from %(person)s in the %(room)s room...\"\n #\n # Subject to use to notify about one message from one or more user(s) in a\n # room which doesn't have a name.\n #message_from_person: \"[%(app)s] You have a message on %(app)s from %(person)s...\"\n #\n # Subject to use to notify about multiple messages from one or more users in\n # a room which doesn't have a name.\n #messages_from_person: \"[%(app)s] You have messages on %(app)s from %(person)s...\"\n #\n # Subject to use to notify about multiple messages in a room which has a\n # name.\n #messages_in_room: \"[%(app)s] You have messages on %(app)s in the %(room)s room...\"\n #\n # Subject to use to notify about multiple messages in multiple rooms.\n #messages_in_room_and_others: \"[%(app)s] You have messages on %(app)s in the %(room)s room and others...\"\n #\n # Subject to use to notify about multiple messages from multiple persons in\n # multiple rooms. This is similar to the setting above except it's used when\n # the room in which the notification was triggered has no name.\n #messages_from_person_and_others: \"[%(app)s] You have messages on %(app)s from %(person)s and others...\"\n #\n # Subject to use to notify about an invite to a room which has a name.\n #invite_from_person_to_room: \"[%(app)s] %(person)s has invited you to join the %(room)s room on %(app)s...\"\n #\n # Subject to use to notify about an invite to a room which doesn't have a\n # name.\n #invite_from_person: \"[%(app)s] %(person)s has invited you to chat on %(app)s...\"\n\n # Subject for emails related to account administration.\n #\n # On top of the '%(app)s' placeholder, these one can use the\n # '%(server_name)s' placeholder, which will be replaced by the value of the\n # 'server_name' setting in your Synapse configuration.\n #\n # Subject to use when sending a password reset email.\n #password_reset: \"[%(server_name)s] Password reset\"\n #\n # Subject to use when sending a verification email to assert an address's\n # ownership.\n #email_validation: \"[%(server_name)s] Validate your email\"\n\n\n# Password providers allow homeserver administrators to integrate\n# their Synapse installation with existing authentication methods\n# ex. LDAP, external tokens, etc.\n#\n# For more information and known implementations, please see\n# https://github.com/matrix-org/synapse/blob/master/docs/password_auth_providers.md\n#\n# Note: instances wishing to use SAML or CAS authentication should\n# instead use the `saml2_config` or `cas_config` options,\n# respectively.\n#\npassword_providers:\n# # Example config for an LDAP auth provider\n# - module: \"ldap_auth_provider.LdapAuthProvider\"\n# config:\n# enabled: true\n# uri: \"ldap://ldap.example.com:389\"\n# start_tls: true\n# base: \"ou=users,dc=example,dc=com\"\n# attributes:\n# uid: \"cn\"\n# mail: \"email\"\n# name: \"givenName\"\n# #bind_dn:\n# #bind_password:\n# #filter: \"(objectClass=posixAccount)\"\n\n\n\n# Clients requesting push notifications can either have the body of\n# the message sent in the notification poke along with other details\n# like the sender, or just the event ID and room ID (`event_id_only`).\n# If clients choose the former, this option controls whether the\n# notification request includes the content of the event (other details\n# like the sender are still included). For `event_id_only` push, it\n# has no effect.\n#\n# For modern android devices the notification content will still appear\n# because it is loaded by the app. iPhone, however will send a\n# notification saying only that a message arrived and who it came from.\n#\n#push:\n# include_content: true\n\n\n# Spam checkers are third-party modules that can block specific actions\n# of local users, such as creating rooms and registering undesirable\n# usernames, as well as remote users by redacting incoming events.\n#\nspam_checker:\n #- module: \"my_custom_project.SuperSpamChecker\"\n # config:\n # example_option: 'things'\n #- module: \"some_other_project.BadEventStopper\"\n # config:\n # example_stop_events_from: ['@bad:example.com']\n\n\n## Rooms ##\n\n# Controls whether locally-created rooms should be end-to-end encrypted by\n# default.\n#\n# Possible options are \"all\", \"invite\", and \"off\". They are defined as:\n#\n# * \"all\": any locally-created room\n# * \"invite\": any room created with the \"private_chat\" or \"trusted_private_chat\"\n# room creation presets\n# * \"off\": this option will take no effect\n#\n# The default value is \"off\".\n#\n# Note that this option will only affect rooms created after it is set. It\n# will also not affect rooms created by other servers.\n#\nencryption_enabled_by_default_for_room_type: invite\n\n\n# Uncomment to allow non-server-admin users to create groups on this server\n#\n#enable_group_creation: true\n\n# If enabled, non server admins can only create groups with local parts\n# starting with this prefix\n#\n#group_creation_prefix: \"unofficial/\"\n\n\n\n# User Directory configuration\n#\n# 'enabled' defines whether users can search the user directory. If\n# false then empty responses are returned to all queries. Defaults to\n# true.\n#\n# 'search_all_users' defines whether to search all users visible to your HS\n# when searching the user directory, rather than limiting to users visible\n# in public rooms. Defaults to false. If you set it True, you'll have to\n# rebuild the user_directory search indexes, see\n# https://github.com/matrix-org/synapse/blob/master/docs/user_directory.md\n#\n#user_directory:\n# enabled: true\n# search_all_users: false\n\n\n# User Consent configuration\n#\n# for detailed instructions, see\n# https://github.com/matrix-org/synapse/blob/master/docs/consent_tracking.md\n#\n# Parts of this section are required if enabling the 'consent' resource under\n# 'listeners', in particular 'template_dir' and 'version'.\n#\n# 'template_dir' gives the location of the templates for the HTML forms.\n# This directory should contain one subdirectory per language (eg, 'en', 'fr'),\n# and each language directory should contain the policy document (named as\n# '<version>.html') and a success page (success.html).\n#\n# 'version' specifies the 'current' version of the policy document. It defines\n# the version to be served by the consent resource if there is no 'v'\n# parameter.\n#\n# 'server_notice_content', if enabled, will send a user a \"Server Notice\"\n# asking them to consent to the privacy policy. The 'server_notices' section\n# must also be configured for this to work. Notices will *not* be sent to\n# guest users unless 'send_server_notice_to_guests' is set to true.\n#\n# 'block_events_error', if set, will block any attempts to send events\n# until the user consents to the privacy policy. The value of the setting is\n# used as the text of the error.\n#\n# 'require_at_registration', if enabled, will add a step to the registration\n# process, similar to how captcha works. Users will be required to accept the\n# policy before their account is created.\n#\n# 'policy_name' is the display name of the policy users will see when registering\n# for an account. Has no effect unless `require_at_registration` is enabled.\n# Defaults to \"Privacy Policy\".\n#\n#user_consent:\n# template_dir: res/templates/privacy\n# version: 1.0\n# server_notice_content:\n# msgtype: m.text\n# body: >-\n# To continue using this homeserver you must review and agree to the\n# terms and conditions at %(consent_uri)s\n# send_server_notice_to_guests: true\n# block_events_error: >-\n# To continue using this homeserver you must review and agree to the\n# terms and conditions at %(consent_uri)s\n# require_at_registration: false\n# policy_name: Privacy Policy\n#\n\n\n\n# Local statistics collection. Used in populating the room directory.\n#\n# 'bucket_size' controls how large each statistics timeslice is. It can\n# be defined in a human readable short form -- e.g. \"1d\", \"1y\".\n#\n# 'retention' controls how long historical statistics will be kept for.\n# It can be defined in a human readable short form -- e.g. \"1d\", \"1y\".\n#\n#\n#stats:\n# enabled: true\n# bucket_size: 1d\n# retention: 1y\n\n\n# Server Notices room configuration\n#\n# Uncomment this section to enable a room which can be used to send notices\n# from the server to users. It is a special room which cannot be left; notices\n# come from a special \"notices\" user id.\n#\n# If you uncomment this section, you *must* define the system_mxid_localpart\n# setting, which defines the id of the user which will be used to send the\n# notices.\n#\n# It's also possible to override the room name, the display name of the\n# \"notices\" user, and the avatar for the user.\n#\n#server_notices:\n# system_mxid_localpart: notices\n# system_mxid_display_name: \"Server Notices\"\n# system_mxid_avatar_url: \"mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ\"\n# room_name: \"Server Notices\"\n\n\n\n# Uncomment to disable searching the public room list. When disabled\n# blocks searching local and remote room lists for local and remote\n# users by always returning an empty list for all queries.\n#\n#enable_room_list_search: false\n\n# The `alias_creation` option controls who's allowed to create aliases\n# on this server.\n#\n# The format of this option is a list of rules that contain globs that\n# match against user_id, room_id and the new alias (fully qualified with\n# server name). The action in the first rule that matches is taken,\n# which can currently either be \"allow\" or \"deny\".\n#\n# Missing user_id/room_id/alias fields default to \"*\".\n#\n# If no rules match the request is denied. An empty list means no one\n# can create aliases.\n#\n# Options for the rules include:\n#\n# user_id: Matches against the creator of the alias\n# alias: Matches against the alias being created\n# room_id: Matches against the room ID the alias is being pointed at\n# action: Whether to \"allow\" or \"deny\" the request if the rule matches\n#\n# The default is:\n#\n#alias_creation_rules:\n# - user_id: \"*\"\n# alias: \"*\"\n# room_id: \"*\"\n# action: allow\n\n# The `room_list_publication_rules` option controls who can publish and\n# which rooms can be published in the public room list.\n#\n# The format of this option is the same as that for\n# `alias_creation_rules`.\n#\n# If the room has one or more aliases associated with it, only one of\n# the aliases needs to match the alias rule. If there are no aliases\n# then only rules with `alias: *` match.\n#\n# If no rules match the request is denied. An empty list means no one\n# can publish rooms.\n#\n# Options for the rules include:\n#\n# user_id: Matches agaisnt the creator of the alias\n# room_id: Matches against the room ID being published\n# alias: Matches against any current local or canonical aliases\n# associated with the room\n# action: Whether to \"allow\" or \"deny\" the request if the rule matches\n#\n# The default is:\n#\n#room_list_publication_rules:\n# - user_id: \"*\"\n# alias: \"*\"\n# room_id: \"*\"\n# action: allow\n\n\n# Server admins can define a Python module that implements extra rules for\n# allowing or denying incoming events. In order to work, this module needs to\n# override the methods defined in synapse/events/third_party_rules.py.\n#\n# This feature is designed to be used in closed federations only, where each\n# participating server enforces the same rules.\n#\n#third_party_event_rules:\n# module: \"my_custom_project.SuperRulesSet\"\n# config:\n# example_option: 'things'\n\n\n## Opentracing ##\n\n# These settings enable opentracing, which implements distributed tracing.\n# This allows you to observe the causal chains of events across servers\n# including requests, key lookups etc., across any server running\n# synapse or any other other services which supports opentracing\n# (specifically those implemented with Jaeger).\n#\nopentracing:\n # tracing is disabled by default. Uncomment the following line to enable it.\n #\n #enabled: true\n\n # The list of homeservers we wish to send and receive span contexts and span baggage.\n # See docs/opentracing.rst\n # This is a list of regexes which are matched against the server_name of the\n # homeserver.\n #\n # By defult, it is empty, so no servers are matched.\n #\n #homeserver_whitelist:\n # - \".*\"\n\n # Jaeger can be configured to sample traces at different rates.\n # All configuration options provided by Jaeger can be set here.\n # Jaeger's configuration mostly related to trace sampling which\n # is documented here:\n # https://www.jaegertracing.io/docs/1.13/sampling/.\n #\n #jaeger_config:\n # sampler:\n # type: const\n # param: 1\n\n # Logging whether spans were started and reported\n #\n # logging:\n # false\n" - } - ] - } - } -} diff --git a/src/test/shell/data/apps/app23-routinator.json b/src/test/shell/data/apps/app23-routinator.json deleted file mode 100644 index fedd4a8b528828f8a68a7e9cee78ab2d605d38e2..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app23-routinator.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Routinator", - "license": "BSD-3-Clause License", - "licenseUrl": "https://github.com/NLnetLabs/routinator/blob/main/LICENSE", - "wwwUrl": "https://www.nlnetlabs.nl/projects/rpki/routinator/", - "sourceUrl": "https://github.com/NLnetLabs/routinator", - "issuesUrl": "https://github.com/NLnetLabs/routinator/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Routinator", - "descriptions": [ - { - "language": "en", - "briefDescription": "RPKI Validator", - "fullDescription": "Routinator is a full-featured software package that can perform RPKI validation as a one-time operation and produce the result in formats such as CSV, JSON and RPSL, or run as a service that periodically downloads and verifies RPKI data. Routinator offers an RTR server allowing routers supporting Origin Validation (port 3323) to connect to it to fetch verified RPKI data. The built-in HTTP server offers a user interface and endpoints for the various file formats, as well as logging, status and Prometheus monitoring. <br/> <em>Please note that the initial start-up of this application may take upwards of 30 minutes, due to the large amount of verification data that needs to be downloaded." - }, - { - "language": "de", - "briefDescription": "RPKI Validator", - "fullDescription": "Routinator is a full-featured software package that can perform RPKI validation as a one-time operation and produce the result in formats such as CSV, JSON and RPSL, or run as a service that periodically downloads and verifies RPKI data. Routinator offers an RTR server allowing routers supporting Origin Validation (port 3323) to connect to it to fetch verified RPKI data. The built-in HTTP server offers a user interface and endpoints for the various file formats, as well as logging, status and Prometheus monitoring. <br/> <em>Please note that the initial start-up of this application may take upwards of 30 minutes, due to the large amount of verification data that needs to be downloaded." - }, - { - "language": "fr", - "briefDescription": "RPKI Validator", - "fullDescription": "Routinator is a full-featured software package that can perform RPKI validation as a one-time operation and produce the result in formats such as CSV, JSON and RPSL, or run as a service that periodically downloads and verifies RPKI data. Routinator offers an RTR server allowing routers supporting Origin Validation (port 3323) to connect to it to fetch verified RPKI data. The built-in HTTP server offers a user interface and endpoints for the various file formats, as well as logging, status and Prometheus monitoring. <br/> <em>Please note that the initial start-up of this application may take upwards of 30 minutes, due to the large amount of verification data that needs to be downloaded." - }, - { - "language": "pl", - "briefDescription": "RPKI Validator", - "fullDescription": "Routinator is a full-featured software package that can perform RPKI validation as a one-time operation and produce the result in formats such as CSV, JSON and RPSL, or run as a service that periodically downloads and verifies RPKI data. Routinator offers an RTR server allowing routers supporting Origin Validation (port 3323) to connect to it to fetch verified RPKI data. The built-in HTTP server offers a user interface and endpoints for the various file formats, as well as logging, status and Prometheus monitoring. <br/> <em>Please note that the initial start-up of this application may take upwards of 30 minutes, due to the large amount of verification data that needs to be downloaded." - } - ], - "tags": [ - "security", - "routing", - "bgp", - "rpki" - ] - }, - "application": { - "id": null, - "name": "Routinator", - "version": "0.8.3", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "Allocated storage space", - "type": "textfield", - "input": true, - "key": "persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "10Gi", - "placeholder": "Default value: 10Gi", - "inputFormat": "plain" - } - ] - }, - { - "label": "Terms acceptance", - "hideLabel": true, - "tableView": true, - "type": "container", - "input": true, - "tab": 0, - "key": "termsAcceptance", - "display": "form", - "components": [ - { - "label": "Terms review", - "autoExpand": false, - "spellcheck": false, - "disabled": true, - "tableView": true, - "persistent": false, - "key": "termsContent", - "attributes": { - "style": "white-space: pre-wrap;" - }, - "type": "textarea", - "inputFormat": "plain", - "rows": 5, - "input": true, - "defaultValue": "In order to proceed with Routinator installation it is required to first review and agree to the ARIN Relying Party Agreement terms available at https://www.arin.net/resources/manage/rpki/tal/. Type in \"yes\" in the text field below to confirm that You agree on the terms." - }, - { - "label": "Terms acceptance confirmation", - "placeholder": "Type in -yes- to confirm", - "tableView": true, - "persistent": false, - "validate": { - "required": true, - "pattern": "(yes)|(YES)|(Yes)", - "customMessage": "You must agree on the terms - enter \"yes\" to confirm" - }, - "key": "termsAcceptanceStatement", - "type": "textfield", - "input": true - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-routinator", - "version": "2.0.0" - } - }, - "deployParameters": { - "DOMAIN_CODENAME": "metallb.subnet_name=%VALUE%" - }, - "globalDeployParameters": { - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Routinator", - "tag": "routinator", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_TLS_ENABLED": "ingress.tls.enabled", - "INGRESS_CLASS": "ingress.class" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": true, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app24-codimd.json b/src/test/shell/data/apps/app24-codimd.json deleted file mode 100644 index 30da32e8486290b49a2cdd3fc3358183c7d10380..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app24-codimd.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "CodiMD", - "license": "AGPL v3", - "licenseUrl": "https://www.gnu.org/licenses/agpl-3.0.txt", - "wwwUrl": "https://hackmd.io/", - "sourceUrl": "https://github.com/hackmdio/codimd", - "issuesUrl": "https://github.com/hackmdio/codimd/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-CodiMD", - "descriptions": [ - { - "language": "en", - "briefDescription": "Collaborative Markdown Editor", - "fullDescription": "CodiMD lets you collaborate in real-time with markdown. It is an open-source version of the popular HackMD software, letting you host and control your team's content with speed and ease." - }, - { - "language": "de", - "briefDescription": "Collaborative Markdown Editor", - "fullDescription": "CodiMD lets you collaborate in real-time with markdown. It is an open-source version of the popular HackMD software, letting you host and control your team's content with speed and ease." - }, - { - "language": "fr", - "briefDescription": "Collaborative Markdown Editor", - "fullDescription": "CodiMD lets you collaborate in real-time with markdown. It is an open-source version of the popular HackMD software, letting you host and control your team's content with speed and ease." - }, - { - "language": "pl", - "briefDescription": "Collaborative Markdown Editor", - "fullDescription": "CodiMD lets you collaborate in real-time with markdown. It is an open-source version of the popular HackMD software, letting you host and control your team's content with speed and ease." - } - ], - "tags": [ - "documentation", - "writing", - "editor" - ] - }, - "application": { - "id": null, - "name": "CodiMD", - "version": "2.4.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "Default user email address", - "type": "email", - "input": true, - "key": "config#email", - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Default user password", - "type": "password", - "input": true, - "key": "config#password", - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Allow anonymous usage", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "env#CMD_ALLOW_ANONYMOUS", - "inputFormat": "plain" - }, - { - "label": "Enable email based registrations", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "env#CMD_ALLOW_EMAIL_REGISTER", - "inputFormat": "plain" - }, - { - "label": "Access options", - "type": "radio", - "input": true, - "tableView": true, - "inputType": "radio", - "key": "accessmethods#public#codimd", - "values": [ - { - "value": "yes", - "label": "Public" - }, - { - "value": "no", - "label": "VPN" - } - ], - "defaultValue": "yes", - "validate": { - "required": true - }, - "labelPosition": "top", - "optionsLabelPosition": "right" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-codimd", - "version": "1.0.0" - }, - "mainDeploymentName": "nmaas-codimd" - }, - "deployParameters": { - }, - "globalDeployParameters": { - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "PUBLIC", - "name": "CodiMD", - "tag": "codimd", - "deployParameters": { - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_CLASS": "ingress.class" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app25-webdav.json b/src/test/shell/data/apps/app25-webdav.json deleted file mode 100644 index acda78a90b059a2f94db7f1a42bd3224cef5ca88..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app25-webdav.json +++ /dev/null @@ -1,218 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "WebDAV Server", - "license": "", - "licenseUrl": "", - "wwwUrl": "", - "sourceUrl": "https://github.com/nmaas-platform/nmaas-webdav", - "issuesUrl": "", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-WebDAV", - "descriptions": [ - { - "language": "en", - "briefDescription": "WebDAV Server with Git versioning", - "fullDescription": "This application represents a simple WebDAV server which can accept remote files. <br><br>During the deployment process, the user can also choose whether the uploaded files should be version using Git. <br><br>Three deployments options are possible: <br>1) Do not use Git for file versioning; <br>2) Initiate a local Git repository for file versioning which can be browsed using an embedded Git web interface; <br>3) Integrate with a remote Git repository (e.g. GitHub) and automatically push any uploaded file to the remote git repository. <br><br>In cases where the third option is chosen, users are required to set up an SSH key pair which will have push access to the target repository. <br>The target repository URL also must be given in an SSH format during application deployment, e.g. git@host.example.com/username/myrepo.<br>" - }, - { - "language": "de", - "briefDescription": "WebDAV Server with Git versioning", - "fullDescription": "This application represents a simple WebDAV server which can accept remote files. <br><br>During the deployment process, the user can also choose whether the uploaded files should be version using Git. <br><br>Three deployments options are possible: <br>1) Do not use Git for file versioning; <br>2) Initiate a local Git repository for file versioning which can be browsed using an embedded Git web interface; <br>3) Integrate with a remote Git repository (e.g. GitHub) and automatically push any uploaded file to the remote git repository. <br><br>In cases where the third option is chosen, users are required to set up an SSH key pair which will have push access to the target repository. <br>The target repository URL also must be given in an SSH format during application deployment, e.g. git@host.example.com/username/myrepo.<br>" - }, - { - "language": "fr", - "briefDescription": "WebDAV Server with Git versioning", - "fullDescription": "This application represents a simple WebDAV server which can accept remote files. <br><br>During the deployment process, the user can also choose whether the uploaded files should be version using Git. <br><br>Three deployments options are possible: <br>1) Do not use Git for file versioning; <br>2) Initiate a local Git repository for file versioning which can be browsed using an embedded Git web interface; <br>3) Integrate with a remote Git repository (e.g. GitHub) and automatically push any uploaded file to the remote git repository. <br><br>In cases where the third option is chosen, users are required to set up an SSH key pair which will have push access to the target repository. <br>The target repository URL also must be given in an SSH format during application deployment, e.g. git@host.example.com/username/myrepo.<br>" - }, - { - "language": "pl", - "briefDescription": "WebDAV Server with Git versioning", - "fullDescription": "This application represents a simple WebDAV server which can accept remote files. <br><br>During the deployment process, the user can also choose whether the uploaded files should be version using Git. <br><br>Three deployments options are possible: <br>1) Do not use Git for file versioning; <br>2) Initiate a local Git repository for file versioning which can be browsed using an embedded Git web interface; <br>3) Integrate with a remote Git repository (e.g. GitHub) and automatically push any uploaded file to the remote git repository. <br><br>In cases where the third option is chosen, users are required to set up an SSH key pair which will have push access to the target repository. <br>The target repository URL also must be given in an SSH format during application deployment, e.g. git@host.example.com/username/myrepo.<br>" - } - ], - "tags": [ - "file management", - "versioning", - "git", - "file storage" - ] - }, - "application": { - "id": null, - "name": "WebDAV Server", - "version": "1.0.0", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "WebDAV HTTP Username", - "type": "textfield", - "input": true, - "key": "env#HTTP_USERNAME", - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "WebDAV HTTP Password", - "type": "password", - "input": true, - "key": "env#HTTP_PASSWORD", - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Enable HTTPS", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "ingress#tls#enabled", - "inputFormat": "plain" - }, - { - "label": "Enable upload versioning using Git", - "type": "checkbox", - "defaultValue": false, - "input": true, - "key": "env#GIT_ENABLED", - "inputFormat": "plain" - }, - { - "label": "Git committer email", - "type": "email", - "input": true, - "key": "env#GIT_EMAIL", - "inputFormat": "plain", - "conditional": { - "show": true, - "when": "env#GIT_ENABLED", - "eq": true - } - }, - { - "label": "Git committer username", - "type": "textfield", - "input": true, - "key": "env#GIT_USERNAME", - "inputFormat": "plain", - "conditional": { - "show": true, - "when": "env#GIT_ENABLED", - "eq": true - } - }, - { - "label": "Git repository URL (SSH format)", - "type": "textfield", - "input": true, - "key": "env#GIT_CLONE_URL", - "inputFormat": "plain", - "placeholder": "username@host/repo", - "conditional": { - "show": true, - "when": "env#GIT_ENABLED", - "eq": true - } - }, - { - "label": "Git maintainer SSH private key", - "type": "textarea", - "rows": 8, - "input": true, - "key": "env#SSH_PRIVKEY", - "inputFormat": "plain", - "conditional": { - "show": true, - "when": "env#GIT_ENABLED", - "eq": true - } - }, - { - "label": "Allocated storage space", - "type": "textfield", - "input": true, - "key": "persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "10Gi", - "placeholder": "Default value: 10Gi", - "inputFormat": "plain" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-webdav", - "version": "1.0.0" - } - }, - "deployParameters": { - }, - "globalDeployParameters": { - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "WebDAV", - "tag": "webdav", - "deployParameters": { - "INGRESS_HOSTS": "ingress.hosts", - "INGRESS_CLASS": "ingress.class" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app27-netbox.json b/src/test/shell/data/apps/app27-netbox.json deleted file mode 100644 index 4e25ae064a718d2ff09183b89b929b82fd8ac50b..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app27-netbox.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "NetBox", - "license": "Apache License 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://netbox.readthedocs.io/", - "sourceUrl": "https://github.com/netbox-community/netbox/", - "issuesUrl": "https://github.com/netbox-community/netbox/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-NetBox", - "descriptions": [ - { - "language": "en", - "briefDescription": "Infrastructure resource modeling application", - "fullDescription": "NetBox is an infrastructure resource modeling (IRM) application designed to empower network automation. <br><br>Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. <br><br>It encompasses the following aspects of network management:<ul><li>IP address management (IPAM) - IP networks and addresses, VRFs, and VLANs</li><li>Equipment racks - Organized by group and site</li><li>Devices - Types of devices and where they are installed</li><li>Connections - Network, console, and power connections among devices</li><li>Virtualization - Virtual machines and clusters</li><li>Data circuits - Long-haul communications circuits and providers</li></ul><br><br>" - }, - { - "language": "de", - "briefDescription": "Infrastructure resource modeling application", - "fullDescription": "NetBox is an infrastructure resource modeling (IRM) application designed to empower network automation. <br><br>Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. <br><br>It encompasses the following aspects of network management:<ul><li>IP address management (IPAM) - IP networks and addresses, VRFs, and VLANs</li><li>Equipment racks - Organized by group and site</li><li>Devices - Types of devices and where they are installed</li><li>Connections - Network, console, and power connections among devices</li><li>Virtualization - Virtual machines and clusters</li><li>Data circuits - Long-haul communications circuits and providers</li></ul><br><br>" - }, - { - "language": "fr", - "briefDescription": "Infrastructure resource modeling application", - "fullDescription": "NetBox is an infrastructure resource modeling (IRM) application designed to empower network automation. <br><br>Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. <br><br>It encompasses the following aspects of network management:<ul><li>IP address management (IPAM) - IP networks and addresses, VRFs, and VLANs</li><li>Equipment racks - Organized by group and site</li><li>Devices - Types of devices and where they are installed</li><li>Connections - Network, console, and power connections among devices</li><li>Virtualization - Virtual machines and clusters</li><li>Data circuits - Long-haul communications circuits and providers</li></ul><br><br>" - }, - { - "language": "pl", - "briefDescription": "Infrastructure resource modeling application", - "fullDescription": "NetBox is an infrastructure resource modeling (IRM) application designed to empower network automation. <br><br>Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers. <br><br>It encompasses the following aspects of network management:<ul><li>IP address management (IPAM) - IP networks and addresses, VRFs, and VLANs</li><li>Equipment racks - Organized by group and site</li><li>Devices - Types of devices and where they are installed</li><li>Connections - Network, console, and power connections among devices</li><li>Virtualization - Virtual machines and clusters</li><li>Data circuits - Long-haul communications circuits and providers</li></ul><br><br>" - } - ], - "tags": [ - "irm", - "infrastructure", - "modelling", - "management" - ] - }, - "application": { - "id": null, - "name": "NetBox", - "version": "3.5.2", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "Initial super-user account to create", - "type": "textfield", - "input": true, - "key": "superuser#name", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain" - }, - { - "label": "Email address for the initial super-user account", - "type": "email", - "input": true, - "key": "superuser#email", - "tab": 0, - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "Password for the initial super-user account", - "type": "password", - "input": true, - "key": "superuser#password", - "tab": 0, - "inputFormat": "plain", - "validate": { - "required": true - } - }, - { - "label": "API token created for the initial super-user account", - "type": "textfield", - "input": true, - "key": "superuser#apiToken", - "tab": 0, - "validate": { - "required": true - }, - "inputFormat": "plain", - "placeholder": "Suggested format: 0123456789abcdef0123456789abcdef01234567" - }, - { - "label": "Permit only logged-in users to access NetBox", - "type": "checkbox", - "defaultValue": true, - "input": true, - "key": "loginRequired", - "inputFormat": "plain", - "description": "If not checked, unauthenticated read-only access is enabled" - }, - { - "label": "Allocated storage space", - "type": "textfield", - "input": true, - "key": "persistence#size", - "tab": 0, - "validate": { - "required": true - }, - "defaultValue": "1Gi", - "placeholder": "Default value: 1Gi", - "inputFormat": "plain" - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-netbox", - "version": "6.0.0" - }, - "mainDeploymentName": "nmaas-netbox" - }, - "deployParameters": { - "RELEASE_NAME_HOUSEKEEPING": "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[1].values[0]=%VALUE%", - "RELEASE_NAME_WORKER": "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[1].values[0]=%VALUE%", - "SMTP_HOSTNAME": "email.server", - "SMTP_PASSWORD": "email.password", - "SMTP_PORT": "email.port", - "SMTP_USERNAME": "email.username" - }, - "globalDeployParameters": { - "updateStrategy.type": "Recreate", - "loginPersistence": "true", - "timeZone": "Europe/Warsaw", - "postgresql.enabled": "true", - "postgresql.postgresqlDatabase": "netbox", - "postgresql.postgresqlUsername": "netbox", - "postgresql.postgresqlPassword": "%RANDOM_STRING_12%", - "postgresql.postgresqlPostgresPassword": "%RANDOM_STRING_12%", - "redis.enabled": "true", - "redis.architecture": "standalone", - "redis.auth.password": "%RANDOM_STRING_12%", - "persistence.enabled": "true", - "persistence.accessMode": "ReadWriteOnce", - "email.from": "netbox@nmaas.eu", - "ingress.hosts[0].paths": "{/}", - "worker.enabled": "true", - "worker.updateStrategy.type": "Recreate", - "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].key": "app.kubernetes.io/component", - "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].operator": "In", - "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].values[0]": "netbox", - "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[1].key": "app.kubernetes.io/instance", - "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[1].operator": "In", - "worker.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].topologyKey": "\"kubernetes.io/hostname\"", - "housekeeping.enabled": "true", - "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].key": "app.kubernetes.io/component", - "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].operator": "In", - "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].values[0]": "netbox", - "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[1].key": "app.kubernetes.io/instance", - "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[1].operator": "In", - "housekeeping.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].topologyKey": "\"kubernetes.io/hostname\"" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "NetBox", - "tag": "netbox", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_CLASS": "ingress.className", - "INGRESS_HOSTS": "ingress.hosts[0].host=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%", - "INGRESS_LETSENCRYPT": "ingress.tls[0].secretName", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls[0].secretName" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app28-zabbix.json b/src/test/shell/data/apps/app28-zabbix.json deleted file mode 100644 index 22919a1c9978a073211593d5d1b4e7683b86cbef..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app28-zabbix.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Zabbix", - "license": "GPL Version 2", - "licenseUrl": "https://www.zabbix.com/license", - "wwwUrl": "https://www.zabbix.com/index", - "sourceUrl": "https://git.zabbix.com/repos?visibility=public", - "issuesUrl": "https://support.zabbix.com/projects/ZBX/issues/ZBX-19223?filter=allopenissues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Zabbix", - "descriptions": [ - { - "language": "en", - "briefDescription": "Enterprise-class monitoring solution for networks and applications", - "fullDescription": "Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics. <br><br>The Zabbix application included in the NMaaS catalog uses TimescaleDB for better performance. <br><br>After deployment, use the default Admin/zabbix credentials to login." - }, - { - "language": "de", - "briefDescription": "Enterprise-class monitoring solution for networks and applications", - "fullDescription": "Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics. <br><br>The Zabbix application included in the NMaaS catalog uses TimescaleDB for better performance. <br><br>After deployment, use the default Admin/zabbix credentials to login." - }, - { - "language": "fr", - "briefDescription": "Enterprise-class monitoring solution for networks and applications", - "fullDescription": "Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics. <br><br>The Zabbix application included in the NMaaS catalog uses TimescaleDB for better performance. <br><br>After deployment, use the default Admin/zabbix credentials to login." - }, - { - "language": "pl", - "briefDescription": "Enterprise-class monitoring solution for networks and applications", - "fullDescription": "Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics. <br><br>The Zabbix application included in the NMaaS catalog uses TimescaleDB for better performance. <br><br>After deployment, use the default Admin/zabbix credentials to login." - } - ], - "tags": [ - "monitoring", - "notifications", - "snmp", - "agent", - "proxy" - ] - }, - "application": { - "id": null, - "name": "Zabbix", - "version": "5.0.20", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>All required configuration should be applied after activation process is completed using dedicated Git repository.</p><p>Click Apply configuration button to proceed</p>", - "tab": 0 - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-zabbix", - "version": "1.0.0" - }, - "mainDeploymentName": "server" - }, - "deployParameters": { - "DOMAIN_CODENAME": "zabbixServer.service.annotations.\"metallb\\.universe\\.tf/address-pool\"=%VALUE%" - }, - "globalDeployParameters": { - "nmaas-timescaledb.properties.password": "%RANDOM_STRING_12%", - "properties.database.password": "%RANDOM_STRING_12%" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Zabbix", - "tag": "zabbix", - "deployParameters": { - "INGRESS_ENABLED": "zabbixWeb.ingress.enabled", - "INGRESS_CLASS": "zabbixWeb.ingress.class", - "INGRESS_HOSTS": "zabbixWeb.ingress.hosts" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": true, - "configUpdateEnabled": true, - "termsAcceptanceRequired": false, - "templates": [ - { - "configFileName": "zabbix-server.conf", - "configFileDirectory": "config", - "configFileTemplateContent": "CacheSize = 64M" - } - ] - } - } -} diff --git a/src/test/shell/data/apps/app29-spa.json b/src/test/shell/data/apps/app29-spa.json deleted file mode 100644 index cfe139ec6748cf69b4246fbeeeed260024a1ac67..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app29-spa.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "SPA", - "license": "", - "licenseUrl": "", - "wwwUrl": "https://wiki.geant.org/display/NETDEV/SPA", - "sourceUrl": "", - "issuesUrl": "", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-SPA", - "descriptions": [ - { - "language": "en", - "briefDescription": "SPA for the E-Line service", - "fullDescription": "The Service Provider Architecture (SPA) is a service management digital platform providing the general processes and components necessary to manage the CSP services via a user-friendly web graphical user interface (Self-Service Portal).<br><br>The platform in NMaaS has been prepared to manage E-Line service (L2 end-to-end connectivity) implemented by the OpenNSA application with a test default configuration and virtual simplified network topology. Users can familiarise with the SPA without the need of setting up the platform from the scratch.<br><br>Just log in to the portal and start creating new circuits in a simple network to see how it works." - }, - { - "language": "de", - "briefDescription": "SPA for the E-Line service", - "fullDescription": "The Service Provider Architecture (SPA) is a service management digital platform providing the general processes and components necessary to manage the CSP services via a user-friendly web graphical user interface (Self-Service Portal).<br><br>The platform in NMaaS has been prepared to manage E-Line service (L2 end-to-end connectivity) implemented by the OpenNSA application with a test default configuration and virtual simplified network topology. Users can familiarise with the SPA without the need of setting up the platform from the scratch.<br><br>Just log in to the portal and start creating new circuits in a simple network to see how it works." - }, - { - "language": "fr", - "briefDescription": "SPA for the E-Line service", - "fullDescription": "The Service Provider Architecture (SPA) is a service management digital platform providing the general processes and components necessary to manage the CSP services via a user-friendly web graphical user interface (Self-Service Portal).<br><br>The platform in NMaaS has been prepared to manage E-Line service (L2 end-to-end connectivity) implemented by the OpenNSA application with a test default configuration and virtual simplified network topology. Users can familiarise with the SPA without the need of setting up the platform from the scratch.<br><br>Just log in to the portal and start creating new circuits in a simple network to see how it works." - }, - { - "language": "pl", - "briefDescription": "SPA for the E-Line service", - "fullDescription": "The Service Provider Architecture (SPA) is a service management digital platform providing the general processes and components necessary to manage the CSP services via a user-friendly web graphical user interface (Self-Service Portal).<br><br>The platform in NMaaS has been prepared to manage E-Line service (L2 end-to-end connectivity) implemented by the OpenNSA application with a test default configuration and virtual simplified network topology. Users can familiarise with the SPA without the need of setting up the platform from the scratch.<br><br>Just log in to the portal and start creating new circuits in a simple network to see how it works." - } - ], - "tags": [ - "management", - "inventory", - "crm" - ] - }, - "application": { - "id": null, - "name": "SPA", - "version": "1.3.3", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Info", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>SPA installation is preconfigured to ease tests without complex set up.<p><p>For additional details and default user access credentials refer to <a href=\"https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-SPA\">NMaaS wiki</a>.</p><p>Click <i>Apply configuration</i> button to proceed</p>", - "tab": 0 - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-spa", - "version": "1.0.4" - }, - "mainDeploymentName": "ssp" - }, - "deployParameters": {}, - "globalDeployParameters": {}, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Portal", - "tag": "portal", - "deployParameters": { - "INGRESS_ENABLED": "ssp.ingress.enabled", - "INGRESS_CLASS": "ssp.ingress.class", - "INGRESS_HOSTS": "ssp.ingress.hosts" - } - }, - { - "type": "EXTERNAL", - "name": "Inventory", - "tag": "inventory", - "deployParameters": { - "INGRESS_ENABLED": "inventory.ingress.enabled", - "INGRESS_CLASS": "inventory.ingress.class", - "INGRESS_HOSTS": "inventory.ingress.hosts" - } - }, - { - "type": "EXTERNAL", - "name": "OTRS", - "tag": "otrs", - "deployParameters": { - "INGRESS_ENABLED": "otrs.ingress.enabled", - "INGRESS_CLASS": "otrs.ingress.class", - "INGRESS_HOSTS": "otrs.ingress.hosts" - } - }, - { - "type": "EXTERNAL", - "name": "SuiteCRM", - "tag": "suitecrm", - "deployParameters": { - "INGRESS_ENABLED": "suitecrm.ingress.enabled", - "INGRESS_CLASS": "suitecrm.ingress.class", - "INGRESS_HOSTS": "suitecrm.ingress.hosts" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app31-ctfd.json b/src/test/shell/data/apps/app31-ctfd.json deleted file mode 100644 index 773ed98a788b8f9cb2394254a1c665818381629e..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app31-ctfd.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "CTFd", - "license": "Apache License 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://ctfd.io/", - "sourceUrl": "https://github.com/CTFd/CTFd", - "issuesUrl": "https://github.com/CTFd/CTFd/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-CTFD", - "descriptions": [ - { - "language": "en", - "briefDescription": "CTFs as you need them", - "fullDescription": "CTFd is a Capture The Flag framework focusing on ease of use and customizability. It comes with everything you need to run a CTF and it's easy to customize with plugins and themes." - }, - { - "language": "de", - "briefDescription": "CTFs as you need them", - "fullDescription": "CTFd is a Capture The Flag framework focusing on ease of use and customizability. It comes with everything you need to run a CTF and it's easy to customize with plugins and themes." - }, - { - "language": "fr", - "briefDescription": "CTFs as you need them", - "fullDescription": "CTFd is a Capture The Flag framework focusing on ease of use and customizability. It comes with everything you need to run a CTF and it's easy to customize with plugins and themes." - }, - { - "language": "pl", - "briefDescription": "CTFs as you need them", - "fullDescription": "CTFd is a Capture The Flag framework focusing on ease of use and customizability. It comes with everything you need to run a CTF and it's easy to customize with plugins and themes." - } - ], - "tags": [ - "CTF", - "virtual lab", - "competition", - "capture the flag" - ] - }, - "application": { - "id": null, - "name": "CTFd", - "version": "3.5.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>No configuration parameters are required.</p><p>Click <i>Apply configuration</i> button to proceed</p>", - "tab": 0 - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-ctfd", - "version": "1.0.1" - }, - "mainDeploymentName": "nmaas-ctfd" - }, - "deployParameters": {}, - "globalDeployParameters": { - "mariadb.auth.rootPassword": "%RANDOM_STRING_12%", - "mariadb.auth.password": "%RANDOM_STRING_12%", - "ingress.hosts[0].paths[0].path": "/", - "ingress.hosts[0].paths[0].pathType": "ImplementationSpecific" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "CTFd", - "tag": "ctfd", - "deployParameters": { - "INGRESS_CLASS": "ingress.className,ingress.annotations.\"kubernetes\\.io/ingress\\.class\"=%VALUE%", - "INGRESS_HOSTS": "ingress.hosts[0].host=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app32-juiceshop.json b/src/test/shell/data/apps/app32-juiceshop.json deleted file mode 100644 index e8ed402cff5c24bf620e3b0b4ca21c5ba2d179f9..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app32-juiceshop.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "OWASP JuiceShop", - "license": "MIT License", - "licenseUrl": "https://opensource.org/license/mit/", - "wwwUrl": "https://owasp-juice.shop/", - "sourceUrl": "https://github.com/juice-shop/juice-shop", - "issuesUrl": "https://github.com/juice-shop/juice-shop/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-JuiceShop", - "descriptions": [ - { - "language": "en", - "briefDescription": "Vulnerable Web Application for Training", - "fullDescription": "OWASP Juice Shop is probably the most modern and sophisticated insecure web application! It can be used in security trainings, awareness demos, CTFs and as a guinea pig for security tools! Juice Shop encompasses vulnerabilities from the entire [OWASP Top Ten](https://owasp.org/www-project-top-ten) along with many other security flaws found in real-world applications!" - }, - { - "language": "de", - "briefDescription": "Vulnerable Web Application for Training", - "fullDescription": "OWASP Juice Shop is probably the most modern and sophisticated insecure web application! It can be used in security trainings, awareness demos, CTFs and as a guinea pig for security tools! Juice Shop encompasses vulnerabilities from the entire [OWASP Top Ten](https://owasp.org/www-project-top-ten) along with many other security flaws found in real-world applications!" - }, - { - "language": "fr", - "briefDescription": "Vulnerable Web Application for Training", - "fullDescription": "OWASP Juice Shop is probably the most modern and sophisticated insecure web application! It can be used in security trainings, awareness demos, CTFs and as a guinea pig for security tools! Juice Shop encompasses vulnerabilities from the entire [OWASP Top Ten](https://owasp.org/www-project-top-ten) along with many other security flaws found in real-world applications!" - }, - { - "language": "pl", - "briefDescription": "Vulnerable Web Application for Training", - "fullDescription": "OWASP Juice Shop is probably the most modern and sophisticated insecure web application! It can be used in security trainings, awareness demos, CTFs and as a guinea pig for security tools! Juice Shop encompasses vulnerabilities from the entire [OWASP Top Ten](https://owasp.org/www-project-top-ten) along with many other security flaws found in real-world applications!" - } - ], - "tags": [ - "owasp top 10", - "security vulnerability", - "training", - "capture the flag" - ] - }, - "application": { - "id": null, - "name": "OWASP JuiceShop", - "version": "14.5.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>No configuration parameters are required.</p><p>Click <i>Apply configuration</i> button to proceed</p>", - "tab": 0 - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-juiceshop", - "version": "1.0.0" - }, - "mainDeploymentName": "nmaas-juiceshop" - }, - "deployParameters": {}, - "globalDeployParameters": { - "ingress.sablier.enabled": "true", - "ingress.hosts[0].paths[0].path": "/", - "ingress.hosts[0].paths[0].pathType": "ImplementationSpecific" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "JuiceShop", - "tag": "juiceshop", - "deployParameters": { - "INGRESS_CLASS": "ingress.className", - "INGRESS_HOSTS": "ingress.hosts[0].host=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app33-adminer.json b/src/test/shell/data/apps/app33-adminer.json deleted file mode 100644 index 730206934d22fcb9ba6c02c9525368728a70f208..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app33-adminer.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "Adminer", - "license": "Apache License 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://www.adminer.org/", - "sourceUrl": "https://github.com/vrana/adminer", - "issuesUrl": "https://sourceforge.net/p/adminer/bugs-and-features/", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-Adminer", - "descriptions": [ - { - "language": "en", - "briefDescription": "Web Database Management", - "fullDescription": "Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB and others via plugin." - }, - { - "language": "de", - "briefDescription": "Web Database Management", - "fullDescription": "Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB and others via plugin." - }, - { - "language": "fr", - "briefDescription": "Web Database Management", - "fullDescription": "Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB and others via plugin." - }, - { - "language": "pl", - "briefDescription": "Web Database Management", - "fullDescription": "Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB and others via plugin." - } - ], - "tags": [ - "database", - "mysql", - "postgresql", - "export", - "import" - ] - }, - "application": { - "id": null, - "name": "Adminer", - "version": "4.8.1", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>No configuration parameters are required.</p><p>Click <i>Apply configuration</i> button to proceed</p>", - "tab": 0 - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-adminer", - "version": "3.0.0" - }, - "mainDeploymentName": "nmaas-adminer" - }, - "deployParameters": { }, - "globalDeployParameters": { - "ingress.hosts[0].paths[0].path": "/", - "ingress.hosts[0].paths[0].pathType": "ImplementationSpecific" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "Adminer", - "tag": "adminer", - "deployParameters": { - "INGRESS_ENABLED": "ingress.enabled", - "INGRESS_CLASS": "ingress.className", - "INGRESS_HOSTS": "ingress.hosts[0].host=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%", - "INGRESS_WILDCARD_OR_ISSUER": "ingress.tls[0].secretName=%VALUE%" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app34-maildev.json b/src/test/shell/data/apps/app34-maildev.json deleted file mode 100644 index d7edb0a14eddff8f8bcd698c29de11f1e9519b57..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app34-maildev.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "MailDev", - "license": "Dan Farrelly", - "licenseUrl": "https://raw.githubusercontent.com/maildev/maildev/master/LICENSE", - "wwwUrl": "https://maildev.github.io/maildev/", - "sourceUrl": "https://github.com/maildev/maildev", - "issuesUrl": "https://github.com/maildev/maildev/issues", - "nmaasDocumentationUrl": "https://docs.nmaas.eu/nmaas-applications/tutorials/maildev", - "descriptions": [ - { - "language": "en", - "briefDescription": "SMTP Server + Web Interface for viewing and testing emails during development.", - "fullDescription": "MailDev is a simple way to test your project's generated email during development, with an easy to use web interface that runs on NMaaS, built on top of Node.js." - }, - { - "language": "de", - "briefDescription": "SMTP Server + Web Interface for viewing and testing emails during development.", - "fullDescription": "MailDev is a simple way to test your project's generated email during development, with an easy to use web interface that runs on NMaaS, built on top of Node.js." - }, - { - "language": "fr", - "briefDescription": "SMTP Server + Web Interface for viewing and testing emails during development.", - "fullDescription": "MailDev is a simple way to test your project's generated email during development, with an easy to use web interface that runs on NMaaS, built on top of Node.js." - }, - { - "language": "pl", - "briefDescription": "SMTP Server + Web Interface for viewing and testing emails during development.", - "fullDescription": "MailDev is a simple way to test your project's generated email during development, with an easy to use web interface that runs on NMaaS, built on top of Node.js." - } - ], - "tags": [ - "email server", - "virtual lab", - "development", - "sandbox" - ] - }, - "application": { - "id": null, - "name": "MailDev", - "version": "2.0.5", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "label": "Additional Parameters", - "hideLabel": true, - "type": "container", - "input": true, - "tab": 0, - "key": "additionalParameters", - "components": [ - { - "label": "Enable Web Authentication", - "type": "checkbox", - "defaultValue": false, - "input": true, - "tab": 0, - "key": "auth#enabled", - "inputFormat": "plain" - }, - { - "label": "Web user", - "type": "textfield", - "input": true, - "tab": 0, - "key": "properties#webUser", - "inputFormat": "plain", - "conditional": { - "show": true, - "when": "auth#enabled", - "eq": true - } - }, - { - "label": "Password for the web user", - "type": "password", - "input": true, - "tab": 0, - "key": "properties#webPassword", - "inputFormat": "plain", - "conditional": { - "show": true, - "when": "auth#enabled", - "eq": true - } - } - ] - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-maildev", - "version": "1.0.0" - }, - "mainDeploymentName": "nmaas-maildev" - }, - "deployParameters": { }, - "globalDeployParameters": { - "ingress.hosts[0].paths[0].path": "/", - "ingress.hosts[0].paths[0].pathType": "ImplementationSpecific", - "service.type": "LoadBalancer" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "MailDev", - "tag": "maildev", - "deployParameters": { - "INGRESS_CLASS": "ingress.className", - "INGRESS_HOSTS": "ingress.hosts[0].host=%VALUE%", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%" - } - }, - { - "type": "LOCAL", - "name": "service", - "tag": "maildev", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-maildev", - "K8S_SERVICE_PORT": "1025" - } - }, - { - "type": "INTERNAL", - "name": "ip", - "tag": "maildev", - "deployParameters": { - "K8S_SERVICE_SUFFIX": "nmaas-maildev", - "K8S_SERVICE_PORT": "1025" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/app35-changedetectionio.json b/src/test/shell/data/apps/app35-changedetectionio.json deleted file mode 100644 index 535a8814bc87d48b6b3de616280773b332c97eaf..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/app35-changedetectionio.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "applicationBase": { - "id": null, - "name": "changedetectionio", - "license": "Apache License 2.0", - "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0", - "wwwUrl": "https://github.com/dgtlmoon/changedetection.io", - "sourceUrl": "https://github.com/dgtlmoon/changedetection.io", - "issuesUrl": "https://github.com/dgtlmoon/changedetection.io/issues", - "nmaasDocumentationUrl": "https://wiki.geant.org/display/NMAAS/NMaaS+Tools#NMaaSTools-changedetection.io", - "descriptions": [ - { - "language": "en", - "briefDescription": "Web Site Change Detection, Restock monitoring and notifications", - "fullDescription": "Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more." - }, - { - "language": "de", - "briefDescription": "Web Site Change Detection, Restock monitoring and notifications", - "fullDescription": "Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more." - }, - { - "language": "fr", - "briefDescription": "Web Site Change Detection, Restock monitoring and notifications", - "fullDescription": "Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more." - }, - { - "language": "pl", - "briefDescription": "Web Site Change Detection, Restock monitoring and notifications", - "fullDescription": "Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more." - } - ], - "tags": [ - "website monitoring", - "notifications", - "change detection", - "alerting" - ] - }, - "application": { - "id": null, - "name": "changedetectionio", - "version": "0.43.2", - "configWizardTemplate": { - "template": { - "components": [ - { - "label": "Tabs", - "components": [ - { - "label": "Base", - "key": "configTab", - "components": [ - { - "type": "htmlelement", - "input": false, - "content": "<p>No configuration parameters are required.</p><p>Click <i>Apply configuration</i> button to proceed</p>", - "tab": 0 - } - ] - } - ], - "type": "tabs", - "input": false, - "key": "tabs" - }, - { - "type": "button", - "label": "Apply configuration", - "disableOnInvalid": true, - "theme": "primary", - "input": false, - "tableView": true - } - ] - } - }, - "configUpdateWizardTemplate": null, - "appDeploymentSpec": { - "supportedDeploymentEnvironments": [ - "KUBERNETES" - ], - "kubernetesTemplate": { - "chart": { - "name": "nmaas-changedetection", - "version": "1.0.1" - }, - "mainDeploymentName": "nmaas-changedetection" - }, - "deployParameters": { }, - "globalDeployParameters": { - "ingress.hosts[0].paths[0].path": "/", - "ingress.hosts[0].paths[0].pathType": "ImplementationSpecific" - }, - "storageVolumes": [], - "exposesWebUI": true, - "allowSshAccess": false, - "accessMethods": [ - { - "type": "DEFAULT", - "name": "changedetection.io", - "tag": "changedetection", - "deployParameters": { - "INGRESS_CLASS": "ingress.className", - "INGRESS_HOSTS": "ingress.hosts[0].host=%VALUE%,properties.baseUrl=https://%VALUE%/", - "INGRESS_TLS_HOSTS": "ingress.tls[0].hosts[0]=%VALUE%" - } - } - ] - }, - "appConfigurationSpec": { - "configFileRepositoryRequired": false, - "configUpdateEnabled": false, - "termsAcceptanceRequired": false, - "templates": [] - } - } -} diff --git a/src/test/shell/data/apps/comments/app1-comment1-sub1.json b/src/test/shell/data/apps/comments/app1-comment1-sub1.json index 1d594d0bd2c36ba1ede5d801e89e3dc3adef3dcc..2a774668987ec753a0f3f329e4253893acc540ec 100644 --- a/src/test/shell/data/apps/comments/app1-comment1-sub1.json +++ b/src/test/shell/data/apps/comments/app1-comment1-sub1.json @@ -1,4 +1,4 @@ { - "parentId":1, - "comment":"This is first sub comment. Enjoy!" + "parentId": 1, + "comment": "This is first sub comment. Enjoy!" } \ No newline at end of file diff --git a/src/test/shell/data/apps/comments/app1-comment1.json b/src/test/shell/data/apps/comments/app1-comment1.json index 9ef77f4beaa2568c45df470e38973d0b78a4570a..f24c8bc50a438e4955b7280cfd7882c966d61ca1 100644 --- a/src/test/shell/data/apps/comments/app1-comment1.json +++ b/src/test/shell/data/apps/comments/app1-comment1.json @@ -1,3 +1,3 @@ { - "comment":"This is first root comment. Enjoy!" + "comment": "This is first root comment. Enjoy!" } \ No newline at end of file diff --git a/src/test/shell/data/apps/comments/app1-comment2.json b/src/test/shell/data/apps/comments/app1-comment2.json index b565c4b2b5167a1baafa1ee17d3946359e75e999..fe6ec227436c3bc2900e34ecaa2a8278c9b8bc30 100644 --- a/src/test/shell/data/apps/comments/app1-comment2.json +++ b/src/test/shell/data/apps/comments/app1-comment2.json @@ -1,3 +1,3 @@ { - "comment":"This is second comment. Have fun!" + "comment": "This is second comment. Have fun!" } \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/adminer.png b/src/test/shell/data/apps/images/logo/adminer.png deleted file mode 100644 index 33f97db2b97842be9edc7d091a5697738571dc4b..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/adminer.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/bastion.png b/src/test/shell/data/apps/images/logo/bastion.png deleted file mode 100644 index eb87cb0f2d264e248f9bdb3d4a6c80ef23bef416..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/bastion.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/bastion.svg b/src/test/shell/data/apps/images/logo/bastion.svg deleted file mode 100644 index eb08c11bfcb2e935feb8f7ecebb3f29da54b496d..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/bastion.svg +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" id="circle_of_friends__x5F__white_x26_orange" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="400" - height="400" viewBox="95 100 225 225" enable-background="new 0 0 425.197 425.197" xml:space="preserve"> -<g> - <path fill="#FFFFFF" d="M354.331,212.595c0,78.279-63.45,141.735-141.729,141.735c-78.279,0-141.735-63.456-141.735-141.735 - c0-78.274,63.457-141.728,141.735-141.728C290.881,70.867,354.331,134.32,354.331,212.595z"/> - <path fill="#E95420" d="M139.043,212.595c0,10.064-8.159,18.225-18.23,18.225c-10.059,0-18.218-8.16-18.218-18.225 - c0-10.06,8.159-18.219,18.218-18.219C130.884,194.376,139.043,202.535,139.043,212.595z M242.717,301.201 - c5.033,8.709,16.173,11.696,24.889,6.67c8.715-5.033,11.701-16.179,6.669-24.895c-5.032-8.715-16.173-11.695-24.888-6.663 - C240.671,281.346,237.685,292.486,242.717,301.201z M274.274,142.219c5.032-8.717,2.052-19.86-6.669-24.887 - c-8.71-5.032-19.855-2.046-24.889,6.667c-5.032,8.715-2.046,19.857,6.67,24.889C258.102,153.92,269.248,150.934,274.274,142.219z - M212.602,160.632c27.153,0,49.434,20.814,51.761,47.364l26.372-0.416c-1.252-19.727-9.809-37.469-22.995-50.551 - c-6.98,2.693-15.079,2.327-22.066-1.71c-6.992-4.037-11.359-10.871-12.514-18.275c-6.554-1.78-13.448-2.733-20.558-2.733 - c-12.471,0-24.259,2.916-34.727,8.103l12.832,23.043C197.357,162.367,204.784,160.632,212.602,160.632z M160.633,212.595 - c0-17.577,8.734-33.121,22.097-42.52l-13.54-22.634c-15.684,10.474-27.367,26.451-32.296,45.183 - c5.833,4.697,9.57,11.897,9.57,19.972c0,8.08-3.738,15.28-9.57,19.978c4.929,18.731,16.612,34.708,32.296,45.188l13.54-22.634 - C169.367,245.722,160.633,230.184,160.633,212.595z M212.602,264.568c-7.817,0-15.244-1.734-21.895-4.83l-12.832,23.043 - c10.468,5.191,22.255,8.104,34.727,8.104c7.109,0,14.004-0.946,20.558-2.729c1.154-7.409,5.521-14.243,12.514-18.273 - c6.987-4.037,15.086-4.404,22.066-1.711c13.187-13.088,21.743-30.83,22.995-50.557l-26.372-0.409 - C262.035,243.749,239.755,264.568,212.602,264.568z"/> -</g> -</svg> diff --git a/src/test/shell/data/apps/images/logo/changedetectionio.svg b/src/test/shell/data/apps/images/logo/changedetectionio.svg deleted file mode 100644 index f8f6c4a1f2d5500edb5576493166cd4f7d4a8e1c..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/changedetectionio.svg +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - width="517.45074mm" - height="61.649239mm" - version="1.1" - viewBox="0 0 517.45073 61.649238" - xml:space="preserve" - id="svg12487" - sodipodi:docname="logo-2.svg" - inkscape:version="1.2.2 (1:1.2.2+202212051550+b0a8486541)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"><defs - id="defs12491" /><sodipodi:namedview - id="namedview12489" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:showpageshadow="2" - inkscape:pageopacity="0.0" - inkscape:pagecheckerboard="0" - inkscape:deskcolor="#d1d1d1" - inkscape:document-units="mm" - showgrid="false" - inkscape:zoom="0.33832073" - inkscape:cx="580.80982" - inkscape:cy="316.26794" - inkscape:window-width="1920" - inkscape:window-height="1051" - inkscape:window-x="1920" - inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="g12569" /><g - id="g12598" - transform="translate(66.269168,-15.463195)" - style="fill:#3056d3;fill-opacity:1"><g - transform="matrix(2.3422586,0,0,2.3422586,-28.876024,-51.093426)" - id="g12485" - style="fill:#3056d3;fill-opacity:1"><g - fill="#fefefe" - stroke-width="0.26458" - aria-label="CHANGEDETECTION.IO" - id="g12483" - style="fill:#3056d3;fill-opacity:1"><path - d="m 28.95,36.346 v 1.7611 q -0.84336,-0.78548 -1.8025,-1.1741 -0.95084,-0.38861 -2.0257,-0.38861 -2.1167,0 -3.2411,1.2981 -1.1245,1.2898 -1.1245,3.7372 0,2.4391 1.1245,3.7372 1.1245,1.2898 3.2411,1.2898 1.0749,0 2.0257,-0.38861 0.95911,-0.38861 1.8025,-1.1741 v 1.7446 q -0.87643,0.59531 -1.8603,0.89297 -0.97565,0.29766 -2.0671,0.29766 -2.8029,0 -4.4152,-1.7115 -1.6123,-1.7198 -1.6123,-4.6881 0,-2.9766 1.6123,-4.6881 1.6123,-1.7198 4.4152,-1.7198 1.1079,0 2.0836,0.29766 0.98392,0.28939 1.8438,0.87643 z" - id="path12447" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 30.585,35.395 h 1.6702 v 5.0601 h 6.0689 V 35.395 h 1.6702 V 47.739 H 38.3241 V 41.8603 H 32.2552 V 47.739 H 30.585 Z" - id="path12449" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 46.499,37.041 -2.2655,6.1433 h 4.5392 z m -0.94258,-1.6454 h 1.8934 l 4.7046,12.344 h -1.7363 l -1.1245,-3.1667 h -5.5645 l -1.1245,3.1667 h -1.7611 z" - id="path12451" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 53.013,35.395 h 2.249 l 5.4736,10.327 V 35.395 h 1.6206 v 12.344 h -2.249 L 54.6336,37.412 V 47.739 H 53.013 Z" - id="path12453" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 73.152,45.979 v -3.3156 h -2.7285 v -1.3725 h 4.3822 v 5.2999 q -0.96738,0.68626 -2.1332,1.0418 -1.1658,0.34726 -2.4887,0.34726 -2.8939,0 -4.531,-1.6867 -1.6288,-1.695 -1.6288,-4.7129 0,-3.0262 1.6288,-4.7129 1.6371,-1.695 4.531,-1.695 1.2072,0 2.2903,0.29766 1.0914,0.29766 2.0092,0.87643 v 1.7777 q -0.92604,-0.78548 -1.9678,-1.1824 -1.0418,-0.39687 -2.1911,-0.39687 -2.2655,0 -3.4065,1.265 -1.1327,1.265 -1.1327,3.7703 0,2.497 1.1327,3.762 1.141,1.265 3.4065,1.265 0.8847,0 1.5792,-0.14883 0.69453,-0.1571 1.2485,-0.47956 z" - id="path12455" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 76.912,35.395 h 7.8052 v 1.4056 h -6.135 v 3.6546 h 5.8787 v 1.4056 h -5.8787 v 4.4731 h 6.2838 v 1.4056 h -7.954 z" - id="path12457" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 89.742,37.801 v 7.5323 h 1.141 q 1.9513,0 2.9766,-0.96738 1.0335,-0.96738 1.0335,-2.8112 0,-1.8355 -1.0253,-2.7947 -1.0253,-0.95911 -2.9848,-0.95911 z m -3.1833,-2.406 h 3.3569 q 2.8112,0 4.1837,0.40514 1.3808,0.39688 2.3647,1.356 0.86816,0.83509 1.2898,1.9265 0.42168,1.0914 0.42168,2.4722 0,1.3973 -0.42168,2.497 -0.42168,1.0914 -1.2898,1.9265 -0.99218,0.95911 -2.3812,1.3643 -1.3891,0.39687 -4.1672,0.39687 h -3.3569 z" - id="path12459" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 99.671,35.395 h 8.5907 v 2.406 h -5.4074 v 2.2986 h 5.085 v 2.406 h -5.085 v 2.8277 h 5.5893 v 2.406 H 99.671 Z" - id="path12461" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 108.82,35.395 h 11.377 v 2.406 h -4.0928 v 9.9384 h -3.1833 V 37.801 h -4.101 z" - id="path12463" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 120.9,35.395 h 8.5907 v 2.406 h -5.4074 v 2.2986 h 5.085 v 2.406 h -5.085 v 2.8277 h 5.5893 v 2.406 H 120.9 Z" - id="path12465" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 141.31,47.062 q -0.87643,0.45475 -1.8273,0.68626 -0.95084,0.23151 -1.9844,0.23151 -3.084,0 -4.8865,-1.7198 -1.8025,-1.7281 -1.8025,-4.6798 0,-2.96 1.8025,-4.6798 1.8025,-1.7281 4.8865,-1.7281 1.0335,0 1.9844,0.23151 0.95085,0.23151 1.8273,0.68626 v 2.5549 q -0.8847,-0.60358 -1.7446,-0.8847 -0.85989,-0.28112 -1.8107,-0.28112 -1.7032,0 -2.6789,1.0914 -0.9757,1.0914 -0.97565,3.0096 0,1.91 0.97565,3.0014 0.97565,1.0914 2.6789,1.0914 0.95085,0 1.8107,-0.28112 0.8599,-0.28112 1.7446,-0.8847 z" - id="path12467" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 141.53,35.395 h 11.377 v 2.406 h -4.0928 v 9.9384 h -3.1833 V 37.801 h -4.101 z" - id="path12469" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 153.61,35.395 h 3.1833 V 47.739 H 153.61 Z" - id="path12471" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 164.61,37.479 q -1.4552,0 -2.2572,1.0749 -0.80201,1.0749 -0.80201,3.0262 0,1.943 0.80201,3.0179 0.80202,1.0749 2.2572,1.0749 1.4635,0 2.2655,-1.0749 0.80201,-1.0749 0.80201,-3.0179 0,-1.9513 -0.80201,-3.0262 -0.80202,-1.0749 -2.2655,-1.0749 z m 0,-2.3068 q 2.9766,0 4.6633,1.7033 1.6867,1.7033 1.6867,4.7046 0,2.9931 -1.6867,4.6963 -1.6867,1.7033 -4.6633,1.7033 -2.9683,0 -4.6633,-1.7033 -1.6867,-1.7033 -1.6867,-4.6963 0,-3.0014 1.6867,-4.7046 1.695,-1.7033 4.6633,-1.7033 z" - id="path12473" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 172.42,35.395 h 3.5553 l 4.4896,8.4666 V 35.395 h 3.0179 v 12.344 h -3.5553 l -4.4896,-8.4666 V 47.739 H 172.42 Z" - id="path12475" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 185.9,45.64 h 1.7446 v 2.1001 H 185.9 Z" - id="path12477" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 190.19,35.395 h 1.6702 V 47.739 H 190.19 Z" - id="path12479" - style="fill:#3056d3;fill-opacity:1" /><path - d="m 199.25,36.528 q -1.819,0 -2.8939,1.356 -1.0666,1.356 -1.0666,3.6959 0,2.3316 1.0666,3.6876 1.0749,1.356 2.8939,1.356 1.819,0 2.8773,-1.356 1.0666,-1.356 1.0666,-3.6876 0,-2.3399 -1.0666,-3.6959 -1.0583,-1.356 -2.8773,-1.356 z m 0,-1.356 q 2.5962,0 4.1506,1.7446 1.5544,1.7363 1.5544,4.6633 0,2.9187 -1.5544,4.6633 -1.5544,1.7363 -4.1506,1.7363 -2.6045,0 -4.1672,-1.7363 -1.5544,-1.7363 -1.5544,-4.6633 0,-2.9269 1.5544,-4.6633 1.5627,-1.7446 4.1672,-1.7446 z" - id="path12481" - style="fill:#3056d3;fill-opacity:1" /></g></g><g - id="g12569" - transform="matrix(1.4230075,0,0,1.4230075,101.16082,69.230268)" - style="fill:#3056d3;fill-opacity:1"><g - id="g17173" - transform="matrix(0.822901,0,0,0.822901,-23.378457,-2.3935111)"><path - id="circle11598" - style="fill:#3056d3;fill-opacity:1;stroke:none;stroke-width:1.96056px;stroke-miterlimit:10" - d="M -88.24778,-43.007117 A 26.323395,26.323395 0 0 0 -114.57124,-16.68366 26.323395,26.323395 0 0 0 -88.24778,9.6397984 26.323395,26.323395 0 0 0 -61.924322,-16.68366 26.323395,26.323395 0 0 0 -88.24778,-43.007117 Z m 0,2.841687 a 23.482013,23.482013 0 0 1 23.482288,23.48177 23.482013,23.482013 0 0 1 -23.482288,23.4822885 23.482013,23.482013 0 0 1 -23.48177,-23.4822885 23.482013,23.482013 0 0 1 23.48177,-23.48177 z" /><g - id="g12229" - transform="matrix(0.26458333,0,0,0.26458333,-115.65284,-44.085232)" - style="fill:#3056d3;fill-opacity:1;stroke:none;stroke-width:1.00132;stroke-dasharray:none"><path - d="m 33.02,64.43 c 0.35,-0.05 2.04,-0.13 2.04,-0.13 h 25.53 c 0,0 3.17,0.32 3.67,0.53 2.5,1.05 3.98,1.89 6.04,3.57 0.72,0.58 4.12,4.01 4.12,4.01 l 51.67,57.39 c 0,0 1.61,1.65 1.97,1.94 1.2,0.97 2.48,1.96 3.98,2.32 0.5,0.12 2.72,0.21 2.72,0.21 h 27.32 l -8.83,-9.04 c 0,0 -1.31,-1.65 -1.44,-1.94 -0.45,-0.93 -0.59,-2.59 -0.13,-3.51 0.35,-0.69 1.46,-1.87 2.23,-1.98 1.03,-0.14 2.12,-0.39 3.02,0.14 0.33,0.2 1.64,1.32 1.64,1.32 l 17.49,17.49 c 0,0 1.35,1.09 1.6,1.6 0.17,0.34 0.29,0.82 0.15,1.18 -0.17,0.42 -1.42,1.63 -1.42,1.63 l -0.94,0.98 -15.69,16.37 c 0,0 -1.44,1.4 -1.79,1.67 -0.76,0.6 -1.99,0.89 -2.96,0.9 -1.03,0 -2.62,-1.11 -3.26,-1.91 -0.6,-0.76 -1.1,-2.22 -0.77,-3.13 0.16,-0.45 1.28,-1.85 1.28,-1.85 l 11.36,-11.3 -29.47,-0.02 -1.68,0.09 c 0,0 -4.16,-0.66 -5.26,-1.03 -1.63,-0.56 -3.44,-1.82 -4.75,-2.93 -0.39,-0.33 -1.8,-1.92 -1.8,-1.92 L 68.96,77.8 c 0,0 -2,-2.06 -2.43,-2.43 -1.37,-1.17 -2,-1.62 -3.76,-2.34 -0.44,-0.18 -3.45,-0.55 -3.45,-0.55 L 35.19,72.26 c 0,0 -2.23,-0.15 -2.61,-0.22 -1.08,-0.21 -2.16,-1.07 -2.81,-1.83 -0.79,-0.92 -0.59,-3.06 0.06,-4.09 0.57,-0.89 2.14,-1.52 3.19,-1.66 z" - style="fill:#3056d3;fill-opacity:1;stroke:none;stroke-width:1.00132;stroke-miterlimit:10;stroke-dasharray:none" - id="path11600" /><g - id="g11606" - style="fill:#3056d3;fill-opacity:1;stroke:none;stroke-width:1.00132;stroke-dasharray:none"><path - d="m 86.1,109.7 -17.13,19.65 c 0,0 -2,2.06 -2.43,2.43 -1.37,1.17 -2,1.62 -3.76,2.34 -0.44,0.18 -3.45,0.55 -3.45,0.55 l -24.13,0.22 c 0,0 -2.23,0.15 -2.61,0.22 -1.08,0.21 -2.16,1.07 -2.81,1.83 -0.79,0.92 -0.59,3.06 0.06,4.09 0.57,0.89 2.14,1.52 3.19,1.66 0.35,0.05 2.04,0.13 2.04,0.13 H 60.6 c 0,0 3.17,-0.32 3.67,-0.53 2.5,-1.05 3.98,-1.89 6.04,-3.57 0.72,-0.58 4.12,-4.01 4.12,-4.01 l 17.38,-19.3 z" - style="fill:#3056d3;fill-opacity:1;stroke:none;stroke-width:1.00132;stroke-miterlimit:10;stroke-dasharray:none" - id="path11602" /><path - d="m 177.81,67.6 c -0.17,-0.42 -1.42,-1.63 -1.42,-1.63 l -0.94,-0.98 -15.69,-16.37 c 0,0 -1.44,-1.4 -1.79,-1.67 -0.76,-0.6 -1.99,-0.89 -2.96,-0.9 -1.03,0 -2.62,1.11 -3.26,1.91 -0.6,0.76 -1.1,2.22 -0.77,3.13 0.16,0.45 1.28,1.85 1.28,1.85 l 11.36,11.3 -29.47,0.02 -1.68,-0.09 c 0,0 -4.16,0.66 -5.26,1.03 -1.63,0.56 -3.44,1.82 -4.75,2.93 -0.39,0.33 -1.8,1.92 -1.8,1.92 l -18.91,21.69 5.98,5.98 18.38,-20.41 c 0,0 1.61,-1.65 1.97,-1.94 1.2,-0.97 2.48,-1.96 3.98,-2.32 0.5,-0.12 2.72,-0.21 2.72,-0.21 h 27.32 l -8.83,9.04 c 0,0 -1.31,1.65 -1.44,1.94 -0.45,0.93 -0.59,2.59 -0.13,3.51 0.35,0.69 1.46,1.87 2.23,1.98 1.03,0.14 2.12,0.39 3.02,-0.14 0.33,-0.2 1.64,-1.32 1.64,-1.32 l 17.49,-17.49 c 0,0 1.35,-1.09 1.6,-1.6 0.17,-0.34 0.29,-0.82 0.15,-1.18 z" - style="fill:#3056d3;fill-opacity:1;stroke:none;stroke-width:1.00132;stroke-miterlimit:10;stroke-dasharray:none" - id="path11604" /></g></g></g></g></g></svg> diff --git a/src/test/shell/data/apps/images/logo/codimd.png b/src/test/shell/data/apps/images/logo/codimd.png deleted file mode 100644 index eebdcf78495b91997fe1b86eda124cb8abe6f8f0..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/codimd.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/ctfd.png b/src/test/shell/data/apps/images/logo/ctfd.png deleted file mode 100644 index d666cd2c1be3f7960eb7517069d0257ddd9d7c16..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/ctfd.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/debian.png b/src/test/shell/data/apps/images/logo/debian.png deleted file mode 100644 index 33bc1b4c3b4aed575e364c5340a460aa8a26d768..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/debian.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/debian.svg b/src/test/shell/data/apps/images/logo/debian.svg deleted file mode 100644 index 8003316041728dc8f716a4eac41c1918606049e2..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/debian.svg +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="-60 -75 210 260"> - <g fill="#D70751"> - <path d="M64.525,62.053c-4.125,0.058,0.78,2.125,6.165,2.954,1.488-1.161,2.838-2.336,4.04-3.479-3.354,0.821-6.765,0.838-10.205,0.525"/> - <path d="M86.665,56.533c2.457-3.389,4.246-7.102,4.878-10.939-0.551,2.736-2.035,5.099-3.435,7.592-7.711,4.854-0.726-2.883-0.004-5.824-8.29,10.436-1.138,6.257-1.439,9.171"/> - <path d="M94.839,35.268c0.497-7.428-1.462-5.08-2.121-2.245,0.766,0.4,1.377,5.237,2.121,2.245"/> - <path d="M48.883-66.264c2.201,0.395,4.757,0.698,4.398,1.224,2.407-0.528,2.954-1.015-4.398-1.224"/> - <path d="M53.281-65.04l-1.556,0.32,1.448-0.127,0.108-0.193"/> - <path d="M121.93,38.085c0.247,6.671-1.95,9.907-3.932,15.637l-3.564,1.781c-2.919,5.666,0.282,3.598-1.807,8.105-4.556,4.049-13.823,12.67-16.789,13.457-2.163-0.047,1.469-2.554,1.943-3.537-6.097,4.188-4.894,6.285-14.217,8.83l-0.273-0.607c-23.001,10.818-54.947-10.622-54.526-39.876-0.246,1.857-0.698,1.393-1.208,2.144-1.186-15.052,6.952-30.17,20.675-36.343,13.427-6.646,29.163-3.918,38.78,5.044-5.282-6.92-15.795-14.254-28.255-13.568-12.208,0.193-23.625,7.95-27.436,16.369-6.253,3.938-6.979,15.177-9.704,17.233-3.665,26.943,6.896,38.583,24.762,52.275,2.812,1.896,0.792,2.184,1.173,3.627-5.936-2.779-11.372-6.976-15.841-12.114,2.372,3.473,4.931,6.847,8.239,9.499-5.596-1.897-13.074-13.563-15.256-14.038,9.647,17.274,39.142,30.295,54.587,23.836-7.146,0.263-16.226,0.146-24.256-2.822-3.371-1.734-7.958-5.331-7.14-6.003,21.079,7.875,42.854,5.965,61.09-8.655,4.641-3.614,9.709-9.761,11.173-9.846-2.206,3.317,0.377,1.596-1.318,4.523,4.625-7.456-2.008-3.035,4.779-12.877l2.507,3.453c-0.931-6.188,7.687-13.704,6.813-23.492,1.975-2.994,2.206,3.22,0.107,10.107,2.912-7.64,0.767-8.867,1.516-15.171,0.81,2.118,1.867,4.37,2.412,6.606-1.895-7.382,1.948-12.433,2.898-16.724-0.937-0.415-2.928,3.264-3.383-5.457,0.065-3.788,1.054-1.985,1.435-2.917-0.744-0.427-2.694-3.33-3.88-8.9,0.86-1.308,2.3,3.393,3.47,3.586-0.753-4.429-2.049-7.805-2.103-11.202-3.421-7.149-1.211,0.953-3.985-3.069-3.641-11.357,3.021-2.637,3.47-7.796,5.52,7.995,8.667,20.387,10.11,25.519-1.103-6.258-2.883-12.32-5.058-18.185,1.677,0.705-2.699-12.875,2.18-3.882-5.21-19.172-22.302-37.087-38.025-45.493,1.924,1.76,4.354,3.971,3.481,4.317-7.819-4.656-6.444-5.018-7.565-6.985-6.369-2.591-6.788,0.208-11.007,0.004-12.005-6.368-14.318-5.69-25.368-9.681l0.502,2.349c-7.953-2.649-9.265,1.005-17.862,0.009-0.523-0.409,2.753-1.479,5.452-1.871-7.69,1.015-7.329-1.515-14.854,0.279,1.855-1.301,3.815-2.162,5.793-3.269-6.271,0.381-14.971,3.649-12.286,0.677-10.235,4.569-28.403,10.976-38.597,20.535l-0.321-2.142c-4.672,5.608-20.371,16.748-21.622,24.011l-1.249,0.291c-2.431,4.116-4.004,8.781-5.932,13.016-3.18,5.417-4.661,2.085-4.208,2.934-6.253,12.679-9.359,23.332-12.043,32.069,1.912,2.858,0.046,17.206,0.769,28.688-3.141,56.709,39.8,111.77,86.737,124.48,6.88,2.459,17.11,2.364,25.813,2.618-10.268-2.937-11.595-1.556-21.595-5.044-7.215-3.398-8.797-7.277-13.907-11.711l2.022,3.573c-10.021-3.547-5.829-4.39-13.982-6.972l2.16-2.82c-3.249-0.246-8.604-5.475-10.069-8.371l-3.553,0.14c-4.27-5.269-6.545-9.063-6.379-12.005l-1.148,2.047c-1.301-2.235-15.709-19.759-8.234-15.679-1.389-1.271-3.235-2.067-5.237-5.703l1.522-1.739c-3.597-4.627-6.621-10.562-6.391-12.536,1.919,2.592,3.25,3.075,4.568,3.52-9.083-22.539-9.593-1.242-16.474-22.942l1.456-0.116c-1.116-1.682-1.793-3.506-2.69-5.298l0.633-6.313c-6.541-7.562-1.829-32.151-0.887-45.637,0.655-5.485,5.459-11.322,9.114-20.477l-2.227-0.384c4.256-7.423,24.301-29.814,33.583-28.662,4.499-5.649-0.892-0.02-1.772-1.443,9.878-10.223,12.984-7.222,19.65-9.061,7.19-4.268-6.17,1.664-2.761-1.628,12.427-3.174,8.808-7.216,25.021-8.828,1.71,0.973-3.969,1.503-5.395,2.766,10.354-5.066,32.769-3.914,47.326,2.811,16.895,7.896,35.873,31.232,36.622,53.189l0.852,0.229c-0.431,8.729,1.336,18.822-1.727,28.094l2.1-4.385"/> - <path d="M19.5,67.715l-0.578,2.893c2.71,3.683,4.861,7.673,8.323,10.552-2.49-4.863-4.341-6.872-7.745-13.445"/> - <path d="M25.909,67.464c-1.435-1.587-2.284-3.497-3.235-5.4,0.909,3.345,2.771,6.219,4.504,9.143l-1.269-3.743"/> - <path d="M139.32,42.814l-0.605,1.52c-1.111,7.892-3.511,15.701-7.189,22.941,4.06-7.639,6.69-15.995,7.79-24.461"/> - <path d="M49.698-68.243c2.789-1.022,6.855-0.56,9.814-1.233-3.855,0.324-7.693,0.517-11.484,1.005l1.67,0.228"/> - <path d="M-48.219-16.176c0.642,5.951-4.477,8.26,1.134,4.337,3.007-6.773-1.175-1.87-1.134-4.337"/> - <path d="M-54.812,11.362c1.292-3.967,1.526-6.349,2.02-8.645-3.571,4.566-1.643,5.539-2.02,8.645"/> - </g> -</svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/elk.svg b/src/test/shell/data/apps/images/logo/elk.svg deleted file mode 100644 index f6dd3aa91930095af91cac7f0ad202c447454e6d..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/elk.svg +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg width="522px" height="185px" viewBox="0 0 522 185" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 3.6 (26304) - http://www.bohemiancoding.com/sketch --> - <title>Slice 1</title> - <desc>Created with Sketch.</desc> - <defs></defs> - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="Group-2"> - <g id="Group" transform="translate(188.000000, 0.000000)"> - <path d="M86,99 L0,99 L0,0 L26,0 C59.1,0 86,26.9 86,60 L86,99 L86,99 Z" id="Shape" fill="#F2BD1A"></path> - <path d="M86,185 L86,185 C38.5,185 0,146.5 0,99 L0,99 L86,99 L86,185 L86,185 Z" id="Shape" fill="#231F20"></path> - <rect id="Rectangle-path" fill="#40BEB0" x="86" y="99" width="78.4" height="86"></rect> - <rect id="Rectangle-path" fill="#37A595" x="86" y="99" width="18" height="86"></rect> - </g> - <g id="Group" transform="translate(380.000000, 0.000000)"> - <path d="M2.7,69.1 C27.2,69.1 50.3,75.4 70.4,86.3 L142,0 L0,0 L0,171.1 L0,171.1 L0,69.1 L2.7,69.1 L2.7,69.1 Z" id="Shape" fill="#E8478B"></path> - <path d="M70.4,86.3 L0,171.1 L0,184.6 L141.9,184.6 C133.9,142.1 107.1,106.3 70.4,86.3 L70.4,86.3 Z" id="Shape" fill="#40BEB0"></path> - <path d="M70.4,86.3 L0,171.1 L0,184.6 L25.3,184.6 L93.6,102.2 C93.6,102.2 89.1,98.4 82.6,93.9 C77.7,90.3 70.4,86.3 70.4,86.3 L70.4,86.3 Z" id="Shape" fill="#37A595"></path> - <path d="M2.7,69.1 C1.8,69.1 0.9,69.2 0,69.2 L0,171.1 L70.4,86.4 C50.3,75.3 27.2,69.1 2.7,69.1 L2.7,69.1 Z" id="Shape" fill="#231F20"></path> - </g> - <g id="Group"> - <path d="M10.2141785,52 L133,52 C146.546091,52 158.693793,45.847089 166.792688,36.1916865 C149.883268,14.1847835 123.298151,0 93.4,0 C56.8388008,0 25.2318532,21.2116727 10.2141817,51.9999935 Z" id="Combined-Shape" fill="#EFBF1B"></path> - <path d="M10.1654761,132.9 L133.5,132.9 C146.952464,132.9 158.995156,138.937503 167.066167,148.4506 C150.170706,170.661384 123.459835,185 93.4,185 C56.7992306,185 25.1634426,163.742388 10.1654792,132.900006 Z" id="Combined-Shape" fill="#40BEB0"></path> - <path d="M4.60412555,118.5 L122.5,118.5 C136.8,118.5 148.5,106.9 148.5,92.5 C148.5,78.2 136.9,66.5 122.5,66.5 L4.60412555,66.5 C2.19308303,74.7479019 0.9,83.4729431 0.9,92.5 C0.9,101.527057 2.19308303,110.252098 4.60412555,118.5 Z" id="Combined-Shape" fill="#0AA5DE"></path> - <path d="M4.60412555,66.5 L81.8,66.5 C83.8,74.3 85,82.9 85,92.5 C85,102 83.9,110.7 82,118.5 L4.60412555,118.5 C2.19308303,110.252098 0.9,101.527057 0.9,92.5 C0.9,83.4729431 2.19308303,74.7479019 4.60412555,66.5 Z" id="Combined-Shape" fill="#231F20"></path> - <path d="M46.9,12.5 C31.1,21.7 18.3,35.4 10.2,51.9 L78.5,51.9 C71.4,36.3 60.5,22.7 46.9,12.5 L46.9,12.5 Z" id="Shape" fill="#D7A229"></path> - <path d="M49.6,173.9 C62.9,163.1 73.5,149.1 80.1,133 L10.2,133 C18.7,150.4 32.6,164.8 49.6,173.9 L49.6,173.9 Z" id="Shape" fill="#009B8F"></path> - </g> - </g> - </g> -</svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/geant.png b/src/test/shell/data/apps/images/logo/geant.png deleted file mode 100644 index 0bf4e52cd826a686f55c647627989047b7c106f8..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/geant.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/icinga.svg b/src/test/shell/data/apps/images/logo/icinga.svg deleted file mode 100644 index 88161d61ca75e8f7e531e21c8e33e556c34c466f..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/icinga.svg +++ /dev/null @@ -1,87 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with Inkscape (http://www.inkscape.org/) by Marsupilami --> -<svg - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - version="1.1" - id="svg5227" - width="1024" - height="370" - viewBox="-3.1904169 -3.1904169 311.9071138 112.7280638"> - <defs - id="defs5229" /> - <path - id="path3696" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-opacity:1" - d="m 82.265456,54.761509 0,0 c 0,-1.3146 0.47002,-2.3465 1.31605,-3.192 0.84729,-0.9381 1.97534,-1.3134 3.19739,-1.3134 1.22205,0 2.25734,0.3753 3.10338,1.3134 0.94004,0.8455 1.41006,1.8774 1.41006,3.192 l 0,44.7785 c 0,1.220401 -0.47002,2.253001 -1.31606,3.191801 -0.84603,0.8449 -1.97533,1.3143 -3.19738,1.3143 -1.22205,0 -2.25609,-0.4694 -3.10338,-1.3143 -0.94004,-0.9388 -1.41006,-1.9714 -1.41006,-3.191801 l 0,-44.7785 z" /> - <path - id="path3716" - style="fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 99.567176,68.280009 0,0 c 0,-2.723 0.564044,-5.3509 1.598084,-7.6986 1.03404,-2.4403 2.4441,-4.5992 4.23142,-6.3828 1.78608,-1.7836 3.85416,-3.192 6.29952,-4.2252 2.4441,-1.0318 4.98345,-1.5009 7.80357,-1.5009 1.97533,0 3.94941,0.2814 5.83075,0.8443 1.7798,0.5628 3.4844,1.4084 5.0762,2.4403 1.60433,1.0331 3.00813,2.2539 4.23644,3.7548 1.21579,1.4084 2.2561,3.0044 3.00813,4.788 0.188,0.3753 0.37601,0.7518 0.37601,1.2208 0.0877,0.3752 0.18801,0.7505 0.18801,1.127 0,1.0319 -0.37602,2.065 -1.12805,3.0031 -0.8523,0.9394 -1.88007,1.4084 -3.2964,1.4084 -1.88008,0 -3.19613,-0.9393 -4.13617,-2.723 -0.75203,-1.9712 -2.06808,-3.661 -3.94816,-4.9743 -1.78733,-1.3146 -3.85541,-1.9713 -6.20676,-1.9713 -1.50406,0 -2.91412,0.2814 -4.32418,0.8443 -1.31731,0.5628 -2.44535,1.4084 -3.47939,2.3465 -1.03405,0.9393 -1.78608,2.1601 -2.3501,3.4734 -0.56528,1.3146 -0.84729,2.723 -0.84729,4.2252 l 0,17.6486 c 0,1.5009 0.28201,2.8155 0.84729,4.2239 0.65803,1.3145 1.41006,2.4403 2.4441,3.4734 1.03404,0.9387 2.16209,1.6898 3.4794,2.253 1.31605,0.5633 2.72611,0.8448 4.23017,0.8448 2.35135,0 4.41943,-0.657 6.20676,-1.9713 1.88008,-1.3141 3.19613,-3.0039 4.04843,-4.9752 0.37602,-0.7517 1.02778,-1.4084 1.77981,-1.8774 0.75203,-0.4703 1.50406,-0.7517 2.25609,-0.7517 1.31606,0 2.4441,0.4703 3.19613,1.4084 0.75203,0.9393 1.22832,1.8774 1.22832,3.0044 0,0.6566 -0.10027,1.2207 -0.37602,1.6898 -0.66429,1.8772 -1.69206,3.567 -2.92038,5.0689 -1.21578,1.5021 -2.63211,2.816301 -4.13617,3.942901 -1.5918,1.1264 -3.38414,1.9713 -5.26422,2.5346 -1.88133,0.6571 -3.85541,0.9387 -6.01875,0.9387 -2.72611,0 -5.26547,-0.5632 -7.70957,-1.5959 -2.4441,-1.0327 -4.51344,-2.5346 -6.29951,-4.318201 -1.78733,-1.7836 -3.29139,-3.8489 -4.32543,-6.1958 -1.03404,-2.4403 -1.598084,-4.9756 -1.598084,-7.6973 l 0,-17.6486 z" /> - <path - id="path3746" - style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 146.86366,54.761509 0,0 c 0,-1.3146 0.37602,-2.3465 1.31606,-3.192 0.83977,-0.9381 1.88007,-1.3134 3.09586,-1.3134 1.22831,0 2.26862,0.3753 3.20866,1.3134 0.83977,0.8455 1.31606,1.8774 1.31606,3.192 l 0,44.7785 c 0,1.220401 -0.37602,2.253001 -1.31606,3.191801 -0.8523,0.8449 -1.88007,1.3143 -3.20866,1.3143 -1.12805,0 -2.15582,-0.4694 -3.09586,-1.3143 -0.94004,-0.9388 -1.31606,-1.9714 -1.31606,-3.191801 l 0,-44.7785 0,0 z" /> - <path - id="path3756" - style="fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 164.16037,68.280009 0,0 c 0,-2.6292 0.47629,-5.2571 1.50406,-7.6048 1.04031,-2.4403 2.4441,-4.5054 4.23645,-6.289 1.7798,-1.7836 3.94816,-3.192 6.39226,-4.2251 2.35636,-1.1257 4.98847,-1.5948 7.70831,-1.5948 2.63211,0 5.26422,0.4691 7.70832,1.5948 2.35638,1.0331 4.51218,2.4415 6.30448,4.2251 1.7798,1.7836 3.1962,3.8487 4.2239,6.289 1.1281,2.3477 1.6044,4.9756 1.6044,7.6048 l 0,31.26 c 0,1.220401 -0.376,2.253001 -1.2283,3.191801 -0.8398,0.8449 -1.8801,1.3143 -3.1962,1.3143 -1.128,0 -2.1558,-0.4694 -3.0958,-1.3143 -0.9401,-0.9388 -1.3161,-1.9714 -1.3161,-3.191801 l 0,-31.26 c 0,-1.4084 -0.2883,-2.8168 -0.8523,-4.1314 -0.564,-1.3133 -1.40377,-2.5341 -2.44408,-3.4734 -0.94004,-1.0319 -2.15582,-1.7836 -3.47188,-2.3465 -1.31605,-0.5628 -2.73238,-0.8443 -4.23644,-0.8443 -1.5918,0 -3.00812,0.2815 -4.32417,0.8443 -1.31606,0.5629 -2.44411,1.3146 -3.48441,2.3465 -0.94004,0.9393 -1.77981,2.1601 -2.34383,3.4734 -0.56403,1.3146 -0.8523,2.723 -0.8523,4.1314 l 0,31.26 c 0,1.220401 -0.37602,2.253001 -1.21579,3.191801 -0.8523,0.8449 -1.88007,1.3143 -3.19613,1.3143 -1.22832,0 -2.25609,-0.4694 -3.10839,-1.3143 -0.94004,-0.9388 -1.31606,-1.9714 -1.31606,-3.191801 l 0,-31.26 z" /> - <path - id="path3706" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 82.264826,54.762109 0,0 c 0,-1.3146 0.47002,-2.3465 1.31606,-3.192 0.84729,-0.9381 1.97533,-1.3133 3.19738,-1.3133 1.22205,0 2.25735,0.3752 3.10338,1.3133 0.94004,0.8455 1.41006,1.8774 1.41006,3.192 l 0,44.7785 c 0,1.220401 -0.47002,2.253101 -1.31605,3.191801 -0.84604,0.8449 -1.97534,1.3143 -3.19739,1.3143 -1.22205,0 -2.25609,-0.4694 -3.10338,-1.3143 -0.94004,-0.9387 -1.41006,-1.9714 -1.41006,-3.191801 l 0,-44.7785 0,0 z" /> - <path - id="path3726" - style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 99.566556,68.280609 0,0 c 0,-2.723 0.564034,-5.3509 1.598074,-7.6986 1.03404,-2.4403 2.4441,-4.5991 4.23143,-6.3828 1.78607,-1.7836 3.85416,-3.192 6.29951,-4.2251 2.4441,-1.0319 4.98346,-1.501 7.80357,-1.501 1.97534,0 3.94942,0.2815 5.83075,0.8443 1.7798,0.5629 3.48441,1.4084 5.07621,2.4403 1.60433,1.0332 3.00812,2.2539 4.23644,3.7549 1.21578,1.4084 2.25609,3.0044 3.00812,4.788 0.18801,0.3752 0.37601,0.7517 0.37601,1.2207 0.0877,0.3753 0.18801,0.7505 0.18801,1.127 0,1.0319 -0.37601,2.0651 -1.12804,3.0031 -0.85231,0.9394 -1.88008,1.4084 -3.29641,1.4084 -1.88007,0 -3.19613,-0.9393 -4.13616,-2.7229 -0.75204,-1.9713 -2.06809,-3.6611 -3.94817,-4.9744 -1.78732,-1.3146 -3.85541,-1.9713 -6.20676,-1.9713 -1.50406,0 -2.91412,0.2815 -4.32417,0.8443 -1.31731,0.5629 -2.44536,1.4084 -3.4794,2.3465 -1.03404,0.9393 -1.78607,2.1601 -2.3501,3.4734 -0.56527,1.3146 -0.84729,2.723 -0.84729,4.2252 l 0,17.6486 c 0,1.5009 0.28202,2.8155 0.84729,4.2239 0.65803,1.3146 1.41006,2.4403 2.4441,3.4734 1.03405,0.9388 2.16209,1.6899 3.4794,2.2531 1.31605,0.5632 2.72611,0.8448 4.23017,0.8448 2.35135,0 4.41944,-0.6571 6.20676,-1.9714 1.88008,-1.3141 3.19613,-3.0039 4.04844,-4.9751 0.37601,-0.7518 1.02777,-1.4084 1.7798,-1.8775 0.75203,-0.4703 1.50406,-0.7517 2.25609,-0.7517 1.31606,0 2.4441,0.4703 3.19614,1.4084 0.75203,0.9393 1.22831,1.8774 1.22831,3.0044 0,0.6567 -0.10027,1.2208 -0.37601,1.6898 -0.6643,1.8772 -1.69207,3.567 -2.92039,5.0689 -1.21578,1.5021 -2.63211,2.816301 -4.13617,3.942901 -1.5918,1.1265 -3.38414,1.9714 -5.26421,2.5346 -1.88133,0.6571 -3.85542,0.9387 -6.01876,0.9387 -2.72611,0 -5.26547,-0.5632 -7.70957,-1.5959 -2.4441,-1.0326 -4.51344,-2.5346 -6.29951,-4.318201 -1.78733,-1.7836 -3.29139,-3.8489 -4.32543,-6.1958 -1.03404,-2.4402 -1.598074,-4.9756 -1.598074,-7.6973 l 0,-17.6486 0,0 z" /> - <path - id="path3766" - style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 164.15975,68.280609 0,0 c 0,-2.6292 0.47628,-5.2571 1.50406,-7.6048 1.04031,-2.4403 2.4441,-4.5053 4.23644,-6.2889 1.7798,-1.7837 3.94816,-3.192 6.39226,-4.2252 2.35636,-1.1257 4.98847,-1.5948 7.70832,-1.5948 2.63211,0 5.26422,0.4691 7.70832,1.5948 2.3564,1.0332 4.5122,2.4415 6.3045,4.2252 1.7798,1.7836 3.1961,3.8486 4.2239,6.2889 1.1281,2.3477 1.6044,4.9756 1.6044,7.6048 l 0,31.26 c 0,1.220401 -0.3761,2.253101 -1.2284,3.191801 -0.8397,0.8449 -1.88,1.3143 -3.1961,1.3143 -1.128,0 -2.1558,-0.4694 -3.0959,-1.3143 -0.94,-0.9387 -1.316,-1.9714 -1.316,-3.191801 l 0,-31.26 c 0,-1.4084 -0.2883,-2.8168 -0.8523,-4.1314 -0.564,-1.3133 -1.40379,-2.534 -2.4441,-3.4734 -0.94004,-1.0319 -2.15583,-1.7836 -3.47188,-2.3465 -1.31605,-0.5628 -2.73238,-0.8442 -4.23644,-0.8442 -1.5918,0 -3.00813,0.2814 -4.32418,0.8442 -1.31606,0.5629 -2.4441,1.3146 -3.48441,2.3465 -0.94004,0.9394 -1.77981,2.1601 -2.34383,3.4734 -0.56402,1.3146 -0.8523,2.723 -0.8523,4.1314 l 0,31.26 c 0,1.220401 -0.37602,2.253101 -1.21579,3.191801 -0.8523,0.8449 -1.88007,1.3143 -3.19613,1.3143 -1.22831,0 -2.25609,-0.4694 -3.10839,-1.3143 -0.94004,-0.9387 -1.31605,-1.9714 -1.31605,-3.191801 l 0,-31.26 0,0 z" /> - <path - id="path3776" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 212.77915,68.280009 0,0 c 0,-2.6292 0.564,-5.2571 1.5918,-7.6986 1.0403,-2.3465 2.4441,-4.5054 4.2364,-6.289 1.7799,-1.7836 3.9482,-3.192 6.3923,-4.2251 2.3438,-1.0319 4.9885,-1.501 7.7083,-1.501 2.0681,0 4.0485,0.2814 5.9285,0.8443 1.8801,0.6567 3.6599,1.4084 5.2642,2.5341 1.5918,1.1269 3.0082,2.4415 4.224,3.9437 1.2283,1.5022 2.256,3.1908 3.0081,5.0695 0.1002,0.1876 0.188,0.469 0.188,0.8442 0,0.2815 0,0.5629 0,0.9394 0,1.0319 -0.376,2.065 -1.1281,3.0031 -0.752,0.9394 -1.7798,1.3146 -3.1961,1.3146 -0.8398,0 -1.5918,-0.1876 -2.3438,-0.5629 -0.7521,-0.4703 -1.3161,-1.1269 -1.6921,-1.9712 -0.8523,-2.0663 -2.2561,-3.7561 -4.0484,-5.0694 -1.7798,-1.3146 -3.8479,-1.9713 -6.2043,-1.9713 -1.5918,0 -3.0081,0.2815 -4.3242,0.8443 -1.316,0.5629 -2.4441,1.3146 -3.4844,2.3465 -0.94,0.9393 -1.692,2.1601 -2.3438,3.4734 -0.564,1.3146 -0.8523,2.723 -0.8523,4.1314 l 0,17.6486 c 0,1.5009 0.2883,2.8155 0.8523,4.2239 0.6518,1.3145 1.4038,2.4403 2.4441,3.4734 0.94,0.9387 2.1558,1.6898 3.4719,2.253 1.3286,0.5633 2.7324,0.8448 4.2364,0.8448 1.5041,0 2.9204,-0.2815 4.2365,-0.8448 1.316,-0.5632 2.5318,-1.3143 3.4718,-2.253 1.0403,-1.0331 1.7924,-2.1589 2.3564,-3.4734 0.564,-1.4084 0.8398,-2.723 0.8398,-4.2239 l 0,-2.1601 -4.4119,0 c -1.2284,0 -2.2561,-0.4691 -3.1084,-1.3134 -0.8398,-0.9393 -1.3161,-1.9712 -1.3161,-3.192 0,-1.2207 0.4763,-2.2526 1.3161,-3.0982 0.8523,-0.8443 1.88,-1.3146 3.1084,-1.3146 l 8.9241,0 c 1.2283,0 2.256,0.3765 3.1961,1.2208 0.8523,0.8455 1.2283,1.8774 1.2283,3.192 l 0,6.6655 c 0,2.7217 -0.4763,5.257 -1.5041,7.6973 -1.128,2.3469 -2.5443,4.4122 -4.3241,6.1958 -1.7924,1.783601 -3.9482,3.285501 -6.3046,4.318201 -2.4441,1.0327 -4.9759,1.5959 -7.7083,1.5959 -2.7198,0 -5.3645,-0.5632 -7.7083,-1.5959 -2.4441,-1.0327 -4.6124,-2.5346 -6.3923,-4.318201 -1.7923,-1.7836 -3.1961,-3.8489 -4.2364,-6.1958 -1.0278,-2.4403 -1.5918,-4.9756 -1.5918,-7.6973 l 0,-17.6486 z" /> - <path - id="path3806" - style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 280.95075,65.557009 0,0 c -0.564,1.3146 -1.128,2.5353 -1.6043,3.7549 -0.5641,1.2207 -1.0403,2.4415 -1.6044,3.661 -0.564,1.2208 -1.128,2.4416 -1.692,3.6611 -0.4638,1.2207 -1.0278,2.5353 -1.6921,4.0375 l 13.1731,0 -6.5803,-15.1145 0,0 z m -4.0484,-12.9544 0,0 c 0.8397,-1.7836 2.2561,-2.723 4.0484,-2.723 0.2757,0 0.564,0.094 0.94,0.094 0.2758,0.094 0.5641,0.1877 0.8398,0.3765 1.1281,0.4691 1.8801,1.3134 2.3564,2.2527 l 19.3648,45.3415 c 0.2757,0.6572 0.4637,1.2204 0.4637,1.7836 0,1.032701 -0.376,1.971501 -1.2158,2.910201 -0.752,0.9388 -1.88,1.4082 -3.1961,1.4082 -2.0681,0 -3.3841,-0.8449 -4.1362,-2.6286 l -4.9884,-11.827901 -20.6809,0 c -0.8523,1.9712 -1.6921,3.9425 -2.5444,5.9139 -0.8397,1.8774 -1.692,3.8487 -2.5318,5.914001 -0.376,0.9388 -0.94,1.5959 -1.6921,2.0653 -0.6643,0.3755 -1.504,0.5633 -2.3563,0.5633 -1.4038,0 -2.4441,-0.4694 -3.1962,-1.4082 -0.8397,-0.9387 -1.2157,-1.8775 -1.2157,-2.910201 0,-0.2815 0,-0.5632 0.088,-0.9387 0,-0.2817 0.1002,-0.5632 0.2882,-0.8449 l 19.3648,-45.3415 0,0 z" /> - <path - id="path3786" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 212.77855,68.280609 0,0 c 0,-2.6292 0.564,-5.2571 1.5918,-7.6986 1.0403,-2.3465 2.4441,-4.5053 4.2364,-6.2889 1.7798,-1.7837 3.9482,-3.1921 6.3923,-4.2252 2.3438,-1.0319 4.9884,-1.501 7.7083,-1.501 2.0681,0 4.0484,0.2815 5.9285,0.8443 1.8801,0.6567 3.6599,1.4084 5.2642,2.5341 1.5918,1.127 3.0081,2.4416 4.2239,3.9438 1.2283,1.5021 2.2561,3.1907 3.0081,5.0694 0.1003,0.1876 0.1881,0.469 0.1881,0.8443 0,0.2814 0,0.5628 0,0.9393 0,1.0319 -0.3761,2.0651 -1.1281,3.0032 -0.752,0.9393 -1.7798,1.3145 -3.1961,1.3145 -0.8398,0 -1.5918,-0.1876 -2.3438,-0.5628 -0.7521,-0.4703 -1.3161,-1.127 -1.6921,-1.9713 -0.8523,-2.0663 -2.2561,-3.7561 -4.0485,-5.0694 -1.7798,-1.3146 -3.8478,-1.9712 -6.2042,-1.9712 -1.5918,0 -3.0081,0.2814 -4.3242,0.8442 -1.316,0.5629 -2.4441,1.3146 -3.4844,2.3465 -0.94,0.9394 -1.6921,2.1601 -2.3438,3.4734 -0.564,1.3146 -0.8523,2.723 -0.8523,4.1314 l 0,17.6486 c 0,1.5009 0.2883,2.8155 0.8523,4.2239 0.6517,1.3146 1.4038,2.4403 2.4441,3.4734 0.94,0.9388 2.1558,1.6899 3.4719,2.2531 1.3285,0.5632 2.7323,0.8448 4.2364,0.8448 1.5041,0 2.9204,-0.2816 4.2364,-0.8448 1.3161,-0.5632 2.5319,-1.3143 3.4719,-2.2531 1.0403,-1.0331 1.7924,-2.1588 2.3564,-3.4734 0.564,-1.4084 0.8397,-2.723 0.8397,-4.2239 l 0,-2.1601 -4.4119,0 c -1.2283,0 -2.2561,-0.4691 -3.1084,-1.3133 -0.8397,-0.9394 -1.316,-1.9713 -1.316,-3.192 0,-1.2208 0.4763,-2.2527 1.316,-3.0982 0.8523,-0.8443 1.8801,-1.3146 3.1084,-1.3146 l 8.9241,0 c 1.2283,0 2.2561,0.3765 3.1962,1.2207 0.8523,0.8456 1.2283,1.8775 1.2283,3.1921 l 0,6.6654 c 0,2.7217 -0.4763,5.2571 -1.5041,7.6973 -1.128,2.3469 -2.5444,4.4122 -4.3242,6.1958 -1.7923,1.783601 -3.9481,3.285601 -6.3045,4.318201 -2.4441,1.0327 -4.9759,1.5959 -7.7083,1.5959 -2.7199,0 -5.3645,-0.5632 -7.7083,-1.5959 -2.4441,-1.0326 -4.6125,-2.5346 -6.3923,-4.318201 -1.7923,-1.7836 -3.1961,-3.8489 -4.2364,-6.1958 -1.0278,-2.4402 -1.5918,-4.9756 -1.5918,-7.6973 l 0,-17.6486 0,0 z" /> - <path - d="m 40.704846,40.305609 0,0 12.22301,-25.1583 m -20.21584,28.9132 0,0 -20.59136,-16.8982 m 26.61011,23.7512 0,0 14.00908,23.4685 m -14.95037,-24.5016 0,0 50.21059,-12.3916 m -50.21059,12.3916 0,0 -24.25801,34.7343" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - id="path3906" /> - <path - d="m 26.601396,35.704509 0,0 c 7.05279,-5.7261 17.39572,-4.693 23.13121,2.3477 5.73549,7.0407 4.70145,17.3659 -2.35135,23.0933 -7.05154,5.6323 -17.39447,4.5991 -23.12996,-2.4416 -5.73549,-6.9468 -4.60744,-17.2721 2.3501,-22.9994 z m 23.13121,-33.2309002 0,0 c 3.6674,-2.91059997 9.02688,-2.34779997 12.035,1.2195 3.00938,3.661 2.44535,9.0119002 -1.22205,12.0163002 -3.6674,3.0044 -9.02688,2.4403 -12.035,-1.2208 -3.00938,-3.661 -2.44535,-9.0119002 1.22205,-12.0150002 z m 30.37077,34.6393002 0,0 c -0.28202,-3.6611 2.5381,-6.8531 6.2055,-7.1345 3.76141,-0.2815 6.95754,2.4403 7.23955,6.1026 0.28201,3.7548 -2.5381,6.9456 -6.2055,7.2283 -3.66741,0.2814 -6.95754,-2.4416 -7.23955,-6.1964 z m -72.4951504,-7.416 0,0 c -1.1283,-2.3464 -0.18801,-5.3508 2.25659,-6.4778 2.4447304,-1.2195 5.3596004,-0.1876 6.5816504,2.2539 1.22205,2.3465 0.18801,5.3509 -2.25609,6.4766 -2.44498,1.2208 -5.3598504,0.1876 -6.5821504,-2.2527 l 0,0 z m 41.7483704,44.9658 0,0 c 0.188,-1.8774 1.88007,-3.2858 3.76015,-3.0969 1.88133,0.2814 3.29139,1.9712 3.00938,3.8487 -0.18801,1.8774 -1.88008,3.192 -3.76141,3.0031 -1.88008,-0.1876 -3.29014,-1.8774 -3.00812,-3.7549 l 0,0 z m -48.7063704,11.6411 0,0 c -0.47013,-6.1026 4.04313,-11.3596 10.1548804,-11.8287 6.11138,-0.469 11.37685,4.1314 11.84687,10.1389 0.47127,6.1013 -4.04216,11.4527 -10.1543,11.922 -6.1117504,0.3755 -11.4713504,-4.1309 -11.8474504,-10.2322 z" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path4016" /> - <path - id="path3926" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 0.6496356,86.304709 0,0 c -0.47014,-6.1026 4.04313,-11.3597 10.1548804,-11.8287 6.11138,-0.4691 11.37685,4.1313 11.84687,10.1389 0.47127,6.1013 -4.04217,11.4527 -10.1543,11.922 -6.1117504,0.3754 -11.4713504,-4.1309 -11.8474504,-10.2322 l 0,0 z" /> - <path - id="path3936" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 49.355996,74.663609 0,0 c 0.18801,-1.8774 1.88008,-3.2858 3.76016,-3.097 1.88133,0.2815 3.29138,1.9713 3.00937,3.8487 -0.188,1.8775 -1.88007,3.192 -3.7614,3.0032 -1.88008,-0.1877 -3.29014,-1.8775 -3.00813,-3.7549 z" /> - <path - id="path3956" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 7.6076356,29.697809 0,0 c -1.1283,-2.3465 -0.18801,-5.3509 2.25659,-6.4778 2.4447304,-1.2195 5.3596004,-0.1876 6.5816504,2.2539 1.22205,2.3465 0.18801,5.3509 -2.25609,6.4766 -2.44498,1.2207 -5.3598504,0.1876 -6.5821504,-2.2527 z" /> - <path - id="path3986" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 80.102776,37.113709 0,0 c -0.28201,-3.661 2.53811,-6.853 6.20551,-7.1345 3.76141,-0.2814 6.95754,2.4403 7.23955,6.1026 0.28201,3.7549 -2.5381,6.9456 -6.20551,7.2283 -3.6674,0.2815 -6.95754,-2.4415 -7.23955,-6.1964 l 0,0 z" /> - <path - id="path4006" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 49.732016,2.4744088 0,0 c 3.6674,-2.91049997 9.02687,-2.34769997 12.035,1.2196 3.00937,3.661 2.44535,9.0119002 -1.22205,12.0163002 -3.66741,3.0044 -9.02688,2.4403 -12.035,-1.2208 -3.00938,-3.6611 -2.44536,-9.0119002 1.22205,-12.0151002 l 0,0 z" /> - <path - id="path4026" - style="fill:none;stroke:#000000;stroke-width:1.2216469;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" - d="m 26.600796,35.705309 0,0 c 7.0528,-5.7261 17.39573,-4.6929 23.13122,2.3478 5.73549,7.0406 4.70144,17.3659 -2.35135,23.0932 -7.05154,5.6323 -17.39448,4.5992 -23.12996,-2.4415 -5.73549,-6.9469 -4.60745,-17.2721 2.35009,-22.9995 l 0,0 z" /> -</svg> -<!-- version: 20171223, original size: 305.52628 106.34723, border: 3% --> diff --git a/src/test/shell/data/apps/images/logo/influxdb.png b/src/test/shell/data/apps/images/logo/influxdb.png deleted file mode 100644 index 092d14ab40d3d5dd4d831d6f819ede887babcfab..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/influxdb.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/jenkins.png b/src/test/shell/data/apps/images/logo/jenkins.png deleted file mode 100644 index 40687290be0443c48f432bdeaa279ea0b9b49d3d..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/jenkins.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/jenkins.svg b/src/test/shell/data/apps/images/logo/jenkins.svg deleted file mode 100644 index 4a4538daf6f45f39ceefcbb00a8a3c368c335600..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/jenkins.svg +++ /dev/null @@ -1,283 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - id="svg2" - version="1.1" - inkscape:version="0.48.0 r9654" - width="226" - height="312" - xml:space="preserve" - sodipodi:docname="logo.svg"><metadata - id="metadata8"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs - id="defs6"><clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath18"><path - d="M 0,2494.84 0,0 l 1804.34,0 0,2494.84 -1804.34,0 z" - id="path20" - inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1500" - inkscape:window-height="844" - id="namedview4" - showgrid="false" - inkscape:zoom="1" - inkscape:cx="-65.859116" - inkscape:cy="172.53076" - inkscape:window-x="2189" - inkscape:window-y="496" - inkscape:window-maximized="0" - inkscape:current-layer="g10" /><g - id="g10" - inkscape:groupmode="layer" - inkscape:label="ink_ext_XXXXXX" - transform="matrix(1.25,0,0,-1.25,0,312)"><g - id="g3393"><path - d="m 177.718,129.264 c 0,-49.4288 -39.175,-89.4992 -87.5,-89.4992 -48.3242,0 -87.49925,40.0704 -87.49925,89.4992 0,49.43 39.17505,89.501 87.49925,89.501 48.325,0 87.5,-40.071 87.5,-89.501" - style="fill:#d33833;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path22" - inkscape:connector-curvature="0" /><path - d="m 6.28438,107.098 c 0,0 -6.33438,93.333 79.66602,96 l -5.9996,10 -46.6664,-15.667 -13.3336,-15.333 -11.66642,-22.334 -6.66719,-26 2,-17.333" - style="fill:#ef3d3a;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path24" - inkscape:connector-curvature="0" /><path - d="M 30.2883,190.319 C 14.9363,174.611 5.43633,152.923 5.43633,128.93 l 0,0 c 0,-23.988 9.49997,-45.6788 24.85197,-61.3839 l 0,0 C 45.6477,51.841 66.8152,42.15 90.2168,42.15 l 0,0 c 23.4022,0 44.5712,9.691 59.9292,25.3961 l 0,0 c 15.351,15.7051 24.853,37.3959 24.853,61.3839 l 0,0 c 0,23.993 -9.502,45.681 -24.853,61.389 l 0,0 c -15.358,15.702 -36.527,25.393 -59.9292,25.395 l 0,0 C 66.8152,215.712 45.6477,206.021 30.2883,190.319 l 0,0 z M 26.4023,63.7469 C 10.0867,80.4328 0,103.493 0,128.93 l 0,0 c 0,25.441 10.0867,48.499 26.4023,65.186 l 0,0 c 16.3118,16.69 38.8915,27.035 63.8145,27.032 l 0,0 c 24.9232,0.003 47.5052,-10.342 63.8142,-27.032 l 0,0 c 16.317,-16.687 26.405,-39.747 26.403,-65.186 l 0,0 c 0.002,-25.437 -10.086,-48.4972 -26.403,-65.1831 l 0,0 C 137.722,47.0578 115.14,36.7141 90.2168,36.7141 l 0,0 c -24.923,0 -47.5027,10.3437 -63.8145,27.0328 l 0,0" - style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path26" - inkscape:connector-curvature="0" /><path - d="m 127.051,128.768 -13.334,-2 -18.0002,-2 -11.6672,-0.333 -11.3328,0.333 -8.6672,2.667 -7.6668,8.333 -6,17 -1.3332,3.667 -8,2.666 -4.6668,7.667 -3.3332,11 3.6672,9.667 8.666,3 7,-3.334 3.334,-7.333 4,0.667 1.3328,1.666 -1.3328,7.667 -0.334,9.667 2,13.333 -0.0781,7.616 6.0781,9.717 10.6668,7.667 18.6672,8 20.6662,-3 18,-13 8.334,-13.333 5.333,-9.667 1.333,-24 -4,-20.667 -7.333,-18.333 -7,-9.667" - style="fill:#f0d6b7;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path28" - inkscape:connector-curvature="0" /><path - d="m 115.717,71.102 -47.6674,-2 0,-8 4,-28 -2,-2.334 -33.3328,11.334 -2.334,4 -3.3332,37.666 -7.6656,22.667 -1.6672,5.333 26.666,18.333 8.334,3.334 7.3328,-9 6.3332,-5.667 7.334,-2.333 3.3328,-1 4,-17.333 3,-3.6668 7.6672,2.6668 -5.334,-10.334 29.0002,-13.666 -3.666,-2" - style="fill:#335061;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path30" - inkscape:connector-curvature="0" /><path - d="m 36.7168,187.435 8.666,3 7,-3.334 3.334,-7.333 4,0.667 1,4 -2,7.666 2,18.334 -1.6672,10 6,7 13,10.333 -3.6668,5 -18.3332,-9 -7.6668,-6 -4.3332,-9.333 -6.6668,-9 -2,-10.667 1.334,-11.333" - style="fill:#6d6b6d;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path32" - inkscape:connector-curvature="0" /><path - d="m 50.3828,218.768 c 0,0 5,12.333 25,18.333 20,6 1,4.334 1,4.334 l -21.666,-8.334 -8.334,-8.333 -3.666,-6.667 7.666,0.667" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path34" - inkscape:connector-curvature="0" /><path - d="m 40.3828,189.768 c 0,0 -7,23.334 19.6668,26.667 l -1,4 -18.3328,-4.334 -5.334,-17.333 1.334,-11.333 3.666,2.333" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path36" - inkscape:connector-curvature="0" /><path - d="m 51.0496,158.768 4.3645,4.229 c 0,0 1.9699,-0.229 2.3027,-2.562 0.3328,-2.334 1.3328,-23.334 15.666,-34.668 1.3074,-1.034 -10.666,1.668 -10.666,1.668 l -10.6672,16.666" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path38" - inkscape:connector-curvature="0" /><path - d="m 112.385,165.101 c 0,0 0.777,10.104 3.498,9.327 2.721,-0.777 2.721,-3.498 2.721,-3.498 0,0 -6.608,-4.275 -6.219,-5.829" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path40" - inkscape:connector-curvature="0" /><path - d="m 140.05,202.101 c 0,0 -5.494,-1.16 -6,-6 -0.506,-4.841 6,-1 7,-0.667" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path42" - inkscape:connector-curvature="0" /><path - d="m 99.7168,201.767 c 0,0 -7.334,-1 -7.334,-5.666 0,-4.667 8.3342,-4.334 10.6672,-2.334" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path44" - inkscape:connector-curvature="0" /><path - d="m 54.3828,180.101 c 0,0 -12.6672,7.667 -14,0.333 -1.3332,-7.333 -4.334,-12.667 2,-20.333 l -4.3332,1.333 -4,10.333 -1.3328,10 7.666,8.001 8.6668,-0.667 5,-4 0.3332,-5" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path46" - inkscape:connector-curvature="0" /><path - d="m 60.3828,201.101 c 0,0 5.6668,29.333 34.334,35 23.6012,4.665 35.9992,-1 40.6662,-6.333 0,0 -21,24.999 -41.0002,17.333 -20,-7.667 -34.666,-21.667 -34.3332,-30.666 0.5676,-15.328 0.3332,-15.334 0.3332,-15.334" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path48" - inkscape:connector-curvature="0" /><path - d="m 137.717,226.435 c 0,0 -9.666,0.333 -10,-8.334 0,0 -0.001,-1.333 0.666,-2.666 0,0 7.668,8.667 12.334,4" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path50" - inkscape:connector-curvature="0" /><path - d="m 95.3887,214.532 c 0,0 -1.6641,13.303 -13.0059,5.569 -7.3332,-5 -6.666,-12 -5.3332,-13.333 1.3332,-1.334 0.9707,-4.019 1.9856,-2.176 1.0144,1.843 0.6804,7.843 4.3476,9.509 3.6668,1.667 9.6777,3.529 12.0059,0.431" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path52" - inkscape:connector-curvature="0" /><path - d="m 64.0496,124.435 -31.3328,-14 c 0,0 13,-51.667 6.3328,-67.667 l -4.6668,1.666 -0.3332,19.6672 -8.6656,37.3328 -3.6672,10.334 32.666,21.999 9.6668,-9.332" - style="fill:#49728b;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path54" - inkscape:connector-curvature="0" /><path - d="m 67.2715,95.8578 4.4453,-5.4238 0,-20 -5.334,0 c 0,0 -0.666,14 -0.666,15.6672 0,1.6668 0.666,7.6668 0.666,7.6668" - style="fill:#49728b;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path56" - inkscape:connector-curvature="0" /><path - d="m 67.3828,67.434 -15,-0.666 4.334,-3 10.666,-1.6668" - style="fill:#49728b;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path58" - inkscape:connector-curvature="0" /><path - d="m 118.717,70.768 12.333,0.3332 3,-30.6672 -12.667,-1.666 -2.666,32" - style="fill:#335061;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path60" - inkscape:connector-curvature="0" /><path - d="m 122.05,70.768 18.667,1 c 0,0 7.666,19.3332 7.666,20.3332 0,1 6.667,27.9998 6.667,27.9998 l -15,15.666 -3,2.667 -8,-8 0,-31 -7,-28.666" - style="fill:#335061;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path62" - inkscape:connector-curvature="0" /><path - d="m 130.383,73.1012 -11.666,-2.3332 1.666,-9.334 c 4.333,-2 11.667,3.334 11.667,3.334" - style="fill:#49728b;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path64" - inkscape:connector-curvature="0" /><path - d="m 130.717,131.434 23.333,-17.333 0.667,8 -17.667,16.333 -6.333,-7" - style="fill:#49728b;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path66" - inkscape:connector-curvature="0" /><path - d="M 78.9508,5.09805 72.0496,33.102 68.6172,53.7648 68.0496,69.102 l 31.2348,1.6628 19.4326,0.0032 -1.767,-35.0032 3,-26.99996 -0.333,-5 -25.3326,-2 -15.3336,3.33321" - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path68" - inkscape:connector-curvature="0" /><path - d="m 114.383,71.1012 c 0,0 -1.666,-34.6672 3.334,-59.3332 0,0 -10,-6.33402 -24.6674,-8.00003 l 28.0004,1 3.333,2 -4,54.66603 -1,11.668" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path70" - inkscape:connector-curvature="0" /><path - d="m 134.618,43.098 13,3.6668 24.666,1.3332 3.667,11.3329 -6.667,19.6671 -7.666,1 -10.667,-3.3332 -10.234,-4.9968 -5.433,0.9968 -4.234,-1.6636" - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path72" - inkscape:connector-curvature="0" /><path - d="m 134.383,49.768 c 0,0 8.666,3.9992 10,3.666 l -3.666,18.334 4.333,1.666 c 0,0 3,-17.3328 3,-19.3328 0,0 18.666,-1 20.333,-1 0,0 4,7.6668 3,15.6668 l 3.667,-10.6668 0.333,-6 -5.333,-8 -6,-1.3332 -10,0.3332 -3.333,4.3328 -11.667,-1.666 -3.667,-1.334" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path74" - inkscape:connector-curvature="0" /><path - d="m 121.284,73.4309 -7.333,18.6671 -7.667,11 c 0,0 1.666,4.667 4,4.667 2.334,0 7.667,0 7.667,0 l 7.333,-2.667 -0.666,-12.3332 -3.334,-19.3339" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path76" - inkscape:connector-curvature="0" /><path - d="m 122.717,79.768 c 0,0 -9.334,17.9992 -9.334,20.666 0,0 1.666,4 4,3 2.334,-1 7.334,-3.666 7.334,-3.666 l 0,6.333 -11.334,2.334 -7.666,-1 13,-30.667 2.666,-0.334" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path78" - inkscape:connector-curvature="0" /><path - d="m 81.9512,123.764 -9.2344,1.004 -8.6672,2.667 0,-3 4.2348,-4.67 13.3332,-6" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path80" - inkscape:connector-curvature="0" /><path - d="m 67.0508,122.765 c 0,0 10.334,-4.334 13.6672,-3.334 l 0.3316,-3.996 -9.3316,1.996 -5.6672,4 1,1.334" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path82" - inkscape:connector-curvature="0" /><path - d="m 134.582,106.63 c -5.656,0.166 -10.766,0.838 -15.24,2.1 0.304,1.834 -0.265,3.634 0.192,4.955 1.247,0.898 3.337,0.884 5.222,1.095 -1.63,0.801 -3.92,1.118 -5.801,0.655 -0.044,1.273 -0.615,2.062 -0.961,3.058 3.18,1.135 10.687,8.576 14.91,6.112 2.012,-1.172 2.867,-7.866 3.023,-11.121 0.13,-2.7 -0.245,-5.424 -1.345,-6.854" - style="fill:#d33833;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path84" - inkscape:connector-curvature="0" /><path - d="m 134.582,106.63 c -5.656,0.166 -10.766,0.838 -15.24,2.1 0.304,1.834 -0.265,3.634 0.192,4.955 1.247,0.898 3.337,0.884 5.222,1.095 -1.63,0.801 -3.92,1.118 -5.801,0.655 -0.044,1.273 -0.615,2.062 -0.961,3.058 3.18,1.135 10.687,8.576 14.91,6.112 2.012,-1.172 2.867,-7.866 3.023,-11.121 0.13,-2.7 -0.245,-5.424 -1.345,-6.854 z" - style="fill:none;stroke:#d33833;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" - id="path86" - inkscape:connector-curvature="0" /><path - d="m 107.535,115.876 c -0.015,-0.428 -0.033,-0.859 -0.05,-1.291 -1.766,-1.16 -4.617,-1.146 -6.555,-2.121 2.857,-0.125 5.106,-0.813 7.052,-1.783 -0.043,-1.078 -0.084,-2.155 -0.126,-3.233 -3.237,-2.216 -6.194,-5.516 -10.0052,-7.5941 -1.802,-0.9828 -8.1262,-3.5117 -10.0434,-3.0648 -1.0847,0.2519 -1.1824,1.598 -1.616,2.8668 -0.9238,2.7171 -3.0508,7.0421 -3.2363,11.1321 -0.2363,5.166 -0.7578,13.824 4.8094,12.76 4.4914,-0.857 9.7152,-2.926 13.1925,-4.826 2.125,-1.162 3.354,-2.598 6.578,-2.846" - style="fill:#d33833;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path88" - inkscape:connector-curvature="0" /><path - d="m 107.535,115.876 c -0.015,-0.428 -0.033,-0.859 -0.05,-1.291 -1.766,-1.16 -4.617,-1.146 -6.555,-2.121 2.857,-0.125 5.106,-0.813 7.052,-1.783 -0.043,-1.078 -0.084,-2.155 -0.126,-3.233 -3.237,-2.216 -6.194,-5.516 -10.0052,-7.5941 -1.802,-0.9828 -8.1262,-3.5117 -10.0434,-3.0648 -1.0847,0.2519 -1.1824,1.598 -1.616,2.8668 -0.9238,2.7171 -3.0508,7.0421 -3.2363,11.1321 -0.2363,5.166 -0.7578,13.824 4.8094,12.76 4.4914,-0.857 9.7152,-2.926 13.1925,-4.826 2.125,-1.162 3.354,-2.598 6.578,-2.846 z" - style="fill:none;stroke:#d33833;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" - id="path90" - inkscape:connector-curvature="0" /><path - d="m 110.75,109.712 c -0.494,2.814 -1.065,3.617 -0.844,6.072 7.505,5.004 8.914,-8.595 0.844,-6.072" - style="fill:#d33833;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path92" - inkscape:connector-curvature="0" /><path - d="m 110.75,109.712 c -0.494,2.814 -1.065,3.617 -0.844,6.072 7.505,5.004 8.914,-8.595 0.844,-6.072 z" - style="fill:none;stroke:#d33833;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" - id="path94" - inkscape:connector-curvature="0" /><path - d="m 121.617,107.431 c 0,0 -2.334,3.334 -0.667,4.334 1.667,1 3.334,-0.001 4.334,1.666 1,1.667 0,2.667 0.333,4.667 0.333,2 2.001,2.334 3.667,2.667 1.666,0.333 6.334,1 7,-0.667 l -2,6 -4,1.333 -12.667,-7.333 -0.667,-3.667 0,-7.333" - style="fill:#ef3d3a;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path96" - inkscape:connector-curvature="0" /><path - d="m 86.6172,96.4309 c -0.4004,5.2021 -0.8242,10.3971 -1.2957,15.5941 -0.7055,7.76 1.864,6.406 8.5906,6.406 1.0274,0 6.3259,-1.225 6.7049,-2 1.818,-3.713 -3.04,-2.888 2.094,-5.688 4.334,-2.363 11.99,1.435 10.239,6.688 -0.98,1.168 -5.106,0.364 -6.585,1.131 -2.604,1.35 -5.208,2.7 -7.8123,4.05 -3.3132,1.719 -10.9707,4.225 -14.5031,1.823 -8.9504,-6.087 0.5649,-21.296 3.7578,-27.6459" - style="fill:#ef3d3a;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path98" - inkscape:connector-curvature="0" /><path - d="m 95.3887,214.532 c -9.0852,2.116 -13.5996,-3.802 -16.3535,-9.94 -2.459,0.596 -1.4805,3.94 -0.8594,5.644 1.6262,4.472 8.1797,10.425 13.5344,9.618 2.3043,-0.347 5.4226,-2.454 3.6785,-5.322" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path100" - inkscape:connector-curvature="0" /><path - d="m 139.655,204.186 c 0.143,-0.006 0.288,-0.011 0.431,-0.017 2.053,-4.265 3.83,-8.783 6.42,-12.548 -1.735,-4.041 -13.138,-7.617 -12.962,-0.361 2.466,1.078 6.723,0.22 8.909,1.597 -1.264,3.469 -3.088,6.422 -2.798,11.329" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path102" - inkscape:connector-curvature="0" /><path - d="m 100.04,204.075 c 1.948,-3.571 2.582,-7.323 5.351,-10.022 1.247,-1.215 3.672,-2.696 2.47,-6.075 -0.281,-0.797 -2.334,-2.574 -3.519,-2.923 -4.329,-1.278 -14.4162,-0.264 -11.0002,5.133 3.5801,-0.167 8.3922,-2.325 11.0682,0.274 -2.055,3.285 -5.7186,9.784 -4.37,13.613" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path104" - inkscape:connector-curvature="0" /><path - d="m 138.03,167.781 c -6.518,-4.187 -13.786,-8.74 -24.466,-7.684 -2.282,1.984 -3.152,6.399 -0.935,9.315 1.154,-1.984 0.429,-5.633 3.645,-6.182 6.06,-1.037 13.113,3.707 17.472,5.365 2.703,4.557 -0.233,6.233 -2.668,9.166 -4.985,6.009 -11.672,13.457 -11.429,22.453 2.015,1.461 2.189,-2.23 2.478,-2.902 2.603,-6.092 9.154,-13.883 13.935,-19.097 1.174,-1.284 3.107,-2.516 3.322,-3.365 0.62,-2.469 -1.613,-5.427 -1.354,-7.069" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path106" - inkscape:connector-curvature="0" /><path - d="m 52.1016,172.189 c -2.043,1.166 -2.5293,6.302 -4.9278,6.448 -3.4277,0.208 -2.8027,-6.663 -2.789,-10.681 -2.3594,2.142 -2.7743,8.737 -1.041,12.124 -1.9754,0.97 -2.8575,-1.07 -3.9532,-1.789 1.4082,10.23 14.9649,4.745 12.711,-6.102" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path108" - inkscape:connector-curvature="0" /><path - d="m 142.18,163.521 c -3.034,-5.775 -7.326,-12.135 -16.229,-12.32 -0.181,1.865 -0.32,4.703 0.01,5.826 6.806,0.654 11.008,4.118 16.219,6.494" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path110" - inkscape:connector-curvature="0" /><path - d="m 99.5266,159.777 c 5.6784,-2.986 16.1144,-3.307 23.8324,-3.081 0.414,-1.691 0.404,-3.78 0.42,-5.842 -9.921,-0.495 -21.651,1.96 -24.2524,8.923" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path112" - inkscape:connector-curvature="0" /><path - d="m 98.4473,154.209 c 3.9267,-9.859 17.4227,-8.724 28.8037,-8.452 -0.501,-1.28 -1.587,-2.792 -2.937,-3.339 -3.647,-1.484 -13.706,-2.61 -18.769,0.079 -3.211,1.707 -5.274,5.564 -7.0333,7.825 -0.8496,1.092 -5.0801,3.881 -0.0644,3.887" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path114" - inkscape:connector-curvature="0" /><path - d="m 137.556,99.8262 c -4.608,-7.8922 -9.017,-15.9981 -14.484,-22.9594 2.292,6.7391 3.273,18.0184 3.619,26.6172 4.795,2.244 8.901,-0.505 10.865,-3.6578" - style="fill:#81b0c4;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path116" - inkscape:connector-curvature="0" /><path - d="m 162.352,71.4609 c -5.159,-1.0328 -8.784,-6.0468 -13.817,-5.725 2.766,3.8993 7.613,5.543 13.817,5.725" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path118" - inkscape:connector-curvature="0" /><path - d="m 164.628,63.3871 c -4.205,-0.4441 -9.144,-1.125 -13.409,-0.7742 2.019,3.084 9.798,2.0199 13.409,0.7742" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path120" - inkscape:connector-curvature="0" /><path - d="m 166.085,56.4262 c -4.726,-0.1024 -10.6,-0.0082 -15.092,0.3687 2.657,2.8539 12.027,1.059 15.092,-0.3687" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path122" - inkscape:connector-curvature="0" /><path - d="m 128.664,37.377 c 0.678,-5.9352 3.031,-11.9489 2.736,-18.4489 -2.613,-0.8812 -4.114,-1.6519 -7.615,-1.6472 -0.247,5.5242 -0.986,13.9691 -0.765,19.2351 1.722,-0.114 4.261,1.2301 5.644,0.861" - style="fill:#dcd9d8;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path124" - inkscape:connector-curvature="0" /><path - d="m 121.045,124.849 c -2.373,-1.549 -4.394,-3.483 -6.673,-5.137 -5.054,-0.25 -7.812,0.35 -11.525,3.252 0.061,0.233 0.434,0.129 0.448,0.415 5.41,-2.411 12.287,0.982 17.75,1.47" - style="fill:#f0d6b7;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path126" - inkscape:connector-curvature="0" /><path - d="m 92.6445,87.9711 c 1.4864,6.441 7.3106,9.7769 12.5995,13.3239 5.459,-6.9282 8.779,-15.838 12.435,-24.436 -8.638,2.6039 -17.464,6.8289 -25.0345,11.1121" - style="fill:#81b0c4;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path128" - inkscape:connector-curvature="0" /><path - d="m 123.02,36.516 c -0.221,-5.266 0.518,-13.7109 0.765,-19.2351 3.501,-0.0047 5.002,0.766 7.615,1.6472 0.295,6.5 -2.058,12.5137 -2.736,18.4489 -1.383,0.3691 -3.922,-0.975 -5.644,-0.861 z M 68.5059,66.4648 C 70.8145,45.2418 74.1582,27.4012 80.291,8.60781 93.9023,4.475 110.311,4.11484 122.342,7.84414 120.133,18.4512 121.098,31.3648 119.807,42.684 c -0.973,8.5078 -0.477,17.068 -1.811,25.748 -14.578,3.0328 -35.1835,0.709 -49.4901,-1.9672 z m 52.9371,1.834 c -0.123,-9.1148 0.408,-18.1058 1.104,-27.232 3.5,0.5254 5.875,0.8762 9.127,1.5891 -1.056,8.7859 -0.926,18.6722 -3.077,26.4441 -2.486,-0.0238 -4.675,0.0289 -7.154,-0.8012 z m 17.755,1.4692 c -1.661,0.3808 -3.595,0.0148 -5.182,-0.016 0.746,-7.4301 2.556,-15.629 3.193,-23.4282 2.497,-0.0777 3.831,1.1 5.885,1.4961 0.11,6.8461 -0.598,16.2781 -3.896,21.9481 z m 26.884,-24.5629 c 5.205,1.264 8.478,7.639 7.022,14.1859 -0.977,4.4 -2.717,12.6852 -4.579,15.5 -1.376,2.082 -5.107,4.8078 -8.086,2.9 -4.846,-3.1031 -13.383,-4.0039 -16.917,-7.7601 1.772,-5.9 2.322,-14.0039 3.053,-21.4797 6.054,-0.3774 13.503,1.666 18.538,-0.5024 -3.515,-1.1386 -8.076,-1.1476 -11.113,-2.807 2.482,-1.1988 8.293,-0.9566 12.082,-0.0367 z M 117.679,76.859 c -3.656,8.598 -6.976,17.5078 -12.435,24.436 C 99.9551,97.748 94.1309,94.4121 92.6445,87.9711 100.215,83.6879 109.041,79.4629 117.679,76.859 z m 9.012,26.625 c -0.346,-8.5988 -1.327,-19.8781 -3.619,-26.6172 5.467,6.9613 9.876,15.0672 14.484,22.9594 -1.964,3.1528 -6.07,5.9018 -10.865,3.6578 z m -10.216,3.63 c -2.071,0.223 -3.829,-2.381 -6.522,-1.255 -0.617,-0.682 -1.178,-1.421 -1.807,-2.087 5.948,-7.1681 8.651,-17.338 13.245,-25.7618 2.465,8.0918 2.181,16.957 2.724,25.7888 -3.387,-0.215 -5.266,3.063 -7.64,3.315 z m -6.569,8.67 c -0.221,-2.455 0.35,-3.258 0.844,-6.072 8.07,-2.523 6.661,11.076 -0.844,6.072 z m -8.949,2.938 c -3.4773,1.9 -8.7011,3.969 -13.1925,4.826 -5.5672,1.065 -5.0457,-7.594 -4.8094,-12.76 0.1855,-4.09 2.3125,-8.415 3.2363,-11.1321 0.4336,-1.2688 0.5313,-2.6149 1.616,-2.8668 1.9172,-0.4469 8.2414,2.082 10.0434,3.0648 3.8112,2.0781 6.7682,5.3781 10.0052,7.5941 0.042,1.078 0.083,2.155 0.126,3.233 -1.946,0.97 -4.195,1.658 -7.052,1.783 1.938,0.975 4.789,0.961 6.555,2.121 0.017,0.432 0.035,0.863 0.05,1.291 -3.224,0.248 -4.453,1.684 -6.578,2.846 z m -33.2136,6.033 c -2.886,-2.93 8.0945,-6.924 11.5906,-7.139 -0.0195,1.854 1.0566,3.602 0.8398,4.932 -4.1523,0.729 -9.6093,0.248 -12.4304,2.207 z m 35.5516,-1.376 c -0.014,-0.286 -0.387,-0.182 -0.448,-0.415 3.713,-2.902 6.471,-3.502 11.525,-3.252 2.279,1.654 4.3,3.588 6.673,5.137 -5.463,-0.488 -12.34,-3.881 -17.75,-1.47 z m 32.632,-9.895 c -0.156,3.255 -1.011,9.949 -3.023,11.121 -4.223,2.465 -11.73,-4.977 -14.91,-6.112 0.346,-0.996 0.917,-1.785 0.961,-3.058 1.881,0.463 4.171,0.146 5.801,-0.655 -1.885,-0.211 -3.975,-0.197 -5.222,-1.095 -0.457,-1.321 0.112,-3.121 -0.192,-4.955 4.474,-1.262 9.584,-1.934 15.24,-2.1 1.1,1.43 1.475,4.154 1.345,6.854 z m -73.0422,8.437 c -0.9063,0.646 -7.0371,8.623 -7.877,8.292 C 43.9141,125.838 33.541,118.273 24.2715,111.118 33.1094,92.1539 36.677,68.9199 37.3074,46.5262 47.4316,41.791 56.3242,34.9648 70.0625,34.252 68.4727,45.5 67.0215,55.5352 66.1191,66.125 c -3.4519,1.4551 -8.4043,-0.066 -11.6347,0.4512 -0.0274,3.8929 4.9336,1.7047 5.3468,4.3226 0.3114,1.9801 -2.7296,2.1301 -1.7394,5.2481 2.5254,-0.918 3.8516,-2.9457 6.5449,-3.7071 2.461,5.384 -0.0344,14.9102 0.3203,19.4102 0.0672,0.8449 0.4219,4.6809 2.3145,4.0078 1.675,-0.5957 -0.0957,-10.2019 0.0879,-14.4609 0.1672,-3.9239 -0.4739,-7.7207 1.1152,-10.184 13.2754,1.807 26.7656,2.975 41.1294,3.3691 -3.16,1.3559 -6.914,2.6391 -11.0298,4.959 -2.2312,1.2578 -9.2644,3.875 -9.9082,5.9942 -1.0273,3.3769 2.6953,5.1757 3.332,8.0707 -6.7011,-3.6547 -8.0085,3.5031 -9.5937,8.5741 -1.4363,4.593 -2.2539,8.024 -2.6063,10.673 -5.7726,2.752 -11.9445,5.539 -16.9132,9.068 z m 67.1792,7.327 c 9.243,4.482 10.909,-16.751 7.286,-23.591 0.56,-2.04 2.486,-2.821 3.272,-4.655 -5.158,-9.2399 -10.887,-17.8649 -16.15,-26.9961 3.915,2.4371 9.507,0.4359 14.114,2.2601 1.684,0.666 2.903,4.5211 4.178,7.6051 3.507,8.4848 7.189,19.1819 8.827,27.2789 0.37,1.845 1.378,5.865 1.152,7.507 -0.403,2.94 -4.392,5.12 -6.421,6.938 -3.738,3.358 -6.092,6.313 -9.991,9.453 -1.581,-2.334 -4.974,-3.902 -6.267,-5.8 z m -88.3179,81.968 c -4.4043,-4.846 -3.4824,-13.926 -2.9492,-20.386 7.9609,5.008 18.5273,-0.396 18.4277,-8.914 3.8008,0.101 1.4199,4.747 0.7324,7.74 -2.2468,9.776 3.7852,20.397 0.2735,29.337 -6.8184,-0.517 -12.42,-3.302 -16.4844,-7.777 z m 31.5137,28.126 c -9.9707,-2.826 -22.7493,-10.071 -26.8465,-19.028 3.1726,0.461 5.375,2.061 8.5047,2.259 1.1828,0.077 2.7324,-0.496 4.0918,-0.158 2.709,0.672 4.9953,6.746 7.039,9.006 1.9922,2.207 4.3867,3.15 6.0254,5.162 1.0528,0.508 2.6094,0.473 2.6692,2.054 -0.4563,0.488 -0.9368,0.86 -1.4836,0.705 z m 51.9032,-2.658 c -10.349,5.839 -27.8661,10.231 -38.8747,4.743 -8.8828,-4.429 -20.8899,-11.757 -24.9836,-21.043 3.8242,-8.961 -1.1328,-17.172 -1.4492,-26.27 -0.168,-4.841 2.2793,-9.067 2.4668,-14.337 -1.3086,-2.159 -5.3067,-2.425 -8.0743,-2.277 -0.9316,4.662 -2.5625,9.902 -7.3632,10.428 -6.793,0.743 -11.7598,-4.879 -12.0684,-10.754 -0.3652,-6.909 5.3066,-18.36 13.3457,-17.565 3.1055,0.307 3.8684,3.42 7.252,3.388 1.8339,-3.659 -2.8289,-4.808 -3.3086,-7.425 -0.125,-0.676 0.3867,-3.318 0.6843,-4.557 1.4602,-6.033 4.7153,-13.841 7.9192,-18.434 4.0664,-5.826 12.0555,-6.704 20.6504,-7.275 1.5351,3.307 7.1902,3.035 10.875,2.17 -4.416,1.749 -8.5215,5.989 -11.9239,9.742 -3.9082,4.306 -7.8671,8.925 -8.0671,14.553 7.3855,-10.246 13.4871,-19.194 26.9168,-23.701 10.1618,-3.408 22.0298,1.562 29.8378,7.045 3.24,2.279 5.174,5.895 7.477,9.205 8.617,12.395 12.638,30.087 11.754,47.235 -0.364,7.072 -0.348,14.12 -2.721,18.878 -2.48,4.975 -10.868,9.426 -15.778,4.926 -0.91,4.838 4.083,7.83 9.948,6.089 -4.182,5.397 -8.571,11.882 -14.515,15.236 z M 144.444,77.1168 c 8.087,4.0203 23.197,10.8211 28.267,-0.0148 1.871,-3.9942 4.066,-10.7461 5.035,-14.8692 1.369,-5.8168 -1.484,-18.043 -7.463,-19.9949 -5.281,-1.7238 -11.443,-1.6188 -17.804,-0.341 -0.749,0.623 -1.583,1.709 -2.166,2.841 -4.542,0.1762 -8.795,-0.2438 -12.383,-2.1109 0.34,-3.359 -1.932,-3.8981 -4.062,-4.5899 -1.579,-6.2609 3.159,-14.4371 2.025,-20.1461 -0.809,-4.0672 -5.813,-4.6961 -9.491,-5.457 -0.12,-2.2602 0.161,-4.14689 0.412,-6.059 -0.841,-3.09883 -4.613,-4.86289 -8.187,-5.29492 -11.759,-1.414064 -29.6133,-2.049221 -40.9239,2.01797 -3.1562,7.74175 -5.6426,17.15785 -8.2715,25.99805 -11.0312,-1.1781 -19.9531,4.7598 -28.364,8.65 -2.9121,1.35 -6.9406,2.0937 -8.0285,4.4117 -1.0547,2.2442 -0.6231,6.5453 -0.8848,10.6082 -0.666,10.377 -1.2363,20.386 -3.9766,31.011 -1.2304,4.7679 -3.375,8.975 -4.8711,13.5691 -1.3828,4.2579 -3.7988,9.5199 -4.4289,13.7659 -0.9343,6.293 4.9914,6.643 8.7805,9.37 5.8574,4.217 10.4551,6.549 16.7988,10.355 1.8789,1.127 7.545,3.98 8.1895,5.294 1.2812,2.605 -2.1992,6.278 -3.1297,8.32 -1.4719,3.229 -2.2395,5.972 -2.4504,9.158 -5.3215,0.841 -9.3555,4.008 -11.7922,7.579 -4.0308,5.91 -6.8262,16.844 -3.3387,25.161 0.2735,0.655 1.6375,1.943 1.8387,2.949 0.3969,1.981 -0.7469,4.615 -0.818,6.722 -0.3664,10.81 1.829,20.124 9.1063,23.384 2.9543,11.769 13.5281,15.682 23.4902,21.531 3.7239,2.186 7.8289,3.583 12.0684,5.143 15.2082,5.597 38.5419,4.543 51.1639,-5.003 5.352,-4.048 13.907,-12.595 16.967,-18.783 8.082,-16.337 7.508,-43.64 1.855,-63.513 -0.76,-2.668 -1.862,-6.59 -3.401,-9.795 -1.073,-2.238 -4.408,-6.716 -4.003,-8.692 0.417,-2.043 7.604,-7.5 9.145,-8.986 2.775,-2.677 8.047,-6.23 8.474,-9.608 0.459,-3.595 -1.584,-8.513 -2.619,-11.982 -3.46,-11.5769 -6.836,-22.2781 -10.759,-32.5992" - style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path130" - inkscape:connector-curvature="0" /><path - d="m 90.491,157.255 c 0.4387,0.584 2.8508,1.471 6.2258,-0.154 0,0 -4,-0.667 -3.6672,-7.336 l -1.6668,0.334 c 0,0 -1.7226,6.047 -0.8918,7.156" - style="fill:#f7e4cd;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path132" - inkscape:connector-curvature="0" /><path - d="m 119.717,99.934 c 0,-1.0121 -0.821,-1.8328 -1.834,-1.8328 -1.012,0 -1.833,0.8207 -1.833,1.8328 0,1.012 0.821,1.834 1.833,1.834 1.013,0 1.834,-0.822 1.834,-1.834" - style="fill:#1d1919;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path134" - inkscape:connector-curvature="0" /><path - d="m 121.55,91.434 c 0,-1.0121 -0.821,-1.8328 -1.834,-1.8328 -1.012,0 -1.833,0.8207 -1.833,1.8328 0,1.0121 0.821,1.834 1.833,1.834 1.013,0 1.834,-0.8219 1.834,-1.834" - style="fill:#1d1919;fill-opacity:1;fill-rule:evenodd;stroke:none" - id="path136" - inkscape:connector-curvature="0" /></g></g></svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/juiceshop.png b/src/test/shell/data/apps/images/logo/juiceshop.png deleted file mode 100644 index 95b41ccd52aa5cae29af7279fb7b244ede9194f7..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/juiceshop.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/juniper.svg b/src/test/shell/data/apps/images/logo/juniper.svg deleted file mode 100644 index cb8a111bb7d46e2e56aa203d864e24ecde9b1a88..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/juniper.svg +++ /dev/null @@ -1 +0,0 @@ -<!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="180" width="360" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> <defs> <clipPath id="clipPath3095" clipPathUnits="userSpaceOnUse"> <path d="m44.936,724.66,116.15,0,0,31.739-116.15,0,0-31.739z"/> </clipPath> <clipPath id="clipPath3079" clipPathUnits="userSpaceOnUse"> <path d="m44.946,725,114.9,0,0,31.4-114.9,0,0-31.4z"/> </clipPath> <clipPath id="clipPath3037" clipPathUnits="userSpaceOnUse"> <path d="m44.936,724.66,116.15,0,0,31.739-116.15,0,0-31.739z"/> </clipPath> </defs> <metadata> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> <dc:title/> </cc:Work> </rdf:RDF> </metadata> <g transform="translate(69.285713,-19.505037)"> <g transform="matrix(2.2214693,0,0,2.2214693,-172.25428,-315.17789)"> <g transform="matrix(1.25,0,0,-1.25,119.25316,185.06493)"> <path d="m0,0,0.706,0,3.637-5.015,0,5.015,0.624,0,0-6.082-0.592,0-3.751,5.163,0-5.163h-0.624v6.082z" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="matrix(1.25,0,0,-1.25,127.40054,185.06493)"> <path d="m0,0,4.022,0,0-0.616-3.374,0,0-2.01,3.292,0,0-0.608-3.292,0,0-2.257,3.407,0,0-0.591h-4.055v6.082z" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="matrix(1.25,0,0,-1.25,136.50116,185.83455)"> <path d="m0,0-2.282,0,0,0.616,5.213,0,0-0.616-2.282,0,0-5.467h-0.649v5.467z" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="matrix(1.25,0,0,-1.25,141.14891,185.06493)"> <path d="M0,0,0.665,0,2.265-5.031,3.899,0,4.457,0,6.082-5.031,7.691,0,8.315,0,6.361-6.123h-0.557l-1.642,5.064-1.634-5.064h-0.566l-1.962,6.123z" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="matrix(1.25,0,0,-1.25,-7.3707143,1099.0408)"> <g clip-path="url(#clipPath3037)"> <g transform="translate(133.1884,728.1357)"> <path d="m0,0c0,1.642-0.763,2.528-2.422,2.528-1.65,0-2.405-0.886-2.405-2.528,0-1.65,0.755-2.537,2.405-2.537,1.659,0,2.422,0.887,2.422,2.537m-5.475,0.008c0,2.167,1.108,3.135,3.053,3.135,1.954,0,3.07-0.968,3.07-3.135,0-2.175-1.116-3.144-3.07-3.144-1.945,0-3.053,0.969-3.053,3.144" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="translate(137.7932,728.1683)"> <path d="m0,0c0.862,0,1.395,0.263,1.395,1.223,0,0.944-0.517,1.19-1.419,1.19h-1.979v-2.413h2.003zm-0.18-0.591-1.823,0,0-2.479-0.632,0,0,6.082,2.627,0c1.412,0,2.052-0.566,2.052-1.773,0-1.05-0.501-1.666-1.56-1.805l1.469-2.504h-0.689l-1.444,2.479z" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="translate(143.0629,728.3242)"> <path d="m0,0-1.215-1.329,0-1.897-0.632,0,0,6.082,0.632,0,0-3.357,3.078,3.357,0.747,0-2.183-2.388,2.479-3.694-0.731,0l-2.175,3.226z" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="translate(146.5105,725.714)"> <path d="m0,0,0.328,0.492c0.73-0.459,1.445-0.615,2.175-0.615,1.256,0,1.814,0.353,1.814,1.19,0,0.862-0.722,0.985-1.814,1.182-1.313,0.23-2.2,0.452-2.2,1.682,0,1.175,0.755,1.634,2.2,1.634,0.953,0,1.634-0.213,2.118-0.542l-0.345-0.525c-0.435,0.287-1.083,0.476-1.773,0.476-1.091,0-1.559-0.304-1.559-1.026,0-0.772,0.632-0.919,1.716-1.116,1.329-0.238,2.289-0.435,2.289-1.74,0-1.207-0.771-1.789-2.429-1.789-0.919,0-1.749,0.188-2.52,0.697" fill-rule="nonzero" fill="#61849c"/> </g> <g transform="translate(157.8189,756.3191)"> <path d="m0,0c-8.551,0-8.914-3.831-8.914-9.236v-13.269h2.016v13.269c0,4.074-0.161,7.341,6.898,7.341,0.756,0,1.427-0.04,2.031-0.111v1.921c-0.623,0.055-1.295,0.085-2.031,0.085" fill-rule="nonzero" fill="#231f20"/> </g> <g transform="translate(58.0874,742.4452)"> <path d="m0,0,0,13.431,2.057,0,0-13.471c0-3.872-0.04-7.139,7.058-7.139,7.058,0,6.897,3.267,6.897,7.341v13.269h2.017v-13.269c0-5.405-0.364-9.237-8.914-9.237-8.591,0-9.115,3.832-9.115,9.075" fill-rule="nonzero" fill="#231f20"/> </g> <g transform="translate(97.5568,747.2451)"> <path d="m0,0,0-13.431-2.057,0,0,13.471c0,3.872,0.04,7.139-7.058,7.139-7.059,0-6.897-3.267-6.897-7.341v-13.269h-2.016v13.269c0,5.405,0.363,9.236,8.913,9.236,8.591,0,9.115-3.831,9.115-9.074" fill-rule="nonzero" fill="#231f20"/> </g> <path d="m101.3,755.84,1.974,0,0-22.021-1.974,0,0,22.021z" fill-rule="nonzero" fill="#231f20"/> <g transform="translate(117.3098,743.4458)"> <path d="m0,0c3.562,0,5.332,1.736,5.332,5.243,0,3.505-1.91,5.17-5.42,5.17h-8.277v-10.413h8.365zm-10.339,12.389,10.309,0c5.112,0,7.43-2.541,7.43-7.058,0-4.547-2.288-7.311-7.458-7.311h-8.307v-7.652h-1.974v22.021z" fill-rule="nonzero" fill="#231f20"/> </g> </g> </g> <g transform="matrix(1.25,0,0,-1.25,-7.3707143,1099.0408)"> <g clip-path="url(#clipPath3079)"> <g transform="translate(129.0252,746.3982)"> <path d="M0,0,15.003,0c-0.201,4.396-0.484,8.147-6.897,8.147-6.17,0-7.864-3.348-8.106-8.147m-2.017-1.493c0,6.493,1.856,11.495,10.165,11.495,8.59,0,8.872-5.767,8.832-11.857h-17.02c0.04-5.365,1.37-9.358,8.348-9.358,3.711,0,5.405,1.009,7.22,2.339l1.128-1.492c-2.016-1.492-4.395-2.662-8.348-2.662-8.711,0-10.325,5.042-10.325,11.535" fill-rule="nonzero" fill="#231f20"/> </g> <g transform="translate(45.7034,729.0357)"> <path d="m0,0c8.55,0,8.914,3.831,8.914,9.236v17.604h-2.017v-17.604c0-4.073,0.161-7.341-6.897-7.341-0.267,0-0.52,0.007-0.767,0.017v-1.902c0.248-0.006,0.503-0.01,0.767-0.01" fill-rule="nonzero" fill="#231f20"/> </g> </g> </g> <g transform="matrix(1.25,0,0,-1.25,-7.3707143,1099.0408)"> <g clip-path="url(#clipPath3095)"> <g transform="translate(155.336,736.3229)"> <path d="m0,0c-0.669,0-1.213-0.544-1.213-1.212s0.544-1.212,1.213-1.212c0.667,0,1.211,0.544,1.211,1.212s-0.544,1.212-1.211,1.212m0-2.604c-0.768,0-1.393,0.624-1.393,1.392,0,0.767,0.625,1.392,1.393,1.392s1.391-0.625,1.391-1.392c0-0.768-0.623-1.392-1.391-1.392" fill-rule="nonzero" fill="#231f20"/> </g> <g transform="translate(155.4754,735.1253)"> <path d="m0,0c0.218,0,0.344,0.063,0.344,0.297,0,0.231-0.122,0.284-0.351,0.284h-0.489v-0.581h0.496zm-0.05-0.2-0.446,0,0-0.615-0.213,0,0,1.599,0.712,0c0.405,0,0.561-0.166,0.561-0.482,0-0.258-0.11-0.436-0.386-0.487l0.361-0.63h-0.231l-0.358,0.615z" fill-rule="nonzero" fill="#231f20"/> </g> </g> </g> </g> </g> </svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/librebooking.png b/src/test/shell/data/apps/images/logo/librebooking.png deleted file mode 100644 index f15f5857f90b0a26d931ef05d1727ee2d9552b91..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/librebooking.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/librenms.svg b/src/test/shell/data/apps/images/logo/librenms.svg deleted file mode 100644 index 5b8916166c8668e72e4c1f9062339d673cc48c66..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/librenms.svg +++ /dev/null @@ -1,153 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.0" - width="176.79999pt" - height="176pt" - viewBox="0 0 176.79999 176" - preserveAspectRatio="xMidYMid meet" - id="svg3823" - sodipodi:docname="librenms.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)"> - <defs - id="defs3827" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview3825" - showgrid="false" - inkscape:zoom="3.18" - inkscape:cx="255.33333" - inkscape:cy="113.33332" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg3823" /> - <metadata - id="metadata3771"> -Created by potrace 1.14, written by Peter Selinger 2001-2017 -<rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> -</rdf:RDF> -</metadata> - <g - transform="matrix(0.1,0,0,-0.1,-8.5,191)" - id="g3821" - style="fill:#000000;stroke:none"> - <path - d="m 772,1827 -82,-83 33,-32 33,-32 82,83 82,83 -33,32 -33,32 z" - id="path3773" - inkscape:connector-curvature="0" /> - <path - d="m 1021,1884 c -12,-15 -21,-32 -21,-38 0,-6 38,-48 83,-93 l 84,-83 26,28 c 15,16 27,32 27,37 0,9 -164,175 -173,175 -3,0 -15,-12 -26,-26 z" - id="path3775" - inkscape:connector-curvature="0" /> - <path - d="m 471,1526 -82,-83 31,-33 31,-34 84,85 84,84 -33,32 -33,31 z" - id="path3777" - inkscape:connector-curvature="0" /> - <path - d="m 721,1580 c -37,-38 -43,-27 74,-141 l 70,-68 27,26 c 16,15 28,32 28,37 0,6 -38,48 -84,94 l -83,83 z" - id="path3779" - inkscape:connector-curvature="0" /> - <path - d="m 1087,1522 c -43,-43 -77,-82 -77,-88 0,-6 13,-22 28,-37 l 28,-27 44,46 c 25,24 60,60 79,78 37,37 37,59 -3,88 -23,16 -24,16 -99,-60 z" - id="path3781" - inkscape:connector-curvature="0" /> - <path - d="m 1327,1562 -27,-28 90,-89 90,-89 28,34 29,34 -83,83 c -45,46 -86,83 -91,83 -5,0 -21,-13 -36,-28 z" - id="path3783" - inkscape:connector-curvature="0" /> - <path - d="m 165,1220 -80,-80 33,-32 32,-33 80,80 c 44,44 80,82 80,86 0,9 -48,59 -57,59 -5,0 -44,-36 -88,-80 z" - id="path3785" - inkscape:connector-curvature="0" /> - <path - d="m 415,1270 -28,-29 87,-87 88,-86 32,31 33,32 -83,84 c -45,47 -86,85 -91,85 -5,0 -22,-13 -38,-30 z" - id="path3787" - inkscape:connector-curvature="0" /> - <path - d="m 777,1212 -78,-79 31,-33 31,-33 80,79 c 43,43 79,84 79,91 0,11 -46,53 -59,53 -4,0 -42,-35 -84,-78 z" - id="path3789" - inkscape:connector-curvature="0" /> - <path - d="m 1027,1262 -27,-29 86,-87 c 92,-93 91,-93 136,-41 16,19 14,23 -65,103 -45,45 -86,82 -92,82 -6,0 -23,-13 -38,-28 z" - id="path3791" - inkscape:connector-curvature="0" /> - <path - d="m 1392,1206 -81,-83 33,-32 33,-32 77,76 c 69,70 92,105 67,105 -5,0 -12,9 -16,19 -12,38 -33,28 -113,-53 z" - id="path3793" - inkscape:connector-curvature="0" /> - <path - d="m 1640,1249 -22,-30 84,-84 83,-83 34,27 34,28 -85,87 c -47,47 -91,86 -96,86 -6,0 -20,-14 -32,-31 z" - id="path3795" - inkscape:connector-curvature="0" /> - <path - d="m 116,971 -28,-29 87,-88 87,-87 31,32 32,31 -85,85 c -47,47 -87,85 -90,85 -4,0 -19,-13 -34,-29 z" - id="path3797" - inkscape:connector-curvature="0" /> - <path - d="m 475,910 -79,-80 29,-30 c 16,-16 32,-30 36,-30 9,0 154,148 154,158 0,12 -42,62 -52,62 -5,0 -44,-36 -88,-80 z" - id="path3799" - inkscape:connector-curvature="0" /> - <path - d="m 732,967 c -12,-13 -22,-29 -22,-36 0,-7 36,-49 80,-93 81,-80 81,-80 103,-62 24,21 37,36 37,45 0,8 -161,169 -170,169 -3,0 -16,-10 -28,-23 z" - id="path3801" - inkscape:connector-curvature="0" /> - <path - d="m 1092,905 c -46,-46 -81,-89 -78,-94 4,-6 20,-19 35,-31 l 29,-20 76,75 c 42,41 76,79 76,83 0,4 -12,22 -27,40 l -28,32 z" - id="path3803" - inkscape:connector-curvature="0" /> - <path - d="m 1344,955 -31,-34 66,-68 c 109,-112 103,-109 141,-73 l 33,31 -89,89 -90,89 z" - id="path3805" - inkscape:connector-curvature="0" /> - <path - d="m 1707,893 c -42,-41 -77,-80 -77,-85 0,-10 46,-58 55,-58 15,0 168,161 159,168 -5,4 -20,17 -34,30 l -26,22 z" - id="path3807" - inkscape:connector-curvature="0" /> - <path - d="m 426,661 c -30,-31 -29,-36 12,-74 17,-16 54,-53 98,-98 l 35,-35 34,30 35,31 -87,87 c -48,49 -90,88 -93,88 -4,0 -19,-13 -34,-29 z" - id="path3809" - inkscape:connector-curvature="0" /> - <path - d="m 786,599 -78,-81 32,-33 31,-32 80,79 c 43,44 79,85 79,92 0,10 -52,57 -62,55 -2,0 -38,-36 -82,-80 z" - id="path3811" - inkscape:connector-curvature="0" /> - <path - d="m 1041,650 -35,-28 90,-90 90,-91 32,33 31,33 -63,64 c -34,35 -73,74 -87,86 l -24,22 z" - id="path3813" - inkscape:connector-curvature="0" /> - <path - d="m 1401,589 -80,-81 31,-34 32,-33 84,85 85,85 -32,30 c -18,16 -34,29 -36,29 -1,0 -39,-37 -84,-81 z" - id="path3815" - inkscape:connector-curvature="0" /> - <path - d="m 742,353 c -18,-13 -32,-28 -32,-32 0,-13 162,-171 176,-171 7,0 22,12 33,26 20,26 21,27 1,53 -10,14 -47,54 -83,88 l -63,61 z" - id="path3817" - inkscape:connector-curvature="0" /> - <path - d="m 1102,288 -82,-82 27,-28 c 15,-15 31,-28 37,-28 5,0 45,35 87,79 l 77,78 -28,32 c -16,17 -31,31 -33,31 -2,0 -41,-37 -85,-82 z" - id="path3819" - inkscape:connector-curvature="0" /> - </g> -</svg> diff --git a/src/test/shell/data/apps/images/logo/logo.png b/src/test/shell/data/apps/images/logo/logo.png deleted file mode 100644 index 50c9519edab9ea8b98f7e0af08861c9b86cc1409..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/logo.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/maildev.png b/src/test/shell/data/apps/images/logo/maildev.png deleted file mode 100644 index 060afd41b4ae05f664513fdc51a04a85565e6f4a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/maildev.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/nav.svg b/src/test/shell/data/apps/images/logo/nav.svg deleted file mode 100644 index 92a1c26b1ef9cad374829a4f29001b7ee7e4049c..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/nav.svg +++ /dev/null @@ -1,112 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="1000pt" - height="500pt" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.92.3 (2405546, 2018-03-11)" - sodipodi:docname="nav.svg" - inkscape:export-filename="C:\Documents and Settings\Morten\Desktop\navlogo-raster2.png" - inkscape:export-xdpi="178.09663" - inkscape:export-ydpi="178.09663" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true" - version="1.1"> - <defs - id="defs4" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.31074537" - inkscape:cx="207.36214" - inkscape:cy="-235.47812" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="-8" - fit-margin-top="10" - fit-margin-left="70" - fit-margin-right="70" - fit-margin-bottom="30" - inkscape:window-maximized="1" - showguides="true" - inkscape:guide-bbox="true"> - <sodipodi:guide - position="1087.7073,775.5546" - orientation="1,0" - id="guide3875" - inkscape:locked="false" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(75.298302,-5.0576117)"> - <path - sodipodi:nodetypes="cccc" - id="path2105" - d="M 225.77471,407.7685 53.129301,127.80529 l 172.628489,0.0694 z" - style="fill:#567899;fill-opacity:1;stroke-width:1.21210277" - inkscape:connector-curvature="0" /> - <path - sodipodi:nodetypes="cccc" - id="path2127" - d="M 53.111623,363.68322 193.47143,587.52341 53.234751,587.45408 Z" - style="fill:#2d5a86;fill-opacity:1;stroke-width:1.21210277" - inkscape:connector-curvature="0" /> - <path - style="fill:#567899;fill-opacity:1;stroke-width:1.21210277" - d="m 359.22227,127.82815 212.30827,-0.004 -151.2551,459.69934 H 359.0716 Z" - id="rect2129" - sodipodi:nodetypes="ccccc" - inkscape:connector-curvature="0" /> - <path - style="fill:#2d5a86;fill-opacity:1;stroke-width:1.21210277" - d="m 647.02638,263.75269 -49.95313,179.86256 h 100.01878 z m -81.00508,291.77705 -8.88805,31.97558 179.89879,-0.12491 -8.88806,-31.85067 z" - id="path2159" - inkscape:export-filename="C:\Documents and Settings\Morten\Desktop\navlogo-raster.png" - inkscape:export-xdpi="581.76361" - inkscape:export-ydpi="581.76361" - inkscape:connector-curvature="0" /> - <path - style="fill:#567899;fill-opacity:1;stroke-width:1.21210277" - d="m 726.32077,127.87464 136.81089,0.077 158.41564,459.44352 -144.01087,0.13235 z" - id="rect2138" - sodipodi:nodetypes="ccccc" - inkscape:connector-curvature="0" /> - <path - sodipodi:nodetypes="cccc" - id="path2141" - d="m 1217.4371,127.84669 -205.0281,0.0833 102.656,363.62064 z" - style="fill:#2d5a86;fill-opacity:1;stroke-width:1.21210277" - inkscape:connector-curvature="0" /> - </g> -</svg> diff --git a/src/test/shell/data/apps/images/logo/netbox.svg b/src/test/shell/data/apps/images/logo/netbox.svg deleted file mode 100644 index 5321be100eee2cfafdfc94a9bcfb08054b83c80d..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/netbox.svg +++ /dev/null @@ -1,21 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 320"> - <g fill="#9cc8f8" stroke="#9cc8f8"> - <circle cx="37" cy="284" r="23"/> - <circle cx="101" cy="37" r="23"/> - <circle cx="101" cy="220" r="23"/> - <circle cx="284" cy="220" r="23"/> - <rect x="93" y="37" width="16" height="180"/> - <rect x="101" y="212" width="180" height="16"/> - <rect x="93" y="212" width="16" height="90" transform="rotate(45 101 220)"/> - </g> - <g fill="#1685fc" stroke="#1685fc"> - <circle cx="284" cy="37" r="23"/> - <circle cx="37" cy="101" r="23"/> - <circle cx="220" cy="101" r="23"/> - <circle cx="220" cy="284" r="23"/> - <rect x="37" y="93" width="180" height="16"/> - <rect x="212" y="101" width="16" height="180"/> - <rect x="212" y="93" width="16" height="90" transform="rotate(225 220 101)"/> - <path transform="translate(380, 8)" d="M13.60 200L13.60 104L36.40 104L36.40 119.40L36.80 119.40Q40.20 112.20 47.20 106.90Q54.20 101.60 66.20 101.60L66.20 101.60Q75.80 101.60 82.50 104.80Q89.20 108 93.40 113.20Q97.60 118.40 99.40 125.20Q101.20 132 101.20 139.40L101.20 139.40L101.20 200L77.20 200L77.20 151.40Q77.20 147.40 76.80 142.50Q76.40 137.60 74.70 133.30Q73 129 69.40 126.10Q65.80 123.20 59.60 123.20L59.60 123.20Q53.60 123.20 49.50 125.20Q45.40 127.20 42.70 130.60Q40 134 38.80 138.40Q37.60 142.80 37.60 147.60L37.60 147.60L37.60 200L13.60 200ZM224.80 160.40L151.60 160.40Q152.80 171.20 160 177.20Q167.20 183.20 177.40 183.20L177.40 183.20Q186.40 183.20 192.50 179.50Q198.60 175.80 203.20 170.20L203.20 170.20L220.40 183.20Q212 193.60 201.60 198Q191.20 202.40 179.80 202.40L179.80 202.40Q169 202.40 159.40 198.80Q149.80 195.20 142.80 188.60Q135.80 182 131.70 172.70Q127.60 163.40 127.60 152L127.60 152Q127.60 140.60 131.70 131.30Q135.80 122 142.80 115.40Q149.80 108.80 159.40 105.20Q169 101.60 179.80 101.60L179.80 101.60Q189.80 101.60 198.10 105.10Q206.40 108.60 212.30 115.20Q218.20 121.80 221.50 131.50Q224.80 141.20 224.80 153.80L224.80 153.80L224.80 160.40ZM151.60 142.40L200.80 142.40Q200.60 131.80 194.20 125.70Q187.80 119.60 176.40 119.60L176.40 119.60Q165.60 119.60 159.30 125.80Q153 132 151.60 142.40L151.60 142.40ZM259.80 124.40L240.00 124.40L240.00 104L259.80 104L259.80 76.20L283.80 76.20L283.80 104L310.20 104L310.20 124.40L283.80 124.40L283.80 166.40Q283.80 173.60 286.50 177.80Q289.20 182 297.20 182L297.20 182Q300.40 182 304.20 181.30Q308 180.60 310.20 179L310.20 179L310.20 199.20Q306.40 201 300.90 201.70Q295.40 202.40 291.20 202.40L291.20 202.40Q281.60 202.40 275.50 200.30Q269.40 198.20 265.90 193.90Q262.40 189.60 261.10 183.20Q259.80 176.80 259.80 168.40L259.80 168.40L259.80 124.40ZM333.20 200L333.20 48.80L357.20 48.80L357.20 116.20L357.80 116.20Q359.60 113.80 362.40 111.30Q365.20 108.80 369.20 106.60Q373.20 104.40 378.40 103Q383.60 101.60 390.40 101.60L390.40 101.60Q400.60 101.60 409.20 105.50Q417.80 109.40 423.90 116.20Q430 123 433.40 132.20Q436.80 141.40 436.80 152L436.80 152Q436.80 162.60 433.60 171.80Q430.40 181 424.20 187.80Q418 194.60 409.20 198.50Q400.40 202.40 389.40 202.40L389.40 202.40Q379.20 202.40 370.40 198.40Q361.60 194.40 356.40 185.60L356.40 185.60L356 185.60L356 200L333.20 200ZM412.80 152L412.80 152Q412.80 146.40 410.90 141.20Q409 136 405.30 132Q401.60 128 396.40 125.60Q391.20 123.20 384.60 123.20L384.60 123.20Q378 123.20 372.80 125.60Q367.60 128 363.90 132Q360.20 136 358.30 141.20Q356.40 146.40 356.40 152L356.40 152Q356.40 157.60 358.30 162.80Q360.20 168 363.90 172Q367.60 176 372.80 178.40Q378 180.80 384.60 180.80L384.60 180.80Q391.20 180.80 396.40 178.40Q401.60 176 405.30 172Q409 168 410.90 162.80Q412.80 157.60 412.80 152ZM458.40 152L458.40 152Q458.40 140.60 462.50 131.30Q466.60 122 473.60 115.40Q480.60 108.80 490.20 105.20Q499.80 101.60 510.60 101.60L510.60 101.60Q521.40 101.60 531 105.20Q540.60 108.80 547.60 115.40Q554.60 122 558.70 131.30Q562.80 140.60 562.80 152L562.80 152Q562.80 163.40 558.70 172.70Q554.60 182 547.60 188.60Q540.60 195.20 531 198.80Q521.40 202.40 510.60 202.40L510.60 202.40Q499.80 202.40 490.20 198.80Q480.60 195.20 473.60 188.60Q466.60 182 462.50 172.70Q458.40 163.40 458.40 152ZM482.40 152L482.40 152Q482.40 157.60 484.30 162.80Q486.20 168 489.90 172Q493.60 176 498.80 178.40Q504 180.80 510.60 180.80L510.60 180.80Q517.20 180.80 522.40 178.40Q527.60 176 531.30 172Q535 168 536.90 162.80Q538.80 157.60 538.80 152L538.80 152Q538.80 146.40 536.90 141.20Q535 136 531.30 132Q527.60 128 522.40 125.60Q517.20 123.20 510.60 123.20L510.60 123.20Q504 123.20 498.80 125.60Q493.60 128 489.90 132Q486.20 136 484.30 141.20Q482.40 146.40 482.40 152ZM575.40 200L614 148.40L580.80 104L610 104L629.20 132.80L650 104L677.40 104L644.60 148.40L683.20 200L654 200L629 165.60L603.80 200L575.40 200Z"/> - </g> -</svg> diff --git a/src/test/shell/data/apps/images/logo/open-nti.svg b/src/test/shell/data/apps/images/logo/open-nti.svg deleted file mode 100644 index efbe760b88d4857f3f581281db3a62114c03b076..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/open-nti.svg +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - id="Layer_1" - x="0px" - y="0px" - width="396.87555" - height="177.98422" - viewBox="0 0 396.87555 177.98422" - enable-background="new 0 0 400 400" - xml:space="preserve" - sodipodi:docname="open-nti.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata - id="metadata24"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs - id="defs22" /><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview20" - showgrid="false" - inkscape:zoom="2.12" - inkscape:cx="182.5773" - inkscape:cy="90.880918" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="Layer_1" /> <image - id="image0" - width="400" - height="400" - x="-2.508708" - y="-112.85967" - href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAAAAACl1GkQAAAABGdBTUEAALGPC/xhBQAAACBjSFJN AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElN RQfiDAoSJzmnd1A/AAANE0lEQVR42u2d33mrOB6GNfvsPXRgtgJzKjBTQdgKzKkgTAWHU0GYCkwq iFNBSAVRKgipILiC7EWQ+CdAODZ8z+z33iCLH5LgDRYI4fzxKQgS/1q7AaQNhYBBIWBQCBgUAgaF gEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBB IWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFg UAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAI GBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgU AgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIG hYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWA QSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEhYFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBgUAgaFgEEh YFAIGBQCBoWAQSFgUAgYFAIGhYBBIWBQCBj/Pm8zWeZC5EJ4nvA83117L/5B/PE5e5PieHxu52yC MFx7R+ZxPBZCCOH5kTsUUqZ58e74XuJVGTK2Lt7NVLFZ+iqE2ISp9bafMzlsjcU4+7e5Ja1IvQ/O 01DMXRVxozJuZgi/Uxs5VcaLbdNm9iGZ9/PVuOJ0/5+omFfWehzrfTiFciCo7CxFPqMGHXvqljLF LCHS//k+vPbeT889QgsjG+lTaLvVyTZQzDj+PeYISX+8jq4//RWe35DVeE/WbkGLGUKivyZDHoNy 7R2aT1rYxW3twoQQQvhnt8b+sje6b37a+L4IRFGIXDZP5dcgd799hBbmlGRWceGrVZgQQojo7NZY C2n62MShV3+SWVY7eY2O3zw+y3Ovr2xHSXpXLXGlaB91VnznzszyauxQb+Ecuis/bhsF/lr7mnaa X51jsB8L2g2Xs5veZVXFk23bLPsQ+VMnd0X370G46ctGf/gtz//rWBh1k3Cfr92SGkshkU7tjZ2E L+suL157n6zRe5Ws3ZIaOyGZ7s/2mTnCzbWR53ztnbLF3eM12U5IohK7bHDnMqcXDY9uabx2SzRW QjJ1f+4ch4N8vVPPcu29ssVTp8hrtnZTFFZCEpVI3bEo3bHD7N0Eeb1nyfmlXBab+xCpTpBNNBqX qEuxY9rKLwohPK/+eJSFPImd8IPAnai6yKUU8iS2rusHwUBQKYUQQaP8vHwWju/6oT+1a96+ur16 z6Kp2IWwuDTWdxmHiUDdi7z0N99Wn552zdrHB+07Q/0DQ/xf4+TOm6H8jbnFjVuMN134B8Z9iI0Q 9VXkTAVqc60W7hrmX1o6xnfmsBE9TEp2jYJ65W9fxoV87ocagntjqL+xwqlIHSAHApIfz92s3wPj kUVgGuq/949jDUh75b8G2XibU3Vap6VAwEJIrhLhVGTQ26RFGf425D4bjUj/2VjG6b/ZYPWlaTz6 9PM42mY3VoHp9KFYAJszRCWCyVB1Dp9Kw8oyeDRu9Boa6gwGHwf9zAZWlMG9MX/iSWasTpHf43EL MUPI1p0M9bvbNIsJGsPXre7hOenHah+b28PT09Pdvt7iZ26suwwGhsdP8Wib9SkCcuk73c2oyJvp UD0mfOh3ffoSbPfw9vn5+XbXkNLpqj/0qsZl0oPO7FwQdfpx5/bl8/Pz49DI7vaonf56Y2wGbKcu VcKftuupRNFfV/3N37zloSeE8GKpL3C6f5uJ6s73MtKZoY4f/ba/KVJfCOFG+Z3Oy8ZbrWuPp/fw 6kwLKVXCny7NmwpwHo46xs20kfuiGST/rhJ7Pb2pHT98QeQcjnqTWJ+v94PxQgghInWKPOb2B+5a TAsp9AGZLs1TiYE9c/Kw+THTU53SZnZSLW+yzuZpdeRO3RV1+VHjU6SFDzRHt6Nb84pcVsgETu63 M/RNwLFZYXUx5mTd7V2V01tjLj9RCTnerkB1BgDD8DNmnfgWMc7oyq4P4UVV4l3Wmalaur0SguoU eS2syteDuflEsxOViO0Px5W48Ox3f2Rd30fjAOR13rEKDw1lRP3wmn75QbUsJ5qtT5H1h+EXfB0h 8/t5nho+zHWWGqkJXUMZgQoyrDv4g+GTE3gylUiWOx5mFhQSmjKDalnonLyzxhguDeuifpZn2zb9 5faeLndAjFxYSDl3g6Ba1n/DsrPmW/XsLOMaT6pm78JlubCQGZP7vvBVolAJWS09Y/z2zHqm8NSN +dpjjDPeoJL+jP2bHViolDrW+bIHIk6roYQ0dpetuc0MIeWMYj3rSGdoWPfPZQ+EG1fPBk5JumzN baa/srwZpeXzG+B/v4jLEKsBlL+LtZogxCwh+Yxig9kNmVP6VXATlUrOL+T7zOjUy+mQXO/dlZu9 +X4RPfQYY3uoc2GmhQQqIadL0yH+7IZ4s6KTaxyLpJdYAYtOfVPdOsvpUBUy52WjCq9bazQSa7yL /zZRVj3Ht3xh5CpYCPEqISd9ZTpEoR4sBd9v2Bqv/iXqys7ynaprYNGHBCpxnIrUAb59A7qTS2Zs enH0GOOKvcgcIflUZKYSoXX9pUr41dJd7VCIxnOyZLUmzBHyWIwHSnWTvXOt65cqoTdxumsWxFdj jOu9U2Vz2asftGbjcalKRPb1qx2vRwH9almscTiSXmJpbISEKjE+2zJX89SMj5aGNqqWns7xO2sW xVPTk1d7mGslRH2LnJKxsFjHu8b1R0Neofr0QGcFI+HXJ1H7utaVr40QN1Spv/PhqFgPiSfmgEj2 8zKVCEQ39T5S1/XQ8xifizWqn/sGlRj+MZNMTaYSe88ccQpkN6tMq8S23sZVd5WJWAM91Tf9Tinn YyVEP+AUp6Awh2T6RXZncE/6RtQziNZlQFwtn49rHBA9xjjnx38uiN3gop4/JV793LC+jOsfFmjN NmzTNZLr1xOiRq7uskzfcdcnvsbApT12QvQMNSFOf0Zld3Xu6+8rsQ9Hyjm1Xp+ROnTvNiuLdbQ0 lFGmYSyuSXLV0iexnJS9b26zf2hOVW+9Cbj96G3anmhwo6eY15OhnbfWBvXkd/GrW9zDXojONPXd yJ6Y101MbG8PjS48+932EW4mG/MK7u/FzndFUEpRyNZ8g+3krzM9Pu5D3xO5TOs31jqXmG6mH9/+ TqMwUB+kzI9f3+yTw5zfIl346XEbW3MfNkPqhvOj/jsanGba/xu8a5e62+12u2b9T6byL3aGtM9p 0DNEuDK6n4q5GenQhcgHXlPbHntZsWzWdfE5P1OkP5ausWbGI9zsMDqVWjh39bsZJvzceP1i/JbL 7sZKcvzrHhT/9vtlnMuciXKR3I+s3Rfx1H5Kw0/f3ph7nfhp+OpzM3oiXoK08f0YXLmuDrNmLnrZ 2958lji3bxZHyT0+dDbfPAydVUFxMCvZHorw6oel/rEpm5HS6T2f8ZjHtrPRnfth3z1Qm9Zl8HjH +nHbULI9jNf10NW/2R/e+lFf7bk1lfB1njmddW9fZ6rxVx4Uh50jhBA3Y73x05e2+kq+z9errc7e +vie8dvvQhRFLopCCCE8z/WnfvExqEZ0VU15/vVrNL7vTVclC1nK6ZrGroPN6y515Vy6kxGznoKe JWQeXSFkDP7/EDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAWEOJ+Lc547/D/kQWG 38tciqu9qPmPYwEhZA7sQ8CgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwK AYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGD QsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LA oBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQ MCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAo BAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQM CgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoB g0LAoBAwKAQMCgGDQsCgEDAoBAwKAYNCwKAQMCgEDAoBg0LAoBAwKAQMCgGDQsCgEDAoBAwKAeN/ gtH2pmU1y3wAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMTItMTFUMDE6Mzk6NTctMDc6MDCFj2Gq AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE4LTEyLTExVDAxOjM5OjU3LTA3OjAw9NLZFgAAAABJRU5E rkJggg==" /> -<flowRoot - xml:space="preserve" - id="flowRoot26" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - transform="translate(-2.5087081,-112.85967)"><flowRegion - id="flowRegion28" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;font-family:Arial;-inkscape-font-specification:Arial"><rect - id="rect30" - width="379.71698" - height="206.13208" - x="7.5471697" - y="92.452827" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;font-family:Arial;-inkscape-font-specification:Arial" /></flowRegion><flowPara - id="flowPara32"></flowPara></flowRoot><flowRoot - xml:space="preserve" - id="flowRoot50" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - transform="matrix(1.0215088,0,0,1.6404098,-5.1443619,-179.42238)"><flowRegion - id="flowRegion52"><rect - id="rect54" - width="384.90567" - height="192.92453" - x="8.0188675" - y="106.13207" /></flowRegion><flowPara - id="flowPara56" - style="font-size:86.66665649px">OpenNTI</flowPara></flowRoot></svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/oxidized.svg b/src/test/shell/data/apps/images/logo/oxidized.svg deleted file mode 100644 index 14070779101810ea0961dadf57f2058be37d9817..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/oxidized.svg +++ /dev/null @@ -1,93 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="350.0007" - height="350.00003" - id="svg24159" - sodipodi:version="0.32" - inkscape:version="0.92.3 (2405546, 2018-03-11)" - version="1.0" - sodipodi:docname="oxidized.svg"> - <defs - id="defs24161" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.35" - inkscape:cx="390.00033" - inkscape:cy="204.69149" - inkscape:document-units="px" - inkscape:current-layer="layer1" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="-8" - showgrid="false" - inkscape:window-maximized="1" /> - <metadata - id="metadata24164"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-24.999669,-24.999948)"> - <g - id="g24054" - transform="matrix(2.53805,0,0,2.538045,839.4215,667.5041)"> - <circle - transform="matrix(0.24219,0,0,0.24219,-358.8457,-306.2258)" - id="path3282" - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:46.13452911;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" - cx="441.43668" - cy="503.84937" - r="261.62952" /> - <g - id="g24048"> - <g - id="g650" - transform="matrix(0.603046,0,0,0.603046,-297.3391,-238.3623)"> - <path - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" - d="m 76.4375,16.5 c -2e-6,0 -7.13742,5.42072 -6.34375,14.8125 0.793684,9.391789 2.39771,7.28803 0.28125,12.84375 -4.89432,-5.555638 -9.9375,-5.96875 -9.9375,-5.96875 10e-7,2e-6 2.77184,4.0996 2.375,11.375 -0.396839,7.275393 -3.03125,12.3125 -3.03125,12.3125 L 56.875,62.28125 c 0,10e-7 -1.97427,-5.3125 -5.28125,-5.3125 C 53.710221,69.799872 45.88228,80.2573 45.75,80.125 c -0.132278,-0.132296 -3.69603,-0.66693 -5.8125,-3.3125 -0.66139,2.116395 -0.39345,4.75769 2.78125,8.59375 -1.058229,2.910077 -3.32115,17.74901 4.21875,29.125 0.520773,0.73173 1.211956,1.31499 1.90625,1.90625 -0.530917,-2.14 -0.90625,-4.35281 -0.90625,-6.65625 0,-15.28292 12.404567,-27.6875 27.6875,-27.6875 15.282931,-3e-6 27.6875,12.404577 27.6875,27.6875 0,1.70751 -0.20363,3.37767 -0.5,5 0.47408,-0.16195 2.20917,-0.62751 2.21875,-0.65625 0.1323,-0.26449 3.8198,-4.49101 3.6875,-8.0625 -0.1322,-3.57159 0.12415,-25.4127 1.84375,-27 1.7197,-1.587302 -2.91055,1.17805 -3.96875,0.78125 -1.0583,-0.396808 1.4641,-26.44388 -3.5625,-28.03125 0.1323,6.481702 -3.15625,11.90625 -3.15625,11.90625 -10e-7,2e-6 -1.585582,-12.42239 -3.4375,-18.375 -1.851903,-5.952609 -6.625,-8.59375 -6.625,-8.59375 2e-6,2e-6 1.06338,5.93575 -0.65625,9.375 -1.719628,3.439261 -1.19177,-5.29708 -2.25,-7.28125 -1.058242,-1.984178 -7.5428,-10.02949 -8.46875,-13.46875 -0.925946,-3.439249 -2,-8.875 -2,-8.875 z m 1.34375,40.71875 c -2e-6,-10e-7 1.01979,6.948608 1.625,8.5625 0.605206,1.613888 3.424827,7.473954 2.71875,10.5 -0.706074,3.026046 -5.545136,5.330214 -7.5625,1.09375 -2.017365,-4.236464 -2.329001,-15.919786 3.21875,-20.15625 z M 65.375,67.40625 c 1.109551,0.201732 4.816841,2.709018 4.3125,10.375 -1.10955,4.942542 -5.634895,3.831777 -5.9375,-1.3125 -0.302601,-2.219099 1.322396,-4.725168 1.625,-9.0625 z m 24.8125,7.75 C 92.608338,82.41876 90,81.812499 90,81.8125 c -3.732122,0 -2.031601,-4.235412 0.1875,-6.65625 z M 55.46875,78.6875 c 0.998544,0.78457 1.982458,4.673899 0.21875,4.53125 -2.26298,-0.142651 -1.259075,-4.11554 -0.21875,-4.53125 z M 98.25,79.59375 c 2.20897,2.379058 1.468225,7.347795 -0.09375,7.0625 -2.671516,0.219043 -1.586396,-5.817469 0.09375,-7.0625 z M 47.40625,91.6875 c 0.64192,0.855898 3.401833,5.93443 0.3125,5.75 -2.376087,-0.04178 -0.811772,-5.007211 -0.3125,-5.75 z m 57.1875,0.25 c 1.14119,0.07133 2.0589,3.894356 0.3125,3.78125 -1.60375,0.02954 -1.05528,-3.436864 -0.3125,-3.78125 z" - id="path649" - inkscape:connector-curvature="0" /> - <circle - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.20609999;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" - id="path582" - transform="matrix(1.013699,0,0,1.013699,-2.446365,-2.904882)" - cx="77.821404" - cy="111.3967" - r="27.312321" /> - </g> - <rect - style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:29.67200089;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.55294118;marker:none;marker-start:none;marker-mid:none;marker-end:none" - id="rect10816" - width="42.397057" - height="3.114413" - x="-273.13269" - y="-154.77139" /> - </g> - </g> - </g> -</svg> diff --git a/src/test/shell/data/apps/images/logo/perfsonar.png b/src/test/shell/data/apps/images/logo/perfsonar.png deleted file mode 100644 index d62e219d4d441ee6cd631ec4f3e5cb61b72bc51e..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/perfsonar.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/pmacct.svg b/src/test/shell/data/apps/images/logo/pmacct.svg deleted file mode 100644 index 29c8aab24fd6e70dfa0d728c75375f34022241ca..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/pmacct.svg +++ /dev/null @@ -1,110 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" - "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> -<svg version="1.0" xmlns="http://www.w3.org/2000/svg" - width="800.000000pt" height="400.000000pt" viewBox="0 0 400.000000 400.000000" - preserveAspectRatio="xMidYMid meet"> -<metadata> -Created by potrace 1.13, written by Peter Selinger 2001-2015 -</metadata> -<g transform="translate(0.000000,400.000000) scale(0.100000,-0.100000)" -fill="#000000" stroke="none"> -<path d="M2096 3985 c-3 -9 -18 -15 -40 -15 -19 0 -41 -7 -50 -15 -8 -8 -28 --15 -45 -15 -16 0 -33 -5 -36 -10 -4 -6 -23 -17 -42 -25 -42 -18 -225 -194 --248 -239 -8 -17 -20 -38 -24 -46 -32 -52 -51 -106 -51 -139 0 -22 -6 -44 -15 --51 -21 -17 -22 -266 -1 -295 8 -13 15 -60 18 -127 3 -59 9 -113 15 -120 6 -7 -13 -57 16 -111 3 -54 11 -105 18 -113 7 -8 13 -59 16 -126 3 -75 9 -118 19 --132 10 -14 14 -48 14 -112 0 -69 4 -95 15 -104 12 -10 15 -37 15 -119 0 -79 -4 -112 15 -127 10 -13 14 -46 15 -110 0 -63 4 -96 15 -110 10 -13 14 -46 15 --114 0 -64 5 -104 15 -124 8 -15 15 -52 15 -81 0 -40 4 -54 17 -59 24 -10 154 -5 178 19 11 7 58 13 105 14 54 1 93 7 107 17 16 10 53 14 125 14 75 1 108 5 -122 15 14 11 46 15 112 15 69 0 95 4 104 15 10 11 35 15 110 15 75 0 100 4 -110 15 10 12 36 15 117 15 115 0 159 15 170 58 8 33 -7 173 -22 196 -7 12 -13 -59 -14 111 -2 62 -7 95 -17 106 -10 11 -14 43 -14 120 -1 76 -5 109 -15 123 --11 14 -15 46 -15 112 0 69 -4 95 -15 104 -12 10 -15 37 -15 119 0 79 -4 112 --15 127 -10 13 -14 46 -15 110 0 63 -4 96 -15 110 -10 13 -14 46 -15 109 0 60 --5 97 -14 110 -8 13 -15 60 -18 128 -3 62 -10 113 -16 119 -7 7 -12 34 -12 61 -0 34 -6 57 -20 74 -11 14 -20 37 -20 52 0 14 -7 35 -15 45 -8 11 -15 26 -15 -33 0 8 -13 28 -30 46 -16 18 -30 38 -30 44 0 18 -118 136 -155 156 -16 9 -44 -23 -62 31 -17 9 -34 20 -38 26 -3 5 -16 10 -28 10 -12 0 -31 7 -41 15 -11 8 --33 15 -48 15 -16 0 -31 7 -34 15 -5 12 -30 15 -139 15 -109 0 -134 -3 -139 --15z m85 -114 c4 -1 10 -8 13 -17 8 -20 -11 -44 -34 -44 -10 0 -23 -7 -30 -15 --7 -8 -26 -15 -42 -15 -18 0 -45 -12 -68 -30 -21 -16 -44 -30 -52 -30 -19 0 --188 -173 -188 -192 0 -9 -7 -21 -15 -28 -8 -7 -15 -21 -15 -31 0 -20 -33 -59 --50 -59 -6 0 -10 29 -10 68 0 57 5 78 35 137 38 74 146 195 176 195 9 0 22 7 -29 15 7 8 24 15 39 15 14 0 38 8 53 18 23 15 105 22 159 13z m-241 -1576 c9 --11 32 -15 80 -15 50 0 69 -4 73 -14 4 -9 23 -16 49 -18 l43 -3 3 -85 c3 -83 -4 -86 39 -122 21 -21 45 -38 54 -38 9 0 22 -7 29 -15 8 -10 30 -15 65 -15 35 -0 57 5 65 15 7 8 19 15 28 15 21 0 62 40 62 61 0 9 7 22 15 29 8 7 15 34 17 -68 l3 57 153 3 c83 1 152 -1 153 -5 1 -5 2 -36 3 -71 1 -49 -2 -66 -16 -79 --11 -10 -18 -30 -18 -53 0 -24 -5 -40 -15 -44 -8 -3 -15 -16 -15 -30 0 -13 -7 --26 -15 -30 -8 -3 -15 -16 -15 -28 0 -28 -100 -128 -128 -128 -11 0 -22 -7 --26 -15 -3 -8 -17 -15 -31 -15 -14 0 -28 -7 -31 -15 -4 -10 -20 -15 -44 -15 --21 0 -43 -7 -50 -15 -9 -11 -34 -15 -95 -15 -61 0 -86 4 -95 15 -7 8 -29 15 --50 15 -24 0 -40 5 -44 15 -3 8 -17 15 -31 15 -14 0 -28 7 -31 15 -4 8 -15 15 --26 15 -28 0 -128 100 -128 128 0 12 -7 25 -15 28 -8 4 -15 17 -15 30 0 14 -7 -27 -15 30 -11 4 -15 21 -15 57 0 34 -6 57 -17 70 -25 27 -26 101 -2 123 12 11 -19 31 19 56 0 40 10 48 30 23z m407 -56 c7 -7 29 -15 50 -18 48 -8 54 -33 17 --72 -38 -40 -74 -38 -124 7 -45 40 -47 49 -23 76 18 20 63 24 80 7z"/> -<path d="M1055 1850 c-54 -55 -55 -57 -55 -114 0 -56 1 -59 57 -117 l56 -59 -72 0 c69 0 74 2 114 36 22 20 41 45 41 54 0 10 7 25 15 34 9 9 15 33 15 65 0 -47 -3 53 -54 105 l-54 56 -76 -2 -76 -2 -55 -56z"/> -<path d="M419 1754 c-49 -25 -109 -85 -109 -108 0 -8 -7 -19 -15 -26 -11 -9 --15 -35 -15 -105 0 -70 4 -96 15 -105 8 -7 15 -20 15 -29 0 -21 80 -101 102 --101 8 0 21 -7 28 -15 9 -11 35 -15 105 -15 70 0 96 4 105 15 7 8 20 15 28 15 -22 0 102 80 102 101 0 9 7 22 15 29 11 9 15 33 15 90 0 57 -4 81 -15 90 -8 7 --15 23 -15 37 0 13 -6 26 -14 29 -8 3 -17 16 -20 30 -4 14 -16 26 -30 30 -14 -3 -27 12 -30 20 -3 8 -16 14 -29 14 -14 0 -30 7 -37 15 -21 25 -145 19 -201 --11z"/> -<path d="M3498 1447 c-16 -13 -28 -26 -28 -30 0 -4 23 -7 52 -7 43 0 57 -5 80 --27 25 -23 28 -34 28 -86 0 -60 0 -60 -58 -119 l-59 -58 -76 0 -76 0 -71 70 -c-38 38 -70 78 -70 88 0 11 -7 25 -15 32 -8 7 -15 27 -15 45 0 47 -18 58 -87 -50 -32 -4 -62 -11 -68 -15 -5 -4 -38 -10 -73 -13 -35 -3 -65 -7 -67 -9 -6 -6 -20 -77 33 -90 7 -7 12 -20 12 -30 0 -10 7 -21 15 -24 8 -4 15 -16 15 -29 0 --28 163 -195 190 -195 10 0 23 -7 30 -15 7 -8 29 -15 50 -15 21 0 43 -7 50 --15 18 -21 152 -21 170 0 7 8 29 15 49 15 28 0 44 7 65 29 16 16 39 32 52 35 -13 4 24 13 24 20 0 8 16 33 35 56 35 42 35 42 35 141 l0 99 -41 45 c-23 25 --49 45 -59 45 -10 0 -23 7 -30 15 -18 22 -61 18 -92 -8z m-419 -133 c12 -15 -21 -37 21 -49 0 -31 -37 -75 -63 -75 -38 1 -67 34 -67 76 0 71 67 101 109 48z"/> -<path d="M1477 1333 c-4 -3 -7 -15 -7 -25 0 -11 -13 -23 -33 -31 -51 -22 -69 --45 -62 -79 12 -52 40 -71 105 -71 66 0 80 6 80 34 0 11 7 22 15 25 11 4 15 -21 15 58 0 42 -5 57 -23 74 -22 21 -76 30 -90 15z"/> -<path d="M2566 1325 c-15 -11 -48 -15 -125 -15 -89 -1 -110 -4 -128 -19 -24 --20 -30 -41 -13 -41 6 0 10 -17 10 -39 0 -22 6 -44 15 -51 8 -7 15 -19 15 -27 -0 -8 9 -26 20 -40 11 -14 20 -31 20 -37 0 -7 14 -25 30 -41 17 -16 30 -36 30 --45 0 -8 32 -47 70 -85 72 -71 150 -200 150 -249 0 -11 7 -30 15 -40 19 -26 -19 -80 0 -96 -9 -8 -15 -30 -15 -56 0 -34 -8 -54 -32 -88 -18 -25 -41 -56 -50 --69 -9 -13 -50 -40 -91 -60 -62 -31 -84 -37 -139 -37 -46 0 -69 4 -78 15 -7 8 --25 15 -41 15 -49 0 -138 111 -139 173 0 12 -7 31 -15 41 -19 25 -19 50 0 66 -8 7 15 27 15 46 0 27 12 45 70 104 l69 70 64 0 c61 0 66 -2 105 -40 40 -37 42 --42 42 -95 0 -41 3 -56 13 -53 7 3 13 29 15 70 3 65 2 67 -36 107 -21 23 -48 -41 -59 41 -11 0 -26 7 -33 15 -16 19 -90 20 -116 0 -10 -8 -31 -15 -46 -15 --41 0 -178 -124 -178 -161 0 -9 -7 -22 -15 -29 -12 -10 -15 -39 -15 -140 0 --101 3 -130 15 -140 8 -7 15 -20 15 -30 0 -10 7 -23 15 -30 8 -7 15 -19 15 --26 0 -17 68 -94 84 -94 6 0 33 -16 60 -35 29 -20 61 -35 78 -35 16 0 31 -7 -34 -15 9 -22 229 -22 238 0 3 8 16 15 29 15 14 0 30 7 37 15 7 8 21 15 31 15 -10 0 21 5 25 11 3 6 20 17 36 24 39 16 158 133 158 155 0 9 4 20 9 25 21 22 -61 108 61 133 0 15 7 36 15 46 21 28 21 284 0 312 -8 10 -15 33 -15 50 0 17 --9 43 -20 57 -11 14 -20 36 -20 49 0 12 -7 32 -15 42 -8 11 -15 27 -15 37 0 9 --7 22 -15 29 -8 7 -15 27 -15 45 0 18 -7 38 -15 45 -8 7 -15 29 -15 50 0 21 --7 43 -15 50 -10 8 -15 31 -15 66 l0 54 -82 0 c-57 -1 -89 -5 -102 -15z m-59 --97 c30 -28 31 -83 1 -115 -47 -51 -138 -12 -138 58 0 70 85 106 137 57z"/> -<path d="M2101 1266 c-8 -10 -44 -15 -124 -18 -62 -2 -121 -9 -132 -15 -11 -6 --29 -14 -39 -18 -15 -4 -17 -8 -8 -17 17 -17 15 -90 -3 -124 -8 -16 -15 -44 --15 -63 0 -29 -10 -44 -71 -103 l-71 -68 -63 0 c-35 0 -66 4 -69 8 -3 5 -45 -28 -93 52 -48 24 -103 57 -121 72 -18 15 -39 28 -46 28 -8 0 -19 7 -26 15 -7 -8 -20 15 -30 15 -10 0 -23 7 -30 15 -7 8 -23 15 -35 15 -12 0 -28 7 -35 15 -8 -9 -30 15 -60 15 -30 0 -52 6 -60 15 -16 19 -39 19 -64 0 -11 -8 -41 -15 -67 --15 -40 0 -51 -4 -72 -30 -14 -16 -30 -30 -36 -30 -6 0 -11 -5 -11 -11 0 -7 --8 -18 -17 -25 -10 -7 -13 -14 -7 -14 6 0 23 11 38 25 15 14 39 25 55 25 15 0 -36 7 47 15 24 18 64 18 88 0 11 -8 32 -15 47 -15 14 0 32 -7 39 -15 7 -8 18 --15 26 -15 7 0 26 -12 41 -26 15 -15 35 -29 44 -33 9 -3 67 -54 129 -113 62 --60 122 -108 132 -108 10 0 21 -7 24 -15 4 -8 16 -15 29 -15 12 0 28 -7 35 --15 7 -8 27 -15 45 -15 18 0 38 -7 45 -15 17 -21 143 -21 160 0 7 8 29 15 50 -15 24 0 40 5 44 15 3 8 17 15 31 15 15 0 25 6 25 14 0 7 8 17 18 20 48 18 112 -70 112 93 0 8 13 26 29 41 15 15 31 39 35 55 3 15 11 27 16 27 6 0 10 11 10 -24 0 13 7 29 15 36 16 13 21 80 7 80 -5 0 -19 -11 -32 -25 -29 -31 -60 -32 --88 -2 -47 50 -13 137 53 137 33 0 85 -44 85 -72 0 -22 16 -24 24 -2 11 28 6 -140 -6 152 -16 16 -33 15 -47 -2z"/> -</g> -</svg> diff --git a/src/test/shell/data/apps/images/logo/routinator.svg b/src/test/shell/data/apps/images/logo/routinator.svg deleted file mode 100644 index c654d83f001f95705b27c2073e37b778b7f37bc2..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/routinator.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 284 284" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><g><path d="M283.465,142.267c0,78.277 -63.456,141.732 -141.733,141.732c-78.277,0 -141.732,-63.455 -141.732,-141.732c0,-78.276 63.455,-141.732 141.732,-141.732c78.277,0 141.733,63.456 141.733,141.732Z" style="fill:url(#_Radial1);"/><path d="M214.994,82.54c-3.604,3.605 -9.448,3.605 -13.052,0c-3.605,-3.604 -3.605,-9.448 0,-13.053c3.604,-3.604 9.448,-3.604 13.052,0c3.605,3.605 3.605,9.449 0,13.053Zm14.52,-28.522c-18.298,2.446 -35.572,10.416 -49.191,24.035c-4.323,4.323 -9.525,10.464 -14.708,17.434l-10.463,0.742c-0.878,0.063 -1.75,0.005 -2.597,-0.164c1.943,-3.044 3.319,-6.353 4.125,-9.78c0.137,-0.579 -0.023,-1.168 -0.424,-1.569c-0.4,-0.401 -0.989,-0.561 -1.568,-0.425c-5.568,1.31 -10.827,4.117 -15.141,8.431c-3.108,3.109 -7.535,8.808 -10.644,14.222c-0.394,0.683 -0.271,1.55 0.151,2.387c-0.686,1.045 -1.17,2.186 -1.448,3.37c-0.046,0.193 0.007,0.389 0.141,0.523c0.134,0.133 0.329,0.187 0.523,0.142c1.183,-0.279 2.325,-0.763 3.37,-1.449c0.837,0.421 1.704,0.544 2.388,0.151c2.989,-1.717 6.063,-3.835 8.742,-5.911c0.984,-0.45 2.023,-0.833 3.092,-1.161l11.114,2.977c-2.196,3.422 -4.283,6.899 -6.183,10.341c-1.029,1.867 -0.671,4.268 0.508,6.639c-2.392,2.956 -4.94,6.558 -6.942,10.044c-0.394,0.684 -0.271,1.552 0.15,2.388c-0.686,1.045 -1.169,2.186 -1.448,3.37c-0.045,0.193 0.008,0.389 0.141,0.523c0.134,0.133 0.33,0.187 0.523,0.141c1.184,-0.278 2.325,-0.762 3.37,-1.447c0.837,0.42 1.704,0.543 2.388,0.15c3.487,-2.003 7.088,-4.551 10.044,-6.942c2.372,1.179 4.773,1.538 6.64,0.507c3.443,-1.898 6.919,-3.987 10.341,-6.182l2.978,11.114c-0.328,1.068 -0.711,2.107 -1.16,3.09c-2.077,2.679 -4.196,5.754 -5.913,8.744c-0.392,0.684 -0.27,1.551 0.151,2.388c-0.686,1.045 -1.169,2.186 -1.448,3.37c-0.046,0.193 0.007,0.389 0.141,0.523c0.134,0.134 0.33,0.187 0.523,0.141c1.184,-0.278 2.325,-0.762 3.371,-1.448c0.835,0.421 1.703,0.544 2.386,0.151c5.414,-3.109 11.114,-7.536 14.222,-10.644c4.313,-4.314 7.121,-9.572 8.432,-15.139c0.135,-0.579 -0.024,-1.168 -0.424,-1.569c-0.402,-0.401 -0.99,-0.562 -1.57,-0.425c-3.426,0.806 -6.735,2.182 -9.78,4.125c-0.169,-0.846 -0.226,-1.719 -0.164,-2.596l0.742,-10.465c6.97,-5.182 13.111,-10.384 17.434,-14.707c13.618,-13.618 21.589,-30.893 24.034,-49.189c0.035,-0.262 -0.054,-0.524 -0.24,-0.71c-0.186,-0.186 -0.448,-0.275 -0.709,-0.241Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M204.117,71.663c-2.403,2.403 -2.403,6.299 0,8.702c2.403,2.403 6.299,2.403 8.702,0c2.403,-2.403 2.403,-6.299 0,-8.702c-2.403,-2.403 -6.299,-2.403 -8.702,0Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M200.246,116.105c10.543,23.621 6.206,52.325 -13.147,71.678c-10.746,10.746 -24.992,17.35 -40.114,18.598c-5.028,0.414 -9.962,-1.398 -13.536,-4.972c-0.529,-0.53 -1.028,-1.098 -1.484,-1.693c-3.568,-4.649 -4.52,-10.719 -2.548,-16.235c5.607,-15.686 15.052,-30.084 21.517,-38.864c-1.024,0.393 -2.108,0.607 -3.239,0.473c-0.918,0.423 -1.878,0.752 -2.871,0.986c-1.818,0.428 -3.689,-0.101 -5.004,-1.416c-1.313,-1.313 -1.842,-3.183 -1.415,-5.001c0.234,-0.994 0.563,-1.955 0.985,-2.875c-0.175,-1.471 0.099,-2.912 0.821,-4.169c0.054,-0.096 0.128,-0.199 0.184,-0.295c-8.642,6.458 -23.529,16.418 -39.876,22.262c-5.527,1.976 -11.599,1.028 -16.243,-2.535c-0.593,-0.456 -1.162,-0.954 -1.69,-1.481c-3.572,-3.573 -5.384,-8.512 -4.968,-13.551c1.248,-15.123 7.853,-29.369 18.598,-40.114c19.528,-19.528 48.575,-23.763 72.314,-12.853c1.097,-1.324 2.174,-2.587 3.238,-3.796c-9.09,-4.411 -19.254,-6.956 -30.036,-6.956c-38.092,0 -68.972,30.879 -68.972,68.971c0,38.093 30.88,68.973 68.972,68.973c38.092,0 68.972,-30.88 68.972,-68.973c0,-10.53 -2.429,-20.471 -6.649,-29.399c-1.214,1.064 -2.481,2.141 -3.809,3.237Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M214.994,82.54c-3.604,3.605 -9.448,3.605 -13.052,0c-3.605,-3.604 -3.605,-9.448 0,-13.053c3.604,-3.604 9.448,-3.604 13.052,0c3.605,3.605 3.605,9.449 0,13.053Zm14.52,-28.522c-18.298,2.446 -35.572,10.416 -49.191,24.035c-4.323,4.323 -9.525,10.464 -14.708,17.434l-10.463,0.742c-0.878,0.063 -1.75,0.005 -2.597,-0.164c1.943,-3.044 3.319,-6.353 4.125,-9.78c0.137,-0.579 -0.023,-1.168 -0.424,-1.569c-0.4,-0.401 -0.989,-0.561 -1.568,-0.425c-5.568,1.31 -10.827,4.117 -15.141,8.431c-3.108,3.109 -7.535,8.808 -10.644,14.222c-0.394,0.683 -0.271,1.55 0.151,2.387c-0.686,1.045 -1.17,2.186 -1.448,3.37c-0.046,0.193 0.007,0.389 0.141,0.523c0.134,0.133 0.329,0.187 0.523,0.142c1.183,-0.279 2.325,-0.763 3.37,-1.449c0.837,0.421 1.704,0.544 2.388,0.151c2.989,-1.717 6.063,-3.835 8.742,-5.911c0.984,-0.45 2.023,-0.833 3.092,-1.161l11.114,2.977c-2.196,3.422 -4.283,6.899 -6.183,10.341c-1.029,1.867 -0.671,4.268 0.508,6.639c-2.392,2.956 -4.94,6.558 -6.942,10.044c-0.394,0.684 -0.271,1.552 0.15,2.388c-0.686,1.045 -1.169,2.186 -1.448,3.37c-0.045,0.193 0.008,0.389 0.141,0.523c0.134,0.133 0.33,0.187 0.523,0.141c1.184,-0.278 2.325,-0.762 3.37,-1.447c0.837,0.42 1.704,0.543 2.388,0.15c3.487,-2.003 7.088,-4.551 10.044,-6.942c2.372,1.179 4.773,1.538 6.64,0.507c3.443,-1.898 6.919,-3.987 10.341,-6.182l2.978,11.114c-0.328,1.068 -0.711,2.107 -1.16,3.09c-2.077,2.679 -4.196,5.754 -5.913,8.744c-0.392,0.684 -0.27,1.551 0.151,2.388c-0.686,1.045 -1.169,2.186 -1.448,3.37c-0.046,0.193 0.007,0.389 0.141,0.523c0.134,0.134 0.33,0.187 0.523,0.141c1.184,-0.278 2.325,-0.762 3.371,-1.448c0.835,0.421 1.703,0.544 2.386,0.151c5.414,-3.109 11.114,-7.536 14.222,-10.644c4.313,-4.314 7.121,-9.572 8.432,-15.139c0.135,-0.579 -0.024,-1.168 -0.424,-1.569c-0.402,-0.401 -0.99,-0.562 -1.57,-0.425c-3.426,0.806 -6.735,2.182 -9.78,4.125c-0.169,-0.846 -0.226,-1.719 -0.164,-2.596l0.742,-10.465c6.97,-5.182 13.111,-10.384 17.434,-14.707c13.618,-13.618 21.589,-30.893 24.034,-49.189c0.035,-0.262 -0.054,-0.524 -0.24,-0.71c-0.186,-0.186 -0.448,-0.275 -0.709,-0.241Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M204.117,71.663c-2.403,2.403 -2.403,6.299 0,8.702c2.403,2.403 6.299,2.403 8.702,0c2.403,-2.403 2.403,-6.299 0,-8.702c-2.403,-2.403 -6.299,-2.403 -8.702,0Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M124.365,116.606c-0.007,-0.007 -0.011,-0.015 -0.018,-0.022c-0.007,-0.007 -0.016,-0.011 -0.023,-0.018c-0.594,-0.594 -1.004,-1.311 -1.26,-2.076c-6.582,6.723 -11.564,12.918 -15.248,18.625c5.707,-3.684 11.901,-8.665 18.625,-15.248c-0.765,-0.257 -1.482,-0.666 -2.076,-1.261Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M167.875,160.117c-0.007,-0.007 -0.011,-0.016 -0.017,-0.023c-0.008,-0.007 -0.016,-0.011 -0.024,-0.017c-0.594,-0.595 -1.004,-1.312 -1.26,-2.078c-6.583,6.724 -11.564,12.919 -15.248,18.626c5.706,-3.684 11.902,-8.666 18.625,-15.248c-0.765,-0.257 -1.482,-0.667 -2.076,-1.26Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M139.036,46.331c7.238,1.482 12.938,7.183 14.42,14.421c1.482,-7.238 7.183,-12.939 14.42,-14.421c-7.237,-1.482 -12.938,-7.182 -14.42,-14.42c-1.482,7.238 -7.182,12.938 -14.42,14.42Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M72.76,72.482c5.888,1.205 10.525,5.843 11.73,11.731c1.206,-5.888 5.843,-10.526 11.731,-11.731c-5.888,-1.205 -10.525,-5.843 -11.731,-11.73c-1.205,5.887 -5.842,10.525 -11.73,11.73Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M198.974,211.24c5.887,1.205 10.525,5.842 11.73,11.73c1.205,-5.888 5.843,-10.525 11.731,-11.73c-5.888,-1.206 -10.526,-5.843 -11.731,-11.731c-1.205,5.888 -5.843,10.525 -11.73,11.731Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M141.055,187.591c2.656,0.544 4.749,2.636 5.293,5.293c0.544,-2.657 2.636,-4.749 5.293,-5.293c-2.657,-0.544 -4.749,-2.637 -5.293,-5.293c-0.544,2.656 -2.637,4.749 -5.293,5.293Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M102.523,103.904c2.657,0.544 4.749,2.636 5.293,5.293c0.544,-2.657 2.636,-4.749 5.293,-5.293c-2.657,-0.544 -4.749,-2.637 -5.293,-5.293c-0.544,2.656 -2.636,4.749 -5.293,5.293Z" style="fill:#fff;fill-rule:nonzero;"/></g><defs><radialGradient id="_Radial1" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(228.054,1.30316,-1.30316,228.054,142.481,136.805)"><stop offset="0" style="stop-color:#203365;stop-opacity:1"/><stop offset="1" style="stop-color:#000121;stop-opacity:1"/></radialGradient></defs></svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/spa.png b/src/test/shell/data/apps/images/logo/spa.png deleted file mode 100644 index bd78c8a94a62d4729a11e3a7fe91a409ea2a60fa..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/spa.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/statping.png b/src/test/shell/data/apps/images/logo/statping.png deleted file mode 100644 index 5aa272e142dd97600531d24ddec845dfb93e2159..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/statping.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/synapse.png b/src/test/shell/data/apps/images/logo/synapse.png deleted file mode 100644 index 6aa3f184d4579e6f1f1c50755862cdfde6bd0a24..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/synapse.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/victoria-metrics.png b/src/test/shell/data/apps/images/logo/victoria-metrics.png deleted file mode 100644 index a9f60d28664daa73ac78c26518fb612e36ce30a7..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/victoria-metrics.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/webdav.svg b/src/test/shell/data/apps/images/logo/webdav.svg deleted file mode 100644 index ae45ed2832228a7261d1f62d824dbcb454b04b7e..0000000000000000000000000000000000000000 --- a/src/test/shell/data/apps/images/logo/webdav.svg +++ /dev/null @@ -1 +0,0 @@ -<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="m22.038 2h-15.663a1.755 1.755 0 0 0 -1.75 1.75v24.5a1.755 1.755 0 0 0 1.75 1.75h19.25a1.755 1.755 0 0 0 1.75-1.75v-21.394zm.525 2.844 1.663 1.531h-1.663zm-16.188 23.406v-24.5h14.438v4.375h4.813v20.125z" fill="#c2c2c2"/><g fill="#829ec2"><path d="m8.125 15.097h13.076v1.75h-13.076z"/><path d="m8.125 24.439h9.762v1.75h-9.762z"/><path d="m8.125 19.763h15.75v1.75h-15.75z"/><path d="m8.125 10.23h15.75v1.75h-15.75z"/></g></svg> \ No newline at end of file diff --git a/src/test/shell/data/apps/images/logo/wifimon.png b/src/test/shell/data/apps/images/logo/wifimon.png deleted file mode 100644 index e7a16fcc8bc912bd2bccbbab81a2d7a6e9c873ad..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/wifimon.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/logo/zabbix.png b/src/test/shell/data/apps/images/logo/zabbix.png deleted file mode 100644 index e85c8b9bc4e2c492a867e2eb150530d28ae34ad3..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/logo/zabbix.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/adminer/adminer1.png b/src/test/shell/data/apps/images/screenshots/adminer/adminer1.png deleted file mode 100644 index 96054e2aea76648064431d1463a17b0ddbef3f8d..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/adminer/adminer1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/adminer/adminer2.png b/src/test/shell/data/apps/images/screenshots/adminer/adminer2.png deleted file mode 100644 index 09c33093f59b1ecf890772210f23a8d59e8107ca..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/adminer/adminer2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/adminer/adminer3.png b/src/test/shell/data/apps/images/screenshots/adminer/adminer3.png deleted file mode 100644 index b0921292eeb26ea0f19560432c561d5c570f80ab..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/adminer/adminer3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/bastion/bastion1.png b/src/test/shell/data/apps/images/screenshots/bastion/bastion1.png deleted file mode 100644 index c222652dc636e57d8849607895bbd614b9d955c7..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/bastion/bastion1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/changedetectionio/changedetectionio1.png b/src/test/shell/data/apps/images/screenshots/changedetectionio/changedetectionio1.png deleted file mode 100644 index e6d3582622ce4a7a3285bb050c2e870329900ead..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/changedetectionio/changedetectionio1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/changedetectionio/changedetectionio2.png b/src/test/shell/data/apps/images/screenshots/changedetectionio/changedetectionio2.png deleted file mode 100644 index 7ad2b3865b1c9b9393695efd66a58fd176a4b58b..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/changedetectionio/changedetectionio2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/codimd/codimd1.png b/src/test/shell/data/apps/images/screenshots/codimd/codimd1.png deleted file mode 100644 index 3b26f34d5a06800a049ebc96570badfcc19dba13..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/codimd/codimd1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/codimd/codimd2.png b/src/test/shell/data/apps/images/screenshots/codimd/codimd2.png deleted file mode 100644 index b422f03e514d7b89d48caa0b62a9ce987979ce31..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/codimd/codimd2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd1.png b/src/test/shell/data/apps/images/screenshots/ctfd/ctfd1.png deleted file mode 100644 index 38a4d6f10025f4fc95ad1a8162848f6c23a81e2f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd2.png b/src/test/shell/data/apps/images/screenshots/ctfd/ctfd2.png deleted file mode 100644 index a935f1b0de9d4905361193983f0263129ef26a6c..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd3.png b/src/test/shell/data/apps/images/screenshots/ctfd/ctfd3.png deleted file mode 100644 index 09fe5e7ff1aed66a1fe52a1323a4bfe0b14ca18d..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd4.png b/src/test/shell/data/apps/images/screenshots/ctfd/ctfd4.png deleted file mode 100644 index 9a0e156473fce6e65c4ec67016ecf3ea26d426b5..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/ctfd/ctfd4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository1.png b/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository1.png deleted file mode 100644 index f1dd2713e6fdbaeb52195430ba157bb339c6cc1a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository2.png b/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository2.png deleted file mode 100644 index 8cd5a4a7fc087d0566f8a70b5129f2e3a46b5c21..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository3.png b/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository3.png deleted file mode 100644 index 5351a1660496a6a2f972a1956c61573850c09aa0..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository4.png b/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository4.png deleted file mode 100644 index 49036bc908194a4b370eb1276a7f7b27833e2c25..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/debian-repository/debian-repository4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/elasticstack/elk1.png b/src/test/shell/data/apps/images/screenshots/elasticstack/elk1.png deleted file mode 100644 index 5d18acb67bef56eabbd9b2bb606d115a7d3c0078..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/elasticstack/elk1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/elasticstack/elk2.png b/src/test/shell/data/apps/images/screenshots/elasticstack/elk2.png deleted file mode 100644 index 48e75260e9f6040d6aab53f7c23b80118a0d100a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/elasticstack/elk2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/icinga/icinga1.png b/src/test/shell/data/apps/images/screenshots/icinga/icinga1.png deleted file mode 100644 index 4e5013e1b607e7c3605333d2f3529d0e1161f6a9..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/icinga/icinga1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/icinga/icinga2.png b/src/test/shell/data/apps/images/screenshots/icinga/icinga2.png deleted file mode 100644 index a39a1c6e492f9af50f7e853862df64d035992da4..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/icinga/icinga2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/icinga/icinga3.png b/src/test/shell/data/apps/images/screenshots/icinga/icinga3.png deleted file mode 100644 index 35e73af86a47625513e3464755af225813f469a6..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/icinga/icinga3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/icinga/icinga4.png b/src/test/shell/data/apps/images/screenshots/icinga/icinga4.png deleted file mode 100644 index b19a260e785ce7ebb38a5e002eb1db58e3b9ca52..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/icinga/icinga4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/icinga/icinga5.png b/src/test/shell/data/apps/images/screenshots/icinga/icinga5.png deleted file mode 100644 index 33779eb4d8548542f172096aea3d018ccc56d238..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/icinga/icinga5.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/icinga/icinga6.png b/src/test/shell/data/apps/images/screenshots/icinga/icinga6.png deleted file mode 100644 index 24e7a9f98ab836dee4f27084ee4c0206950e14ed..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/icinga/icinga6.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/influxdb/influxdb1.png b/src/test/shell/data/apps/images/screenshots/influxdb/influxdb1.png deleted file mode 100644 index 640f3bbcb8f8cf4f7496ba54b66b72eb6727e0e3..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/influxdb/influxdb1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/influxdb/influxdb2.png b/src/test/shell/data/apps/images/screenshots/influxdb/influxdb2.png deleted file mode 100644 index 174374ebf14adc9bbd38923b3ab3572af4189a2d..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/influxdb/influxdb2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/jenkins/jenkins1.png b/src/test/shell/data/apps/images/screenshots/jenkins/jenkins1.png deleted file mode 100644 index c2f57f5abc4f13825188ddaf2996242339cafaee..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/jenkins/jenkins1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop1.png b/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop1.png deleted file mode 100644 index 5a017398a44317186bb4ba525d33199845f7e402..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop2.png b/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop2.png deleted file mode 100644 index b90627b821015816bc4910bd51d04ec59c46b40c..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop3.png b/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop3.png deleted file mode 100644 index c2f0d5b5138e29280d5a119fbf8e80835115b599..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop4.png b/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop4.png deleted file mode 100644 index 01f3e8cadf1d773e37def8291efff328d358d379..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/juiceshop/juiceshop4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/librebooking/librebooking1.png b/src/test/shell/data/apps/images/screenshots/librebooking/librebooking1.png deleted file mode 100644 index 37598f10bcc509e56416f61fb0a096befa081b49..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/librebooking/librebooking1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/librebooking/librebooking2.png b/src/test/shell/data/apps/images/screenshots/librebooking/librebooking2.png deleted file mode 100644 index 72538bdda46eb944a02ad6d0b99504c491df6a94..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/librebooking/librebooking2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/librebooking/librebooking3.png b/src/test/shell/data/apps/images/screenshots/librebooking/librebooking3.png deleted file mode 100644 index f39b071d0a5dc34ed54e6559910bd6bac2313315..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/librebooking/librebooking3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/librenms/librenms1.png b/src/test/shell/data/apps/images/screenshots/librenms/librenms1.png deleted file mode 100644 index 6878bcd146488ef288291cd6ae47f7bb11f04595..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/librenms/librenms1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/librenms/librenms2.png b/src/test/shell/data/apps/images/screenshots/librenms/librenms2.png deleted file mode 100644 index cc73f8146f2b34a9e3319cc9d188258c1c7559c3..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/librenms/librenms2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/maildev/maildev1.png b/src/test/shell/data/apps/images/screenshots/maildev/maildev1.png deleted file mode 100644 index 9c8e8006068e616ff98f10f10f4b46495587068e..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/maildev/maildev1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/nav/nav1.png b/src/test/shell/data/apps/images/screenshots/nav/nav1.png deleted file mode 100644 index da3cd73eb6fec1ba141f80eaa8a1884052d7fbba..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/nav/nav1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/nav/nav2.png b/src/test/shell/data/apps/images/screenshots/nav/nav2.png deleted file mode 100644 index ed05f1ab87cb970c28f46f2e5a02099abe12881d..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/nav/nav2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/nav/nav3.png b/src/test/shell/data/apps/images/screenshots/nav/nav3.png deleted file mode 100644 index 9fa70a6814fb8b1902fa12ae905db880d11ac3ec..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/nav/nav3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/nav/nav4.png b/src/test/shell/data/apps/images/screenshots/nav/nav4.png deleted file mode 100644 index 0aad1866ccb38ad862b62617f9d5fadc6439e8a5..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/nav/nav4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/nav/nav5.png b/src/test/shell/data/apps/images/screenshots/nav/nav5.png deleted file mode 100644 index 784e4e4ea84f36bd4ee20a7e41d665352a8a1185..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/nav/nav5.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/netbox/netbox1.png b/src/test/shell/data/apps/images/screenshots/netbox/netbox1.png deleted file mode 100644 index 35d306770b4daa20e71e01a491f18fd996e141af..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/netbox/netbox1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/netbox/netbox2.png b/src/test/shell/data/apps/images/screenshots/netbox/netbox2.png deleted file mode 100644 index 62725ddd4707549399bac97158579245e2574e58..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/netbox/netbox2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/netbox/netbox3.png b/src/test/shell/data/apps/images/screenshots/netbox/netbox3.png deleted file mode 100644 index 8dff0fc62b711f24f17bf9f6a57eb5654ef7d758..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/netbox/netbox3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/netbox/netbox4.png b/src/test/shell/data/apps/images/screenshots/netbox/netbox4.png deleted file mode 100644 index 0a618231de191b9d725f4847caa59541327fd2bc..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/netbox/netbox4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/opennti/opennti1.png b/src/test/shell/data/apps/images/screenshots/opennti/opennti1.png deleted file mode 100644 index 0c298f71bd00836e2c5c2c3faa93452986e9877b..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/opennti/opennti1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/opennti/opennti2.png b/src/test/shell/data/apps/images/screenshots/opennti/opennti2.png deleted file mode 100644 index 0781373a478fdd1ae0bc0cc01b853fcc1fd6f68e..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/opennti/opennti2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/opennti/opennti3.png b/src/test/shell/data/apps/images/screenshots/opennti/opennti3.png deleted file mode 100644 index 3ea490549a17c77a8e978c2645594fb0f9a77bdd..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/opennti/opennti3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/oxidized/oxidized1.png b/src/test/shell/data/apps/images/screenshots/oxidized/oxidized1.png deleted file mode 100644 index f9ea49df8da18785df40239fc2975314260e6c2d..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/oxidized/oxidized1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/oxidized/oxidized2.png b/src/test/shell/data/apps/images/screenshots/oxidized/oxidized2.png deleted file mode 100644 index ae27229f66e69317363abf60ce0829cac61edd9a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/oxidized/oxidized2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/oxidized/oxidized3.png b/src/test/shell/data/apps/images/screenshots/oxidized/oxidized3.png deleted file mode 100644 index b95ec006fcb98fa4a45af07ae5a037ac6d2b3c9f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/oxidized/oxidized3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-centralmanagement/perfsonar-centralmanagement1.png b/src/test/shell/data/apps/images/screenshots/perfsonar-centralmanagement/perfsonar-centralmanagement1.png deleted file mode 100644 index 2b7604106d6245f4796034f3097c26615ceb4d62..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-centralmanagement/perfsonar-centralmanagement1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-esmond/perfsonar-esmond1.png b/src/test/shell/data/apps/images/screenshots/perfsonar-esmond/perfsonar-esmond1.png deleted file mode 100644 index 2b7604106d6245f4796034f3097c26615ceb4d62..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-esmond/perfsonar-esmond1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-maddash/perfsonar-maddash1.png b/src/test/shell/data/apps/images/screenshots/perfsonar-maddash/perfsonar-maddash1.png deleted file mode 100644 index 88f03b6da66f920ab6d46c2da634ef56b179cad1..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-maddash/perfsonar-maddash1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa1.png b/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa1.png deleted file mode 100644 index 9f6fae904b79c0b22b7bac8ee066cfa30bf0e470..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa2.png b/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa2.png deleted file mode 100644 index f9351cf9c76baf3ba7646ff446271669da63559a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa3.png b/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa3.png deleted file mode 100644 index e30bc807aceb78a6c26295e94bb812ad8ef163f1..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa4.png b/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa4.png deleted file mode 100644 index 6b29cde363c9fc3b4edfdcd81b687d02963e88c5..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa5.png b/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa5.png deleted file mode 100644 index 754ceaf4e281378a2bafb75bb8f9423cbc40e858..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa5.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/pmacct/pmacct1.jpg b/src/test/shell/data/apps/images/screenshots/pmacct/pmacct1.jpg deleted file mode 100644 index 465caee345f5da626eee80fbff0210b7d1e6717f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/pmacct/pmacct1.jpg and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/pmacct/pmacct2.png b/src/test/shell/data/apps/images/screenshots/pmacct/pmacct2.png deleted file mode 100644 index 8107c5f2243b133a6feeb69f83d5cf7a3ed1f597..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/pmacct/pmacct2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/pmacct/pmacct3.jpg b/src/test/shell/data/apps/images/screenshots/pmacct/pmacct3.jpg deleted file mode 100644 index c81fbd73e7860debcc1858c52cb327fb5eb92a23..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/pmacct/pmacct3.jpg and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/routinator/routinator1.png b/src/test/shell/data/apps/images/screenshots/routinator/routinator1.png deleted file mode 100644 index 59ff844c63e434594345ca21abe7e1fd8c35ac98..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/routinator/routinator1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/routinator/routinator2.png b/src/test/shell/data/apps/images/screenshots/routinator/routinator2.png deleted file mode 100644 index f714ee519b4e30c48ad68702f82ff699deefb86f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/routinator/routinator2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/routinator/routinator3.png b/src/test/shell/data/apps/images/screenshots/routinator/routinator3.png deleted file mode 100644 index eeeaa23a80ac3aee4eb35713bc33c788518a9dc8..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/routinator/routinator3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory1.png b/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory1.png deleted file mode 100644 index 6da342efd909c5a060e33b60b58e563c74b034e6..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory2.png b/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory2.png deleted file mode 100644 index 0b022af1517ff049450e87de4e1a72a7b95df60b..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory3.png b/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory3.png deleted file mode 100644 index b2e9cc79829dea3d51ede341192888d8abd5d3ea..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory4.png b/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory4.png deleted file mode 100644 index 376b12ee46a32c294a31f55b172b73f969f83f18..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa-inventory/spa-inventory4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa/spa1.png b/src/test/shell/data/apps/images/screenshots/spa/spa1.png deleted file mode 100644 index c006e40f52a2002c92bb91fad18c6f5c4b08684f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa/spa1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa/spa2.png b/src/test/shell/data/apps/images/screenshots/spa/spa2.png deleted file mode 100644 index 9d1921bf653664ac89816336a77217fda9d8733a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa/spa2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa/spa3.png b/src/test/shell/data/apps/images/screenshots/spa/spa3.png deleted file mode 100644 index de77431ea41e81ee3ac083bc4d1b3534844929d7..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa/spa3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/spa/spa4.png b/src/test/shell/data/apps/images/screenshots/spa/spa4.png deleted file mode 100644 index 4493ad289836beeac4e82d58c00709df2943782b..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/spa/spa4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/statping/statping1.png b/src/test/shell/data/apps/images/screenshots/statping/statping1.png deleted file mode 100644 index 9b5e39a7bc42dd6028e16035046197dea2be7656..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/statping/statping1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/statping/statping2.png b/src/test/shell/data/apps/images/screenshots/statping/statping2.png deleted file mode 100644 index 124609a5f514d94a38730fdb4b2d544bac7bfd3c..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/statping/statping2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/statping/statping3.png b/src/test/shell/data/apps/images/screenshots/statping/statping3.png deleted file mode 100644 index 1a3aa9e5cd1ebff825037f3473cea79f16f700cf..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/statping/statping3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/synapse/synapse1.png b/src/test/shell/data/apps/images/screenshots/synapse/synapse1.png deleted file mode 100644 index 3cd89f1e979cf7e22a381c76953db5f7e2a3bcde..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/synapse/synapse1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/synapse/synapse2.png b/src/test/shell/data/apps/images/screenshots/synapse/synapse2.png deleted file mode 100644 index 0f02050de178772e132d05fb836069b31b6e5214..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/synapse/synapse2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/synapse/synapse3.png b/src/test/shell/data/apps/images/screenshots/synapse/synapse3.png deleted file mode 100644 index a43482469b420e7ec926561e294f53a2d3dad76a..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/synapse/synapse3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/synapse/synapse4.png b/src/test/shell/data/apps/images/screenshots/synapse/synapse4.png deleted file mode 100644 index ca1a8ad50f7a21301bb1f2a01dfaa93e9b31185f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/synapse/synapse4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/synapse/synapse5.png b/src/test/shell/data/apps/images/screenshots/synapse/synapse5.png deleted file mode 100644 index 8da1ba0bdf327ac6e148847bf4a69aabf39a8ef1..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/synapse/synapse5.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/synapse/synapse6.png b/src/test/shell/data/apps/images/screenshots/synapse/synapse6.png deleted file mode 100644 index 2565e24e5fb097b93b1f7918ba523e06941c1453..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/synapse/synapse6.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics1.png b/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics1.png deleted file mode 100644 index 02fe786e278671ff700fd6fe6c53909fb0249360..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics2.png b/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics2.png deleted file mode 100644 index 76f2b9efb5b5591b84b618be209c9f562b444e40..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics3.png b/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics3.png deleted file mode 100644 index 8edb6aafdf1fa1a8acbeb307456c2b23208cd16f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/victoria-metrics/victoria-metrics3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/webdav/webdav1.png b/src/test/shell/data/apps/images/screenshots/webdav/webdav1.png deleted file mode 100644 index 4d150a78626a1a4dfd391b08976e147e0d11472b..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/webdav/webdav1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/webdav/webdav2.png b/src/test/shell/data/apps/images/screenshots/webdav/webdav2.png deleted file mode 100644 index 35a55d846271b08461d3eba2b7e33bc8ec0ce015..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/webdav/webdav2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/webdav/webdav3.png b/src/test/shell/data/apps/images/screenshots/webdav/webdav3.png deleted file mode 100644 index bc4a15c7f82e5769ca1701623c38e3a50c5c0f97..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/webdav/webdav3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/webdav/webdav4.png b/src/test/shell/data/apps/images/screenshots/webdav/webdav4.png deleted file mode 100644 index 5a0f2a38effab1042f7268ba9a554be43f6b8b22..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/webdav/webdav4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/webdav/webdav5.png b/src/test/shell/data/apps/images/screenshots/webdav/webdav5.png deleted file mode 100644 index 06ce3d9dfd8cdeeb1963a1b871ac77dfc300afe8..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/webdav/webdav5.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon1.png b/src/test/shell/data/apps/images/screenshots/wifimon/wifimon1.png deleted file mode 100644 index 9861d4cc5ca44679a1fe27dfe2da776f23af29bf..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon2.png b/src/test/shell/data/apps/images/screenshots/wifimon/wifimon2.png deleted file mode 100644 index 0f75a049af21a6a1ec78e9f61c287d9093184598..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon3.png b/src/test/shell/data/apps/images/screenshots/wifimon/wifimon3.png deleted file mode 100644 index bfc3d5f7d20b1423d51d85d631c962e413aa8f12..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon4.png b/src/test/shell/data/apps/images/screenshots/wifimon/wifimon4.png deleted file mode 100644 index 5df327d3b4f639d57dd11929a3a041ca83050e07..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/wifimon/wifimon4.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix1.png b/src/test/shell/data/apps/images/screenshots/zabbix/zabbix1.png deleted file mode 100644 index 573bb82df9cace587ae236a6c7f6b1850243df3f..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix1.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix2.png b/src/test/shell/data/apps/images/screenshots/zabbix/zabbix2.png deleted file mode 100644 index e3caddf1318eaeda9d02a8e94f31529b24b42f12..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix2.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix3.png b/src/test/shell/data/apps/images/screenshots/zabbix/zabbix3.png deleted file mode 100644 index 30055dccde180d67eda926e619469da7485f4fc0..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix3.png and /dev/null differ diff --git a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix4.png b/src/test/shell/data/apps/images/screenshots/zabbix/zabbix4.png deleted file mode 100644 index 4929cfbd3496d246aa5a342f7a94025320654d17..0000000000000000000000000000000000000000 Binary files a/src/test/shell/data/apps/images/screenshots/zabbix/zabbix4.png and /dev/null differ diff --git a/src/test/shell/data/form_types/access_request.json b/src/test/shell/data/form_types/access_request.json index a0c473bb5c60fb45b8a4a790dd675640e274c4fb..ca4cd10086a300fa88b9a74be5bb10fbf12962bd 100644 --- a/src/test/shell/data/form_types/access_request.json +++ b/src/test/shell/data/form_types/access_request.json @@ -3,5 +3,5 @@ "access": "ONLY_NOT_LOGGED_IN", "templateName": "default", "emails": ["nmaas-dev@lists.geant.org"], - "subject": "NMaaS: Access request" + "subject": "nmaas: Access request" } \ No newline at end of file diff --git a/src/test/shell/data/form_types/contact.json b/src/test/shell/data/form_types/contact.json index 2092db72962399eed0623a1170891c8323c91935..9a70b818906a6fb14991a02a7100be3aec81d8e0 100644 --- a/src/test/shell/data/form_types/contact.json +++ b/src/test/shell/data/form_types/contact.json @@ -3,5 +3,5 @@ "access": "ALL", "templateName": "default", "emails": ["nmaas-dev@lists.geant.org"], - "subject": "NMaaS: Contact" + "subject": "nmaas: Contact" } \ No newline at end of file diff --git a/src/test/shell/data/form_types/domain_request.json b/src/test/shell/data/form_types/domain_request.json index b2b92b518ef72449ea65ce59b33c65f286822595..f0e2907da5031e82e6f185b7311e1642b4d434be 100644 --- a/src/test/shell/data/form_types/domain_request.json +++ b/src/test/shell/data/form_types/domain_request.json @@ -3,5 +3,5 @@ "access": "ALL", "templateName": "domainRequest", "emails": ["nmaas-dev@lists.geant.org"], - "subject": "NMaaS: New domain request" + "subject": "nmaas: New domain request" } \ No newline at end of file diff --git a/src/test/shell/data/form_types/feature_request.json b/src/test/shell/data/form_types/feature_request.json index 9c8f3b3486e41b250d203be832e8e211fd4e92af..59253e3f2e1dbdb7990c9e2f15d911eeca43b62e 100644 --- a/src/test/shell/data/form_types/feature_request.json +++ b/src/test/shell/data/form_types/feature_request.json @@ -3,5 +3,5 @@ "access": "ALL", "templateName": "default", "emails": ["nmaas-dev@lists.geant.org"], - "subject": "NMaaS: Feature request" + "subject": "nmaas: Feature request" } \ No newline at end of file diff --git a/src/test/shell/data/form_types/issue_report.json b/src/test/shell/data/form_types/issue_report.json index 7388fccc6dc30750c52ef37acaee20af42e8a325..76dfe9e0f7d7d40831c5c07e3c58298bfe0d66f7 100644 --- a/src/test/shell/data/form_types/issue_report.json +++ b/src/test/shell/data/form_types/issue_report.json @@ -3,5 +3,5 @@ "access": "ALL", "templateName": "issueReport", "emails": ["nmaas-dev@lists.geant.org"], - "subject": "NMaaS: Issue report" + "subject": "nmaas: Issue report" } \ No newline at end of file diff --git a/src/test/shell/data/i18n/de.json b/src/test/shell/data/i18n/de.json index e833a24cfdb8a3cf0eab32021a0f3fb0206ec774..3f309f2c926862104bb0340f28259ea99d40545c 100644 --- a/src/test/shell/data/i18n/de.json +++ b/src/test/shell/data/i18n/de.json @@ -32,28 +32,28 @@ "REGISTER": "Registrieren", "TITLE1": "Network Management as a Service", "TITLE2": "stellt ein Portfolio an Netzwerk-Management-Anwendungen bereit welche als dedizierte Instanzen pro Benutzer in der Cloud ausgeführt werden.", - "INTRO_TEXT": "Der NMaaS-Dienst von GÉANT umfasst drei Aspekte: Bereitstellung, Verwaltung und Wartung der Infrastruktur des NMaaS Service Portals, der Plattform und ausgewählter Tools. Der Benutzer wird in der Verwendung des Systems und der ausgewählten Tools unterstützt um sein eigenes Netzwerk via NMaaS zu überwachen. Es werden ebenfalls Anwender unterstützt, welche ihre Software über das NMaaS System bereitstellen möchten.", + "INTRO_TEXT": "Der nmaas-Dienst von GÉANT umfasst drei Aspekte: Bereitstellung, Verwaltung und Wartung der Infrastruktur des nmaas Service Portals, der Plattform und ausgewählter Tools. Der Benutzer wird in der Verwendung des Systems und der ausgewählten Tools unterstützt um sein eigenes Netzwerk via nmaas zu überwachen. Es werden ebenfalls Anwender unterstützt, welche ihre Software über das nmaas System bereitstellen möchten.", "TARGET_USERS_HEADER": "Zielgruppe", - "TARGET_USERS_TEXT": "NMaaS-Nutzer sind Organisationen, die keine eigene NMS-Infrastruktur besitzen und/oder das Netzwerkmanagement auslagern wollen, sowie Organisationen und/oder Einzelpersonen, die nach qualitativ hochwertiger Netzwerkmanagement-Software suchen oder ihre Software innerhalb der Community teilen möchten.", - "MARKETPLACE_HEADER": "NMaaS Marketplace", - "MARKETPLACE_TEXT": "Der NMaaS Marketplace ist ein frei verteilter und von der Community unterstützter Katalog verfügbarer Open-Source-Tools. Die Inhalte werden von den Administratoren ausgewählt. Sie haben aber auch die Möglichkeit neue Anwendung vorzuschlagen, um die Auswahl an Anwendungen zu vergrößern.", + "TARGET_USERS_TEXT": "nmaas-Nutzer sind Organisationen, die keine eigene NMS-Infrastruktur besitzen und/oder das Netzwerkmanagement auslagern wollen, sowie Organisationen und/oder Einzelpersonen, die nach qualitativ hochwertiger Netzwerkmanagement-Software suchen oder ihre Software innerhalb der Community teilen möchten.", + "MARKETPLACE_HEADER": "nmaas Marketplace", + "MARKETPLACE_TEXT": "Der nmaas Marketplace ist ein frei verteilter und von der Community unterstützter Katalog verfügbarer Open-Source-Tools. Die Inhalte werden von den Administratoren ausgewählt. Sie haben aber auch die Möglichkeit neue Anwendung vorzuschlagen, um die Auswahl an Anwendungen zu vergrößern.", "COST_REDUCTION_HEADER": "Kostensenkung", - "COST_REDUCTION_TEXT": "Mit NMaaS müssen die Benutzer nicht die Betriebskosten und Risiken im Zusammenhang mit der Wartung und Kontrolle der Netzwerk-Management-Infrastruktur tragen.", + "COST_REDUCTION_TEXT": "Mit nmaas müssen die Benutzer nicht die Betriebskosten und Risiken im Zusammenhang mit der Wartung und Kontrolle der Netzwerk-Management-Infrastruktur tragen.", "SECURITY_HEADER": "Sicherheit", - "SECURITY_TEXT": "Mit NMaaS müssen Sie sich keine Sorgen um Sicherheit machen. Wir bieten mittels getrennter Instanzen und VPN eine sichere Verbindung zu Ihrem Netzwerk - damit Institutionen und Projekte das Netzwerk sicher verwalten können.", + "SECURITY_TEXT": "Mit nmaas müssen Sie sich keine Sorgen um Sicherheit machen. Wir bieten mittels getrennter Instanzen und VPN eine sichere Verbindung zu Ihrem Netzwerk - damit Institutionen und Projekte das Netzwerk sicher verwalten können.", "SCALING_HEADER": "Flexible Skalierung", - "SCALING_TEXT": "Eine horizontale Skalierung ist mit NMaaS kein Problem. Sie können ihre Instanzen sehr einfach und in nur wenigen Minuten skalieren.", - "NMAAS_FEATURES_HEADER": "NMaaS Features", + "SCALING_TEXT": "Eine horizontale Skalierung ist mit nmaas kein Problem. Sie können ihre Instanzen sehr einfach und in nur wenigen Minuten skalieren.", + "NMAAS_FEATURES_HEADER": "nmaas Features", "APP_MARKET_HEADER": "Application Market", "APP_MARKET_TEXT": "Im Marktplatz finden Sie von Administratoren und der Community ausgewählte Top-Anwendungen zur Verwaltung und Wartung Ihrer Netzwerkinfrastruktur.", "OWN_APPS_HEADER": "Eigene Anwendungen", - "OWN_APPS_TEXT": "Sie möchten Ihre Anwendung in der Community teilen? NMaaS ist offen für neue Anwendungen.", + "OWN_APPS_TEXT": "Sie möchten Ihre Anwendung in der Community teilen? nmaas ist offen für neue Anwendungen.", "EDUGAIN_SUPPORT_HEADER": "eduGAIN support", "EDUGAIN_SUPPORT_TEXT": "Sie müssen kein neues Konto erstellen. Melden Sie sich einfach mit einem bestehenden Konto Ihres eduGAIN-Partner Identitätsanbieters an.", "FAST_DEPLOYMENT_HEADER": "Schnelles & einfaches Deployment", "FAST_DEPLOYMENT_TEXT": "Auf Ihre Anfrage hin werden Anwendungen mit benutzerdefinierter Konfiguration mittels Assistenten innerhalb weniger Minuten bereitgestellt.", "WEB_PORTAL_HEADER": "Modernes Webportal", - "WEB_PORTAL_TEXT": "NMaaS bietet ein webbasiertes Benutzerportal, das dem Prinzip des reaktiven Designs folgt.", + "WEB_PORTAL_TEXT": "nmaas bietet ein webbasiertes Benutzerportal, das dem Prinzip des reaktiven Designs folgt.", "KUBERNETES_HEADER": "Kubernetes deployment", "KUBERNETES_TEXT": "Benutzeranwendungsinstanzen werden im Kubernetes-Cluster bereitgestellt, der auf einer dedizierten Hardware-Infrastruktur läuft, die eine hohe Leistung und Zuverlässigkeit gewährleistet.", "TECHNOLOGIES_USED_HEADER": "Verwendete Technologien", @@ -94,8 +94,8 @@ "USER_DISABLED_MESSAGE": "User is disabled" }, "TEST_INSTANCE_MODAL": { - "HEADER": "NMaaS Testinstanz", - "BODY": "Bitte beachten Sie, dass dies eine Test-NMaaS-Instanz ist. Die Benutzerisolations- und Datensicherheitsmaßnahmen sind nicht so streng wie in der Produktionsinstanz. Verwenden Sie diese Instanz nicht zur Überwachung realer Geräte.", + "HEADER": "nmaas Testinstanz", + "BODY": "Bitte beachten Sie, dass dies eine Test-nmaas-Instanz ist. Die Benutzerisolations- und Datensicherheitsmaßnahmen sind nicht so streng wie in der Produktionsinstanz. Verwenden Sie diese Instanz nicht zur Überwachung realer Geräte.", "OK_BUTTON": "OK" }, "PROVIDE_SSH_KEY_MODAL": { @@ -248,10 +248,10 @@ }, "ANNOTATIONS" : { "HEADER" : "Domain annotations", - "SUBHEADER" : "Global domain annotations. This set of annotations will be added to each domain creation.", + "SUBHEADER" : "Global domain annotations. This set of annotations will be added to Kubernetes objects created for each new domain.", "CREATION" : "Domain namespace annotations", "ADD" : "Add annotation", - "KEY" : "Key", + "KEY" : "Key", "VALUE" : "Value", "EDIT" : "Edit global annotations" } @@ -314,7 +314,7 @@ "NOT_FOUND_ERROR": "Nicht gefunden" }, "PORTAL_CONFIGURATION": { - "TITLE": "Portal Konfiguration", + "TITLE": "Platform Konfiguration", "MAINTENANCE": "Wartung", "ALLOW_SSO_LOGIN": "Erlaube SSO login", "SUBMIT_BUTTON": "Senden", @@ -323,10 +323,12 @@ "LANGUAGE_SUPPORT": "Sprachunterstützung", "LANGUAGE_ENABLED": "Aktiviert", "LANGUAGE_DISABLED": "Deaktiviert", - "TEST_INSTANCE": "Als Test-NMaaS-Instanz markieren", + "TEST_INSTANCE": "Als Test-nmaas-Instanz markieren", "SEND_APP_INSTANCE_FAILURE_EMAILS": "Send emails when app instance fails to deploy", - "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Emails list", - "DOMAIN_SELECTION_ENABLED" : "Domainauswahl während der Registrierung" + "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Recipients of app deployment failed emails", + "DOMAIN_SELECTION_ENABLED" : "Domainauswahl während der Registrierung", + "BULK_DOMAINS_ALLOW_FOR_SSO_ACCOUNTS" : "Allow for creation or update of a SSO-enabled account in bulk process", + "BULK_DOMAINS_SEND_EMAIL_FOR_NEW_ACCOUNTS" : "Send notification email for new accounts created in bulk process" }, "DOMAIN_DETAILS": { "TITLE": "Domain Details", @@ -386,7 +388,7 @@ } }, "GIT_INFO": { - "HEADER": "NMaaS Versionsinformation", + "HEADER": "nmaas Versionsinformation", "VERSION": "Version", "BUILD_TIME": "Zeitpunkt des Builds", "LAST_COMMIT": "Letzter Commit", @@ -550,7 +552,7 @@ "STATE": "Status", "DEFAULT_ERROR_STATE": "Etwas ist schief gelaufen", "DETAILS": "Details", - "DEFAULT_ERROR_MESSAGE": "Die Anwendungsbereitstellung ist aufgrund eines unerwarteten Fehlers fehlgeschlagen. Das NMaaS-Supportteam wurde bereits benachrichtigt.<br>Um ein Problem zu melden, verwenden Sie das <a href=\"about?type=ISSUE_REPORT\">Kontaktformular</a>." + "DEFAULT_ERROR_MESSAGE": "Die Anwendungsbereitstellung ist aufgrund eines unerwarteten Fehlers fehlgeschlagen. Das nmaas-Supportteam wurde bereits benachrichtigt.<br>Um ein Problem zu melden, verwenden Sie das <a href=\"about?type=ISSUE_REPORT\">Kontaktformular</a>." }, "DEPLOYMENT_HISTORY": { "HEADER": "Installationshistorie", @@ -563,7 +565,7 @@ "ADVANCED_TAB": "Erweitert", "ADDITIONAL_TAB": "Erweiterte Parameter", "STORAGE_SPACE": "Speicherplatz", - "NMAAS_TOOLS": "NMaaS Tools Seite", + "NMAAS_TOOLS": "nmaas Tools Seite", "DOCUMENTATION_INFO": "Detaillierte Feldbeschreibungen finden Sie unter", "PREVIEW": "Configuration preview" }, @@ -618,17 +620,17 @@ "APP_UPGRADE_FAILED": "Anwendungsaktualisierung fehlgeschlagen" }, "USER_FRIENDLY": { - "REQUESTED": "NMaaS bearbeitet Ihre Anfrage", - "VALIDATION": "NMaaS prüft verfügbare Ressourcen", - "PREPARATION": "NMaaS bereitet die Installationsumgebung für Ihre Anwendung vor", - "CONNECTING": "NMaaS richtet eine sichere Verbindungen zu Ihren Geräten ein", + "REQUESTED": "nmaas bearbeitet Ihre Anfrage", + "VALIDATION": "nmaas prüft verfügbare Ressourcen", + "PREPARATION": "nmaas bereitet die Installationsumgebung für Ihre Anwendung vor", + "CONNECTING": "nmaas richtet eine sichere Verbindungen zu Ihren Geräten ein", "CONFIGURATION_AWAITING": "Ihre Anwendungsinstanz wurde erfolgreich bereitgestellt. <br>Um fortzufahren, geben Sie die Erstkonfiguration über die Aktionsschaltfläche <i>Konfigurieren</i> ein", "DEPLOYING": "Anwendung wird aktiviert. Dieser Vorgang kann bis zu mehreren Minuten dauern. <br>Sie werden per E-Mail benachrichtigt, sobald Ihre Instanz fertig ist", "RUNNING": "Ihre Anwendung ist jetzt aktiv. Sie können mit der Option <i>Zugriff</i> im Menü <i>Aktionen</i> darauf zugreifen. <br>Verwenden Sie die Optionen <i>Konfigurieren</i> und <i>Mitglieder</i>, um die Konfiguration bzw. die Liste der Anwendungsbenutzer zu aktualisieren.", "UNDEPLOYING": "Die Anwendung wird entfernt. Dieser Vorgang kann bis zu mehreren Minuten dauern", "DONE": "Anwendung erfolgreich entfernt", "FAILURE": "", - "UNKNOWN": "Unbekannter Anwendungszustand - Kontakt mit dem NMaaS-Team über das Kontaktformular auf der Unterseite \" Über \"", + "UNKNOWN": "Unbekannter Anwendungszustand - Kontakt mit dem nmaas-Team über das Kontaktformular auf der Unterseite \" Über \"", "REMOVED": "Anwendung nach Fehler erfolgreich aufgehoben" }, "SHOW_VERSIONS_LABEL": "Show available versions", @@ -693,11 +695,11 @@ }, "RESET_PASSWORD": { "FORGOT_PASSWORD_BUTTON": "Passwort vergessen", - "TEXT": "Um Ihr Passwort zurückzusetzen geben Sie Ihre E-Mail Adresse an, welche Sie für die Registrierung bei NMaaS verwendet haben.", + "TEXT": "Um Ihr Passwort zurückzusetzen geben Sie Ihre E-Mail Adresse an, welche Sie für die Registrierung bei nmaas verwendet haben.", "SUBMIT_BUTTON": "Senden", "EMAIL": "Email", "INVALID_TOKEN": "Ihr Link ist bereits abgelaufen. Bitte füllen Sie das Formular für das vergessene Passwort erneut aus.", - "GO_BACK": "Zurück zur NMaaS Seite", + "GO_BACK": "Zurück zur nmaas Seite", "MODAL": { "HEADER": "Bitte überprüfen Sie Ihre E-Mails", "BODY": "Wenn Sie eine gültige E-Mail Adresse angegeben haben, werden wir Ihnen einen Link für das Zurücksetzen des Passworts senden. Bitte beachten Sie, dass Sie das Kennwort nur für das lokale Konto zurücksetzen können.", @@ -735,12 +737,13 @@ "VIEW_BUTTON": "Anzeigen", "EDIT_BUTTON": "Bearbeiten", "DELETE_BUTTON": "Remove", + "SELECT_VERSION" : "Select version to be base in creator", "CONFIRM_REMOVAL" : { "HEADER": "Confirm application removal", - "DESCRIPTION": "Do you want to completely remove this application from the catalogue along with all its versions?", + "DESCRIPTION": "Do you want to completely remove this application from the catalogue?", "CANCEL" : "Cancel", "CONFIRM": "Confirm", - "DISABLED": "This application still has some currently running instances. Please undeploy them and proceed with the removal." + "DISABLED": "Some active versions of this application exist. Delete them and try again." }, "CHANGE_STATE_BUTTON": "Änderungsstatus", "CHANGE_OWNER_BUTTON": "Change owner", @@ -766,7 +769,7 @@ "UPDATE_CONFIG_WIZARD_PREVIEW_HEADER": "Aktualisiere Konfigurationsassistenten Vorschau" }, "APPS_WIZARD": { - "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the NMaaS portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in NMaaS.", + "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the nmaas portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in nmaas.", "ACCEPT_RULES_CHECKBOX": "I read the general instructions above", "NEXT_BUTTON": "Weiter", "SUBMIT_BUTTON": "Sende", @@ -799,7 +802,7 @@ "UPDATE_CONFIG_WIZARD_TEMPLATE_LABEL": "Anwendungskonfigurationsupdateassistent Vorlage", "NEW_APP_MODAL": { "HEADER": "Neue Anwendung ordnungsgemäß eingereicht", - "BODY": "Vielen Dank für das Einreichen der neuen Anwendung. Ihre Anfrage muss nun vom NMaaS-Team geprüft werden. Dies benötigt etwas Zeit.", + "BODY": "Vielen Dank für das Einreichen der neuen Anwendung. Ihre Anfrage muss nun vom nmaas-Team geprüft werden. Dies benötigt etwas Zeit.", "BACK_TO_APP_MANAGEMENT_BUTTON": "Zurück" }, "EDIT_APP_MODAL": { @@ -819,23 +822,23 @@ "ACCEPT_RULES_TOOLTIP": "Sie müssen den Bedingungen zustimmen!", "NAME_TOOLTIP": "Offizieller Anwendungsname.", "VERSION_TOOLTIP": "Aktuelle Release-Nummer der Anwendung.", - "LICENSE_TOOLTIP": "Geben Sie den Namen der Lizenz ein, unter der die Anwendung verteilt wird. Bitte vergewissern Sie sich, dass die Anwendung in NMaaS verwendet werden kann.", + "LICENSE_TOOLTIP": "Geben Sie den Namen der Lizenz ein, unter der die Anwendung verteilt wird. Bitte vergewissern Sie sich, dass die Anwendung in nmaas verwendet werden kann.", "LICENSE_URL_TOOLTIP": "Um dem Benutzer mehr Informationen über die Lizenz und die zu verwendenden Berechtigungen zu geben, geben Sie einen Link zur Lizenzbeschreibung an.", "PROJECT_WEBSITE_TOOLTIP": "Um dem Benutzer mehr Informationen über das gesamte Projekt zu geben, geben Sie einen Link zur Projekt-Website an.", "SOURCE_CODE_TOOLTIP": "URL zum Source Code des Projekts z.B. github.com/project.", "PROJECT_ISSUES_TOOLTIP": "Um sicherzustellen, dass Benutzer immer eine Möglichkeit haben, Fehler an das für das Tool verantwortliche Team zu melden, stellen Sie einen Link zur Verfügung, z.B. github.com/project/issues.", "TAGS_TOOLTIP": "Bitte wählen Sie Tags aus, welche die Anwendung beschreiben. Das hilft Benutzern die Anwendungen schneller zu finden.", "NEW_TAGS_TOOLTIP": "Sie können Ihrer Anwendungen neue Tags hinzufügen, falls bereits exisiterende Tags ihre Anwendung nicht ausreichend beschreiben. Schreiben Sie den Tag-Name und drücken Sie Enter um einen neuen Tag hinzuzufügen.", - "BRIEF_DESCRIPTION_TOOLTIP": "Geben Sie eine kurze Beschreibung der Anwendung ein. Dieser Text wird auf der NMaaS Market Seite sichtbar sein.", + "BRIEF_DESCRIPTION_TOOLTIP": "Geben Sie eine kurze Beschreibung der Anwendung ein. Dieser Text wird auf der nmaas Market Seite sichtbar sein.", "FULL_DESCRIPTION_TOOLTIP": "Geben Sie eine volle Beschreibung der Anwendung ein. Dieser Text wird auf der Seite der Anwendungsdetails sichtbar sein.", - "CHART_NAME_TOOLTIP": "Geben Sie den Namen des Charts ein, welcher in NMaaS benutzt werden soll.", - "CHART_VERSION_TOOLTIP": "Geben Sie die Version des Charts ein, welche in NMaaS benutzt werden soll.", + "CHART_NAME_TOOLTIP": "Geben Sie den Namen des Charts ein, welcher in nmaas benutzt werden soll.", + "CHART_VERSION_TOOLTIP": "Geben Sie die Version des Charts ein, welche in nmaas benutzt werden soll.", "HELM_CHART_REPOSITORY_NAME_TOOLTIP": "Enter Helm Chart Repository Name", "HELM_CHART_REPOSITORY_URL_TOOLTIP": "Enter Helm Chart URL address", "MAIN_DEPLOYMENT_NAME_TOOLTIP": "Enter the name of main component deployed by this chart.", "DEFAULT_STORAGE_SPACE_TOOLTIP": "Geben Sie den standard Speicherplatz (in GB) ein.", - "DEPLOY_PARAMETER_TOOLTIP": "Einige Anwendungen dürfen globale NMaaS Einstellungen verwenden. Wenn Sie einige davon benutzen möchten, spezifizieren Sie bitte wie wir die Variable übergeben sollen.", - "REPOSITORY_REQUIRED_TOOLTIP": "NMaaS kann GitLab für die Konfiguration jeder Instanz verwenden.", + "DEPLOY_PARAMETER_TOOLTIP": "Einige Anwendungen dürfen globale nmaas Einstellungen verwenden. Wenn Sie einige davon benutzen möchten, spezifizieren Sie bitte wie wir die Variable übergeben sollen.", + "REPOSITORY_REQUIRED_TOOLTIP": "nmaas kann GitLab für die Konfiguration jeder Instanz verwenden.", "DISABLED_NEXT_BUTTON_TOOLTIP": "Sie müssen alle benötigten Felder ausfüllen!", "DEPLOY_PARAMETERS_DROPDOWN": "Wählen Sie globale Installationsparamter aus", "CONFIG_FILENAME_LABEL": "Name der Konfigurationsdatei", @@ -854,8 +857,8 @@ "BASIC_APP_INFO_STEP_INFO": "Basic set of information about the application. Application can be filtered by tag. Select an existing tag or create a new one if none is suitable.", "LOGO_AND_SCREENSHOTS_STEP_INFO": "Application logo is displayed in various views in the application. A set of screenshots should give a nice overview of the application's UI.", "APP_DESCRIPTIONS_STEP_INFO": "Brief and full descriptions of the application should provide a basic (limited length) and comprehensive information about the nature and purpose of the application. Descriptions should be provided in as many supported languages as possible.", - "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through NMaaS are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", - "CONFIG_TEMPLATES_STEP_INFO": "NMaaS applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", "BASIC_AUTH_LABEL": "Benötigt Grundberechtigung", + "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through nmaas are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", + "CONFIG_TEMPLATES_STEP_INFO": "nmaas applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", "BASIC_AUTH_LABEL": "Benötigt Grundberechtigung", "BASIC_AUTH_TOOLTIP": "Sie können eine Grundberechtigung für Ihre Anwendung hinzufügen, indem Sie einfach dieses Kontrollkästchen markieren.", "TERMS_ACCEPTANCE_LABEL": "Terms acceptance required", "TERMS_ACCEPTANCE_TOOLTIP": "If application has some special license requirements, you can provide them", @@ -879,8 +882,8 @@ "CONFIG_UPDATE_ENABLED": "Enable configuration updates", "STATIC_GLOBAL_DEPLOY_PARAMETERS": "Static global deploy parameters", "DEPLOY_PARAMETERS": "Global deploy parameters", - "PROJECT_NMAAS_DOCUMENTATION_LABEL": "NMaaS Documentation URL", - "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to NMaaS Documentatnion (NMaaS Tools)", + "PROJECT_NMAAS_DOCUMENTATION_LABEL": "nmaas Documentation URL", + "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to nmaas Documentatnion (nmaas Tools)", "RAW_JSON": "Raw JSON format", "FORM_BUILDER": "Form builder", "FORM_DEFINITION": "Form definition", @@ -930,13 +933,14 @@ "REASON": "Reason", "REASON_PLACEHOLDER": "Please explain your decision", "CANCEL_BUTTON": "Cancel", - "CHANGE_STATE_BUTTON": "Change state" + "CHANGE_STATE_BUTTON": "Change state", + "ERROR_DELETED" : "Not possible to delete this application version due to running instances. Uninstall those instances and try again." }, "ABOUT": { "CONTACT_TITLE": "Kontaktieren Sie uns", "CHANGELOG_TITLE": "Aktuelle Softwareversion und Änderungsprotokoll", - "CONTACT_DESC": "Das Kontaktformular bietet eine einfache Möglichkeit, mit dem NMaaS-Team in Kontakt zu treten. Wählen Sie den Formulartyp, der für Ihre Anfrage am besten geeignet ist.", - "CHANGELOG_DESC": "Im Folgenden finden Sie detaillierte Informationen zur aktuellen NMaaS-Version und eine Zusammenfassung der Änderungen, die in früheren Softwareversionen vorgenommen wurden." + "CONTACT_DESC": "Das Kontaktformular bietet eine einfache Möglichkeit, mit dem nmaas-Team in Kontakt zu treten. Wählen Sie den Formulartyp, der für Ihre Anfrage am besten geeignet ist.", + "CHANGELOG_DESC": "Im Folgenden finden Sie detaillierte Informationen zur aktuellen nmaas-Version und eine Zusammenfassung der Änderungen, die in früheren Softwareversionen vorgenommen wurden." }, "CHANGELOG": { "CHANGELOG_LAST": "Letzte Veröffentlichung", @@ -966,17 +970,17 @@ "DOMAIN_CODENAME_DESCRIPTION": "Kurzfassung des Domainnamens (bis zu 12 Zeichen)", "DOMAIN_CODENAME_ERROR": "Ungültiger Domain-Codename", "JUSTIFICATION": "Bitte um Begründung", - "JUSTIFICATION_DESCRIPTION": "Kurze Begründung für die Erstellung der neuen Domain, einschließlich des Namens der anfragenden Institution und des Hauptzwecks für die Bereitstellung von NMaaS-Anwendungen", + "JUSTIFICATION_DESCRIPTION": "Kurze Begründung für die Erstellung der neuen Domain, einschließlich des Namens der anfragenden Institution und des Hauptzwecks für die Bereitstellung von nmaas-Anwendungen", "VPN_OPTION": "VPN solution", "VPN_OPTION_DESCRIPTION": "Two types of software-based VPN solutions are currently supported. Select the preferred one", "VPN_USER_IP": "Public IP for VPN tunnel setup", "VPN_USER_IP_DESCRIPTION": "Public IP for VPN tunnel termination on user end", "VPN_USER_SUBNETS": "Monitored user subnets", - "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on NMaaS", + "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on nmaas", "VPN_USER_SUBNETS_ADD": "Add subnet", "VPN_USER_SUBNETS_SUBNET": "Subnet", "ADDITIONAL_VPN_SUBNETS": "Additional subnets", - "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your NMaaS applications, outside those specified above (e.g. some public services)", + "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your nmaas applications, outside those specified above (e.g. some public services)", "TECH_CONTACT": "Technical contact", "TECH_CONTACT_DESCRIPTION": "Person to be contacted to further discuss technical matters related with VPN setup", "TECH_CONTACT_PLACEHOLDER": "Name and email", @@ -991,7 +995,7 @@ }, "MODAL": { "TITLE": "Mail wurde versendet", - "MESSAGE": "Das NMaaS Team wird bald antworten.", + "MESSAGE": "Das nmaas Team wird bald antworten.", "CLOSE_BUTTON": "Schließen" }, "SELECT_CATEGORY": "Select category", @@ -1243,8 +1247,9 @@ }, "REMOVE" : { "HEADER" : "Remove bulk deployment", - "APP" : "Do you want to remove all instances created by this bulk ? ", - "REMOVE" : "Remove" + "APP" : "Do you want to remove all instances created by this bulk deployment?", + "REMOVE" : "Remove", + "ERROR": "Error removing bulk deployment:" } }, "SHARED" : { diff --git a/src/test/shell/data/i18n/en.json b/src/test/shell/data/i18n/en.json index c04aeb3f4fd848eb8296acc02e0577ed12738377..93077028cf154bffb800cabf2c4f5fb69f59e8ad 100644 --- a/src/test/shell/data/i18n/en.json +++ b/src/test/shell/data/i18n/en.json @@ -32,28 +32,28 @@ "REGISTER": "Register", "TITLE1": "Network Management as a Service", "TITLE2": "provides a portfolio of network management applications run as dedicated per-user instances in the cloud.", - "INTRO_TEXT": "GÉANT’s NMaaS service includes three aspects: providing, managing and maintaining the infrastructure of the NMaaS service portal, platform and selected tools, supporting users in using the system, and the selected tools for monitoring their networks via NMaaS, as well as supporting users that contribute their software to NMaaS system.", + "INTRO_TEXT": "GÉANT’s nmaas service includes three aspects: providing, managing and maintaining the infrastructure of the nmaas service portal, platform and selected tools, supporting users in using the system, and the selected tools for monitoring their networks via nmaas, as well as supporting users that contribute their software to nmaas system.", "TARGET_USERS_HEADER": "Target users", - "TARGET_USERS_TEXT": "NMaaS users are organisations that do not want to own NMS infrastructure themselves and/or want to outsource network management, as well as organisations and/or individuals that are searching for quality network management software or who want to share their software within the community.", - "MARKETPLACE_HEADER": "NMaaS Marketplace", - "MARKETPLACE_TEXT": "NMaaS Marketplace is a catalogue of available open source tools, supported by community, distributed free, chosen by administration. There is also place for your application choice - you can propose new applications. ", + "TARGET_USERS_TEXT": "nmaas users are organisations that do not want to own NMS infrastructure themselves and/or want to outsource network management, as well as organisations and/or individuals that are searching for quality network management software or who want to share their software within the community.", + "MARKETPLACE_HEADER": "nmaas Marketplace", + "MARKETPLACE_TEXT": "nmaas Marketplace is a catalogue of available open source tools, supported by community, distributed free, chosen by administration. There is also place for your application choice - you can propose new applications. ", "COST_REDUCTION_HEADER": "Cost reduction", - "COST_REDUCTION_TEXT": "With NMaaS, users do not have to bear the ownership costs and risks related to maintenance and control of the network management infrastructure.", + "COST_REDUCTION_TEXT": "With nmaas, users do not have to bear the ownership costs and risks related to maintenance and control of the network management infrastructure.", "SECURITY_HEADER": "Security", - "SECURITY_TEXT": "With NMaaS, you don't have to worry about security. We provide safe connection to separated instances by VPN to your network - to allow institutions and projects to safe management of network.", + "SECURITY_TEXT": "With nmaas, you don't have to worry about security. We provide safe connection to separated instances by VPN to your network - to allow institutions and projects to safe management of network.", "SCALING_HEADER": "Flexible scaling", - "SCALING_TEXT": "If You need some horizontal scaling - there is no problem with that on NMaaS. You can very easily scale Your instances in few minutes.", - "NMAAS_FEATURES_HEADER": "NMaaS Features", + "SCALING_TEXT": "If You need some horizontal scaling - there is no problem with that on nmaas. You can very easily scale Your instances in few minutes.", + "NMAAS_FEATURES_HEADER": "nmaas Features", "APP_MARKET_HEADER": "Application Market", "APP_MARKET_TEXT": "At store You can find top picked applications to manage and maintain Your network infrastructure, chosen by administrators and community.", "OWN_APPS_HEADER": "Own applications", - "OWN_APPS_TEXT": "You want to share your own application with the community? NMaaS is open for addition of new applications.", + "OWN_APPS_TEXT": "You want to share your own application with the community? nmaas is open for addition of new applications.", "EDUGAIN_SUPPORT_HEADER": "eduGAIN support", "EDUGAIN_SUPPORT_TEXT": "You don't need to create a new account. Login using an existing account from you identity provider federated under eduGAIN.", "FAST_DEPLOYMENT_HEADER": "Fast & easy deployment", "FAST_DEPLOYMENT_TEXT": "Upon your request applications are deployed within minutes with custom configuration provided through a simple wizard.", "WEB_PORTAL_HEADER": "Modern user interface", - "WEB_PORTAL_TEXT": "NMaaS provides a modern web-based user portal that follows reactive design principle.", + "WEB_PORTAL_TEXT": "nmaas provides a modern web-based user portal that follows reactive design principle.", "KUBERNETES_HEADER": "Kubernetes deployment", "KUBERNETES_TEXT": "User application instances are deployed in Kubernetes cluster run on top of dedicated hardware infrastructure assuring high performance and reliability.", "TECHNOLOGIES_USED_HEADER": "Technologies used", @@ -94,8 +94,8 @@ "USER_DISABLED_MESSAGE": "User is disabled" }, "TEST_INSTANCE_MODAL": { - "HEADER": "NMaaS test instance", - "BODY": "Please be aware that this is a test NMaaS instance. The user isolation and data security measures are not so strict as on the production instance. Do not use this instance to monitor real equipment.", + "HEADER": "nmaas test instance", + "BODY": "Please be aware that this is a test nmaas instance. The user isolation and data security measures are not so strict as on the production instance. Do not use this instance to monitor real equipment.", "OK_BUTTON": "OK" }, "PROVIDE_SSH_KEY_MODAL": { @@ -248,10 +248,10 @@ }, "ANNOTATIONS" : { "HEADER" : "Domain annotations", - "SUBHEADER" : "Global domain annotations. This set of annotations will be added to each domain creation.", + "SUBHEADER" : "Global domain annotations. This set of annotations will be added to Kubernetes objects created for each new domain.", "CREATION" : "Domain namespace annotations", "ADD" : "Add annotation", - "KEY" : "Key", + "KEY" : "Key", "VALUE" : "Value", "EDIT" : "Edit global annotations" } @@ -314,7 +314,7 @@ "NOT_FOUND_ERROR": "Not found" }, "PORTAL_CONFIGURATION": { - "TITLE": "Portal configuration", + "TITLE": "Platform settings", "MAINTENANCE": "Maintenance", "ALLOW_SSO_LOGIN": "Allow SSO login", "SUBMIT_BUTTON": "Submit", @@ -323,11 +323,12 @@ "LANGUAGE_SUPPORT": "Supported languages", "LANGUAGE_ENABLED": "Enabled", "LANGUAGE_DISABLED": "Disabled", - "TEST_INSTANCE": "Mark as test NMaaS instance", + "TEST_INSTANCE": "Mark as test nmaas instance", "SEND_APP_INSTANCE_FAILURE_EMAILS": "Send emails when app instance fails to deploy", - "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Emails list", - "DOMAIN_SELECTION_ENABLED" : "Domain selection during registration" - + "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Recipients of app deployment failed emails", + "DOMAIN_SELECTION_ENABLED" : "Domain selection during registration", + "BULK_DOMAINS_ALLOW_FOR_SSO_ACCOUNTS" : "Allow for creation or update of a SSO-enabled account in bulk process", + "BULK_DOMAINS_SEND_EMAIL_FOR_NEW_ACCOUNTS" : "Send notification email for new accounts created in bulk process" }, "DOMAIN_DETAILS": { "TITLE": "Domain details", @@ -387,7 +388,7 @@ } }, "GIT_INFO": { - "HEADER": "NMaaS version information", + "HEADER": "nmaas version information", "VERSION": "Version", "BUILD_TIME": "Build time", "LAST_COMMIT": "Last commit", @@ -551,7 +552,7 @@ "STATE": "State", "DEFAULT_ERROR_STATE": "Something went wrong", "DETAILS": "Details", - "DEFAULT_ERROR_MESSAGE": "Application deployment failed due to an unexpected error. NMaaS support team has been notified already.<br>In order to raise an issue use the <a href=\"about?type=ISSUE_REPORT\">contact form</a>." + "DEFAULT_ERROR_MESSAGE": "Application deployment failed due to an unexpected error. nmaas support team has been notified already.<br>In order to raise an issue use the <a href=\"about?type=ISSUE_REPORT\">contact form</a>." }, "DEPLOYMENT_HISTORY": { "HEADER": "Deployment history", @@ -564,7 +565,7 @@ "ADVANCED_TAB": "Advanced", "ADDITIONAL_TAB": "Additional parameters", "STORAGE_SPACE": "Storage space", - "NMAAS_TOOLS": "NMaaS Tools Page", + "NMAAS_TOOLS": "nmaas Tools Page", "DOCUMENTATION_INFO": "Detailed field descriptions are available at", "PREVIEW": "Configuration preview" }, @@ -694,11 +695,11 @@ }, "RESET_PASSWORD": { "FORGOT_PASSWORD_BUTTON": "Forgot password", - "TEXT": "To reset your password, enter the email address you used to sign in to NMaaS.", + "TEXT": "To reset your password, enter the email address you used to sign in to nmaas.", "SUBMIT_BUTTON": "Submit", "EMAIL": "Email", "INVALID_TOKEN": "Your link has already expired. Please fill out forget password form again.", - "GO_BACK": "Go back to the NMaaS page", + "GO_BACK": "Go back to the nmaas page", "MODAL": { "HEADER": "Please check your email", "BODY": "If you have provided valid email we will send to you link for resetting password. Please be advised that you can only reset password for local account.", @@ -736,12 +737,13 @@ "VIEW_BUTTON": "View", "EDIT_BUTTON": "Edit", "DELETE_BUTTON": "Remove", + "SELECT_VERSION" : "Select version to be base in creator", "CONFIRM_REMOVAL" : { "HEADER": "Confirm application removal", - "DESCRIPTION": "Do you want to completely remove this application from the catalogue along with all its versions?", + "DESCRIPTION": "Do you want to completely remove this application from the catalogue?", "CANCEL" : "Cancel", "CONFIRM": "Confirm", - "DISABLED": "This application still has some currently running instances. Please undeploy them and proceed with the removal." + "DISABLED": "Some active versions of this application exist. Delete them and try again." }, "CHANGE_STATE_BUTTON": "Change state", "CHANGE_OWNER_BUTTON": "Change owner", @@ -767,7 +769,7 @@ "UPDATE_CONFIG_WIZARD_PREVIEW_HEADER": "Update configuration wizard preview" }, "APPS_WIZARD": { - "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the NMaaS portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in NMaaS.", + "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the nmaas portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in nmaas.", "ACCEPT_RULES_CHECKBOX": "I read the general instructions above", "NEXT_BUTTON": "Next", "SUBMIT_BUTTON": "Submit", @@ -800,7 +802,7 @@ "UPDATE_CONFIG_WIZARD_TEMPLATE_LABEL": "Application update configuration wizard template", "NEW_APP_MODAL": { "HEADER": "New application submitted correctly", - "BODY": "Thank you for submitting new application. Your request must be now reviewed by NMaaS Team. It may take some time.", + "BODY": "Thank you for submitting new application. Your request must be now reviewed by nmaas Team. It may take some time.", "BACK_TO_APP_MANAGEMENT_BUTTON": "Back" }, "EDIT_APP_MODAL": { @@ -820,23 +822,23 @@ "ACCEPT_RULES_TOOLTIP": "You have to accept the rules!", "NAME_TOOLTIP": "Official application name.", "VERSION_TOOLTIP": "Current release number of application.", - "LICENSE_TOOLTIP": "Enter name of license under which application is distributed. Please make sure that application can be used in NMaaS.", + "LICENSE_TOOLTIP": "Enter name of license under which application is distributed. Please make sure that application can be used in nmaas.", "LICENSE_URL_TOOLTIP": "To give user more information about license and permissions to use, provide link to license description.", "PROJECT_WEBSITE_TOOLTIP": "To give user more information about whole project, provide link to project website.", "SOURCE_CODE_TOOLTIP": "Url to project source code e.g. github.com/project.", "PROJECT_ISSUES_TOOLTIP": "To be sure that users can always find way to report bug to team responsible for tool, provide link to issues, e.g. github.com/project/issues.", "TAGS_TOOLTIP": "Please select tags which describes application. This will help users to find applications more effectively.", "NEW_TAGS_TOOLTIP": "You can add tags for your application if existing tags doesn't describe your application well. Type tag name and press enter to add new tag.", - "BRIEF_DESCRIPTION_TOOLTIP": "Enter brief description of application. This text will be displayed on NMaaS market page.", + "BRIEF_DESCRIPTION_TOOLTIP": "Enter brief description of application. This text will be displayed on nmaas market page.", "FULL_DESCRIPTION_TOOLTIP": "Enter full description of application. This text will be displayed on application details page.", - "CHART_NAME_TOOLTIP": "Enter name of chart, which will be used in NMaaS.", - "CHART_VERSION_TOOLTIP": "Enter version of chart, which will be used in NMaaS.", + "CHART_NAME_TOOLTIP": "Enter name of chart, which will be used in nmaas.", + "CHART_VERSION_TOOLTIP": "Enter version of chart, which will be used in nmaas.", "HELM_CHART_REPOSITORY_NAME_TOOLTIP": "Enter Helm Chart Repository Name", "HELM_CHART_REPOSITORY_URL_TOOLTIP": "Enter Helm Chart URL address", "MAIN_DEPLOYMENT_NAME_TOOLTIP": "Enter the name of main component deployed by this chart.", "DEFAULT_STORAGE_SPACE_TOOLTIP": "Enter default storage space required by the application (in gigabytes). This value can be changed by the user during deployment.", - "DEPLOY_PARAMETER_TOOLTIP": "Some applications may use global NMaaS settings. If you want to use one of them please specify how we should pass that variable.", - "REPOSITORY_REQUIRED_TOOLTIP": "NMaaS can use GitLab to store configuration of each instance.", + "DEPLOY_PARAMETER_TOOLTIP": "Some applications may use global nmaas settings. If you want to use one of them please specify how we should pass that variable.", + "REPOSITORY_REQUIRED_TOOLTIP": "nmaas can use GitLab to store configuration of each instance.", "DISABLED_NEXT_BUTTON_TOOLTIP": "You have to fill all required fields!", "DEPLOY_PARAMETERS_DROPDOWN": "Select global deployment parameters", "CONFIG_FILENAME_LABEL": "Configuration file name", @@ -855,8 +857,8 @@ "BASIC_APP_INFO_STEP_INFO": "Basic set of information about the application. Application can be filtered by tag. Select an existing tag or create a new one if none is suitable.", "LOGO_AND_SCREENSHOTS_STEP_INFO": "Application logo is displayed in various views in the application. A set of screenshots should give a nice overview of the application's UI.", "APP_DESCRIPTIONS_STEP_INFO": "Brief and full descriptions of the application should provide a basic (limited length) and comprehensive information about the nature and purpose of the application. Descriptions should be provided in as many supported languages as possible.", - "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through NMaaS are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", - "CONFIG_TEMPLATES_STEP_INFO": "NMaaS applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", + "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through nmaas are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", + "CONFIG_TEMPLATES_STEP_INFO": "nmaas applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", "BASIC_AUTH_LABEL": "Requires basic authentication", "BASIC_AUTH_TOOLTIP": "You can add basic authentication for your application simply by checking this checkbox.", "TERMS_ACCEPTANCE_LABEL": "Terms acceptance required", @@ -881,8 +883,8 @@ "CONFIG_UPDATE_ENABLED": "Enable configuration updates", "STATIC_GLOBAL_DEPLOY_PARAMETERS": "Static global deploy parameters", "DEPLOY_PARAMETERS": "Global deploy parameters", - "PROJECT_NMAAS_DOCUMENTATION_LABEL": "NMaaS Documentation URL", - "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to NMaaS Documentation (NMaaS Tools)", + "PROJECT_NMAAS_DOCUMENTATION_LABEL": "nmaas Documentation URL", + "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to nmaas Documentation (nmaas Tools)", "RAW_JSON": "Raw JSON format", "FORM_BUILDER": "Form builder", "FORM_DEFINITION": "Form definition", @@ -932,13 +934,14 @@ "REASON": "Reason", "REASON_PLACEHOLDER": "Please explain your decision", "CANCEL_BUTTON": "Cancel", - "CHANGE_STATE_BUTTON": "Change state" + "CHANGE_STATE_BUTTON": "Change state", + "ERROR_DELETED" : "Not possible to delete this application version due to running instances. Uninstall those instances and try again." }, "ABOUT": { "CONTACT_TITLE": "Contact us", "CHANGELOG_TITLE": "Current software version and changelog", - "CONTACT_DESC": "Contact form offers an easy way to get in touch with the NMaaS team. Choose the type of form that is most suitable for your request.", - "CHANGELOG_DESC": "Below you will find detailed information about the current NMaaS version and summary of changes introduced in previous software releases." + "CONTACT_DESC": "Contact form offers an easy way to get in touch with the nmaas team. Choose the type of form that is most suitable for your request.", + "CHANGELOG_DESC": "Below you will find detailed information about the current nmaas version and summary of changes introduced in previous software releases." }, "CHANGELOG": { "CHANGELOG_LAST": "Latest release", @@ -968,17 +971,17 @@ "DOMAIN_CODENAME_DESCRIPTION": "Abbreviated version of the domain name (up to 12 characters)", "DOMAIN_CODENAME_ERROR": "Invalid domain codename", "JUSTIFICATION": "Request justification", - "JUSTIFICATION_DESCRIPTION": "Brief justification of the request including intended use of the NMaaS service", + "JUSTIFICATION_DESCRIPTION": "Brief justification of the request including intended use of the nmaas service", "VPN_OPTION": "VPN solution", "VPN_OPTION_DESCRIPTION": "Two types of software-based VPN solutions are currently supported. Select the preferred one", "VPN_USER_IP": "Public IP for VPN tunnel setup", "VPN_USER_IP_DESCRIPTION": "Public IP for VPN tunnel termination on user end", "VPN_USER_SUBNETS": "Monitored user subnets", - "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on NMaaS", + "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on nmaas", "VPN_USER_SUBNETS_ADD": "Add subnet", "VPN_USER_SUBNETS_SUBNET": "Subnet", "ADDITIONAL_VPN_SUBNETS": "Additional subnets", - "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your NMaaS applications, outside those specified above (e.g. some public services)", + "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your nmaas applications, outside those specified above (e.g. some public services)", "TECH_CONTACT": "Technical contact", "TECH_CONTACT_DESCRIPTION": "Person to be contacted to further discuss technical matters related with VPN setup", "TECH_CONTACT_PLACEHOLDER": "Name and email", @@ -993,7 +996,7 @@ }, "MODAL": { "TITLE": "Mail sent", - "MESSAGE": "The NMaaS Team will reply as soon as possible.", + "MESSAGE": "The nmaas Team will reply as soon as possible.", "CLOSE_BUTTON": "Close" }, "SELECT_CATEGORY": "Select form type", @@ -1247,8 +1250,9 @@ }, "REMOVE" : { "HEADER" : "Remove bulk deployment", - "APP" : "Do you want to remove all instances created by this bulk ? ", - "REMOVE" : "Remove" + "APP" : "Do you want to remove all instances created by this bulk deployment?", + "REMOVE" : "Remove", + "ERROR": "Error removing bulk deployment:" } }, "SHARED" : { diff --git a/src/test/shell/data/i18n/fr.json b/src/test/shell/data/i18n/fr.json index 5c11bc30c5e1cd76c55db7a82487be3a46e68c29..2a7b0829c24d5b9040062136bf67d4990d553d79 100644 --- a/src/test/shell/data/i18n/fr.json +++ b/src/test/shell/data/i18n/fr.json @@ -32,18 +32,18 @@ "REGISTER": "S'enregistrer", "TITLE1": "Network Management as a Service", "TITLE2": "Un portefeuille d'applications de gestion de réseau privé dans le cloud.", - "INTRO_TEXT": "Le service GÉANT NMaaS est une plateforme de fourniture d'application de gestion de réseau accessible par le bias d'un \"App store\" communautaire.", + "INTRO_TEXT": "Le service GÉANT nmaas est une plateforme de fourniture d'application de gestion de réseau accessible par le bias d'un \"App store\" communautaire.", "TARGET_USERS_HEADER": "Utilisateurs", - "TARGET_USERS_TEXT": "Les utilisateurs cible de NMaaS sont les organisations qui veulent externaliser mais également partager leur outil de gestion de réseau.", + "TARGET_USERS_TEXT": "Les utilisateurs cible de nmaas sont les organisations qui veulent externaliser mais également partager leur outil de gestion de réseau.", "MARKETPLACE_HEADER": "App store", - "MARKETPLACE_TEXT": "NMaaS fournit de la supervision dans le cloud. Il est possible de souscrire aux applications les plus populaires, mais également il vous est possible de publier vos applications.", + "MARKETPLACE_TEXT": "nmaas fournit de la supervision dans le cloud. Il est possible de souscrire aux applications les plus populaires, mais également il vous est possible de publier vos applications.", "COST_REDUCTION_HEADER": "Réduction des coûts", - "COST_REDUCTION_TEXT": "Avec NMaaS, les utilisateurs n'ont plus à maintenir les infrastructures de supervision.", + "COST_REDUCTION_TEXT": "Avec nmaas, les utilisateurs n'ont plus à maintenir les infrastructures de supervision.", "SECURITY_HEADER": "Sécurité", - "SECURITY_TEXT": "Dans NMaaS, Chaque organisation possède un accès VPN sécurisé à ces applications. Un autre VPN sécurisé est utilisé pour communiquer avec les équipements supervisés", + "SECURITY_TEXT": "Dans nmaas, Chaque organisation possède un accès VPN sécurisé à ces applications. Un autre VPN sécurisé est utilisé pour communiquer avec les équipements supervisés", "SCALING_HEADER": "Passage à l'echelle horizontale", "SCALING_TEXT": "De nouvelles instances peuvent être déployer en cas d'augmentation du nombre d'élément à superviser", - "NMAAS_FEATURES_HEADER": "Les principales fonctionnaités de NMaaS", + "NMAAS_FEATURES_HEADER": "Les principales fonctionnaités de nmaas", "APP_MARKET_HEADER": "App store", "APP_MARKET_TEXT": "Vous pouvez trouver non seulement les applications officielles, sélectionnéss par l'administrateur, mais aussi les applications communautaires publiées par les usagers.", "OWN_APPS_HEADER": "Systéme de notation", @@ -94,8 +94,8 @@ "USER_DISABLED_MESSAGE": "User is disabled" }, "TEST_INSTANCE_MODAL": { - "HEADER": "Instance de test NMaaS", - "BODY": "Veuillez noter qu'il s'agit d'une instance de test NMaaS. Les mesures d'isolation de l'utilisateur et de sécurité des données ne sont pas aussi strictes que sur l'instance de production. N'utilisez pas cette instance pour surveiller un équipement réel.", + "HEADER": "Instance de test nmaas", + "BODY": "Veuillez noter qu'il s'agit d'une instance de test nmaas. Les mesures d'isolation de l'utilisateur et de sécurité des données ne sont pas aussi strictes que sur l'instance de production. N'utilisez pas cette instance pour surveiller un équipement réel.", "OK_BUTTON": "OK" }, "PROVIDE_SSH_KEY_MODAL": { @@ -248,10 +248,10 @@ }, "ANNOTATIONS" : { "HEADER" : "Domain annotations", - "SUBHEADER" : "Global domain annotations. This set of annotations will be added to each domain creation.", + "SUBHEADER" : "Global domain annotations. This set of annotations will be added to Kubernetes objects created for each new domain.", "CREATION" : "Domain namespace annotations", "ADD" : "Add annotation", - "KEY" : "Key", + "KEY" : "Key", "VALUE" : "Value", "EDIT" : "Edit global annotations" } @@ -323,10 +323,12 @@ "LANGUAGE_SUPPORT": "Langues supportées", "LANGUAGE_ENABLED": "Activé", "LANGUAGE_DISABLED": "Désactivé", - "TEST_INSTANCE": "Marquer comme instance de test NMaaS", + "TEST_INSTANCE": "Marquer comme instance de test nmaas", "SEND_APP_INSTANCE_FAILURE_EMAILS": "Send emails when app instance fails to deploy", - "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Emails list", - "DOMAIN_SELECTION_ENABLED" : "Sélection de domaine lors de l'enregistrement" + "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Recipients of app deployment failed emails", + "DOMAIN_SELECTION_ENABLED" : "Sélection de domaine lors de l'enregistrement", + "BULK_DOMAINS_ALLOW_FOR_SSO_ACCOUNTS" : "Allow for creation or update of a SSO-enabled account in bulk process", + "BULK_DOMAINS_SEND_EMAIL_FOR_NEW_ACCOUNTS" : "Send notification email for new accounts created in bulk process" }, "DOMAIN_DETAILS": { "TITLE": "Détails de l'organisation", @@ -386,7 +388,7 @@ } }, "GIT_INFO": { - "HEADER": "NMaaS version", + "HEADER": "nmaas version", "VERSION": "Version", "BUILD_TIME": "Build time", "LAST_COMMIT": "Dernier commit", @@ -550,7 +552,7 @@ "STATE": "Etat", "DEFAULT_ERROR_STATE": "Une erreur est survenue", "DETAILS": "Details", - "DEFAULT_ERROR_MESSAGE": "Le déploiement de l'application a échoué en raison d'une erreur inattendue. L'équipe d'assistance NMaaS a déjà été notifiée.<br>Pour signaler un problème, utilisez le <a href=\"about?type=ISSUE_REPORT\">formulaire de contact</a>." + "DEFAULT_ERROR_MESSAGE": "Le déploiement de l'application a échoué en raison d'une erreur inattendue. L'équipe d'assistance nmaas a déjà été notifiée.<br>Pour signaler un problème, utilisez le <a href=\"about?type=ISSUE_REPORT\">formulaire de contact</a>." }, "DEPLOYMENT_HISTORY": { "HEADER": "Historique des éeploiements", @@ -563,7 +565,7 @@ "ADVANCED_TAB": "Avancé...", "ADDITIONAL_TAB": "Parametres additionnels", "STORAGE_SPACE": "Espace de stockage", - "NMAAS_TOOLS": "NMaaS Tools Page", + "NMAAS_TOOLS": "nmaas Tools Page", "DOCUMENTATION_INFO": "Des descriptions détaillées des champs sont disponibles sur", "PREVIEW": "Configuration preview" }, @@ -618,17 +620,17 @@ "APP_UPGRADE_FAILED": "La mise à niveau de l'application a échoué" }, "USER_FRIENDLY": { - "REQUESTED": "NMaaS traite votre demande", - "VALIDATION": "NMaaS valide les ressources disponibles", - "PREPARATION": "NMaaS prépare l'environnement de déploiement de votre application", - "CONNECTING": "NMaaS met en place une connectivité sécurisée à votre équipement", + "REQUESTED": "nmaas traite votre demande", + "VALIDATION": "nmaas valide les ressources disponibles", + "PREPARATION": "nmaas prépare l'environnement de déploiement de votre application", + "CONNECTING": "nmaas met en place une connectivité sécurisée à votre équipement", "CONFIGURATION_AWAITING": "Votre instance d'application a été déployée avec succès. <br>Pour continuer, effectuez la première configuration à l'aide du bouton d'action <i>Configurer</i>.", "DEPLOYING": "L'application est en cours d'activation. Ce processus peut prendre plusieurs minutes. <br>Vous serez averti par e-mail une fois que votre instance sera prête", "RUNNING": "Votre application est maintenant active. Vous pouvez y accéder en utilisant l'option <i>Accès</i> du menu <i>Actions</i>. <br>Utilisez les options <i>Configurer</i> et <i>Membres</i> pour mettre à jour respectivement la configuration et la liste des utilisateurs de l'application.", "UNDEPLOYING": "L'application n'est pas déployée. Ce processus peut prendre plusieurs minutes", "DONE": "Application non déployée avec succès", "FAILURE": "", - "UNKNOWN": "Etat inconnu de l'application - Contact avec l'équipe NMaaS à l'aide du formulaire de contact disponible sur la sous-page \" A propos \"", + "UNKNOWN": "Etat inconnu de l'application - Contact avec l'équipe nmaas à l'aide du formulaire de contact disponible sur la sous-page \" A propos \"", "REMOVED": "Application non déployée avec succès" }, "SHOW_VERSIONS_LABEL": "Afficher les versions disponibles", @@ -734,12 +736,13 @@ "VIEW_BUTTON": "View", "EDIT_BUTTON": "Edit", "DELETE_BUTTON": "Remove", + "SELECT_VERSION" : "Select version to be base in creator", "CONFIRM_REMOVAL" : { "HEADER": "Confirm application removal", - "DESCRIPTION": "Do you want to completely remove this application from the catalogue along with all its versions?", + "DESCRIPTION": "Do you want to completely remove this application from the catalogue?", "CANCEL" : "Cancel", "CONFIRM": "Confirm", - "DISABLED": "This application still has some currently running instances. Please undeploy them and proceed with the removal." + "DISABLED": "Some active versions of this application exist. Delete them and try again." }, "CHANGE_STATE_BUTTON": "Change state", "CHANGE_OWNER_BUTTON": "Change owner", @@ -765,7 +768,7 @@ "UPDATE_CONFIG_WIZARD_PREVIEW_HEADER": "Update configuration wizard preview" }, "APPS_WIZARD": { - "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the NMaaS portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in NMaaS.", + "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the nmaas portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in nmaas.", "ACCEPT_RULES_CHECKBOX": "I read the general instructions above", "NEXT_BUTTON": "Next", "SUBMIT_BUTTON": "Submit", @@ -798,7 +801,7 @@ "UPDATE_CONFIG_WIZARD_TEMPLATE_LABEL": "Application update configuration wizard template", "NEW_APP_MODAL": { "HEADER": "New application submitted correctly", - "BODY": "Thank you for submitting new application. Your request must be now reviewed by NMaaS Team. It may take some time.", + "BODY": "Thank you for submitting new application. Your request must be now reviewed by nmaas Team. It may take some time.", "BACK_TO_APP_MANAGEMENT_BUTTON": "Back" }, "EDIT_APP_MODAL": { @@ -818,23 +821,23 @@ "ACCEPT_RULES_TOOLTIP": "You have to accept the rules!", "NAME_TOOLTIP": "Official application name.", "VERSION_TOOLTIP": "Current release number of application.", - "LICENSE_TOOLTIP": "Enter name of license under which application is distributed. Please make sure that application can be used in NMaaS.", + "LICENSE_TOOLTIP": "Enter name of license under which application is distributed. Please make sure that application can be used in nmaas.", "LICENSE_URL_TOOLTIP": "To give user more information about license and permissions to use, provide link to license description.", "PROJECT_WEBSITE_TOOLTIP": "To give user more information about whole project, provide link to project website.", "SOURCE_CODE_TOOLTIP": "Url to project source code e.g. github.com/project.", "PROJECT_ISSUES_TOOLTIP": "To be sure that users can always find way to report bug to team responsible for tool, provide link to issues, e.g. github.com/project/issues.", "TAGS_TOOLTIP": "Please select tags which describes application. This will help users to find applications more effectively.", "NEW_TAGS_TOOLTIP": "You can add tags for your application if existing tags doesn't describe your application well. Type tag name and press enter to add new tag.", - "BRIEF_DESCRIPTION_TOOLTIP": "Enter brief description of application. This text will be displayed on NMaaS market page.", + "BRIEF_DESCRIPTION_TOOLTIP": "Enter brief description of application. This text will be displayed on nmaas market page.", "FULL_DESCRIPTION_TOOLTIP": "Enter full description of application. This text will be displayed on application details page.", - "CHART_NAME_TOOLTIP": "Enter name of chart, which will be used in NMaaS.", - "CHART_VERSION_TOOLTIP": "Enter version of chart, which will be used in NMaaS.", + "CHART_NAME_TOOLTIP": "Enter name of chart, which will be used in nmaas.", + "CHART_VERSION_TOOLTIP": "Enter version of chart, which will be used in nmaas.", "HELM_CHART_REPOSITORY_NAME_TOOLTIP": "Enter Helm Chart Repository Name", "HELM_CHART_REPOSITORY_URL_TOOLTIP": "Enter Helm Chart URL address", "MAIN_DEPLOYMENT_NAME_TOOLTIP": "Enter the name of main component deployed by this chart.", "DEFAULT_STORAGE_SPACE_TOOLTIP": "Enter default storage space (in gigabytes).", - "DEPLOY_PARAMETER_TOOLTIP": "Some applications may use global NMaaS settings. If you want to use one of them please specify how we should pass that variable.", - "REPOSITORY_REQUIRED_TOOLTIP": "NMaaS can use GitLab to store configuration of each instance.", + "DEPLOY_PARAMETER_TOOLTIP": "Some applications may use global nmaas settings. If you want to use one of them please specify how we should pass that variable.", + "REPOSITORY_REQUIRED_TOOLTIP": "nmaas can use GitLab to store configuration of each instance.", "DISABLED_NEXT_BUTTON_TOOLTIP": "You have to fill all required fields!", "DEPLOY_PARAMETERS_DROPDOWN": "Select global deployment parameters", "CONFIG_FILENAME_LABEL": "Configuration filename", @@ -853,8 +856,8 @@ "BASIC_APP_INFO_STEP_INFO": "Basic set of information about the application. Application can be filtered by tag. Select an existing tag or create a new one if none is suitable.", "LOGO_AND_SCREENSHOTS_STEP_INFO": "Application logo is displayed in various views in the application. A set of screenshots should give a nice overview of the application's UI.", "APP_DESCRIPTIONS_STEP_INFO": "Brief and full descriptions of the application should provide a basic (limited length) and comprehensive information about the nature and purpose of the application. Descriptions should be provided in as many supported languages as possible.", - "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through NMaaS are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", - "CONFIG_TEMPLATES_STEP_INFO": "NMaaS applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", + "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through nmaas are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", + "CONFIG_TEMPLATES_STEP_INFO": "nmaas applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", "BASIC_AUTH_LABEL": "Requires basic authorization", "BASIC_AUTH_TOOLTIP": "You can add basic authorization for your application simply by checking this checkbox.", "TERMS_ACCEPTANCE_LABEL": "Terms acceptance required", @@ -879,8 +882,8 @@ "CONFIG_UPDATE_ENABLED": "Enable configuration updates", "STATIC_GLOBAL_DEPLOY_PARAMETERS": "Static global deploy parameters", "DEPLOY_PARAMETERS": "Global deploy parameters", - "PROJECT_NMAAS_DOCUMENTATION_LABEL": "NMaaS Documentation URL", - "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to NMaaS Documentatnion (NMaaS Tools)", + "PROJECT_NMAAS_DOCUMENTATION_LABEL": "nmaas Documentation URL", + "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to nmaas Documentatnion (nmaas Tools)", "RAW_JSON": "Raw JSON format", "FORM_BUILDER": "Form builder", "FORM_DEFINITION": "Form definition", @@ -930,13 +933,15 @@ "REASON": "Reason", "REASON_PLACEHOLDER": "Please explain your decision", "CANCEL_BUTTON": "Cancel", - "CHANGE_STATE_BUTTON": "Change state" + "CHANGE_STATE_BUTTON": "Change state", + "ERROR_DELETED" : "Not possible to delete this application version due to running instances. Uninstall those instances and try again." + }, "ABOUT": { "CONTACT_TITLE": "Contactez-nous", "CHANGELOG_TITLE": "Version actuelle du logiciel et journal des modifications", - "CONTACT_DESC": "Le formulaire de contact offre un moyen facile d'entrer en contact avec l'équipe NMaaS. Choisissez le type de formulaire le plus adapté à votre demande.", - "CHANGELOG_DESC": "Vous trouverez ci-dessous des informations détaillées sur la version actuelle de NMaaS et un résumé des changements introduits dans les versions précédentes du logiciel." + "CONTACT_DESC": "Le formulaire de contact offre un moyen facile d'entrer en contact avec l'équipe nmaas. Choisissez le type de formulaire le plus adapté à votre demande.", + "CHANGELOG_DESC": "Vous trouverez ci-dessous des informations détaillées sur la version actuelle de nmaas et un résumé des changements introduits dans les versions précédentes du logiciel." }, "CHANGELOG": { "CHANGELOG_LAST": "Dernière version", @@ -966,17 +971,17 @@ "DOMAIN_CODENAME_DESCRIPTION": "Abbreviated version of the domain name (up to 12 characters)", "DOMAIN_CODENAME_ERROR": "Invalid domain codename", "JUSTIFICATION": "Request justification", - "JUSTIFICATION_DESCRIPTION": "Brief justification for the new domain creation including the name of the requesting Institution and the main purpose for deployment of NMaaS applications.", + "JUSTIFICATION_DESCRIPTION": "Brief justification for the new domain creation including the name of the requesting Institution and the main purpose for deployment of nmaas applications.", "VPN_OPTION": "VPN solution", "VPN_OPTION_DESCRIPTION": "Two types of software-based VPN solutions are currently supported. Select the preferred one", "VPN_USER_IP": "Public IP for VPN tunnel setup", "VPN_USER_IP_DESCRIPTION": "Public IP for VPN tunnel termination on user end", "VPN_USER_SUBNETS": "Monitored user subnets", - "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on NMaaS", + "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on nmaas", "VPN_USER_SUBNETS_ADD": "Add subnet", "VPN_USER_SUBNETS_SUBNET": "Subnet", "ADDITIONAL_VPN_SUBNETS": "Additional subnets", - "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your NMaaS applications, outside those specified above (e.g. some public services)", + "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your nmaas applications, outside those specified above (e.g. some public services)", "TECH_CONTACT": "Technical contact", "TECH_CONTACT_DESCRIPTION": "Person to be contacted to further discuss technical matters related with VPN setup", "TECH_CONTACT_PLACEHOLDER": "Name and email", @@ -991,7 +996,7 @@ }, "MODAL": { "TITLE": "Le courrier a été envoyé", - "MESSAGE": "L'équipe NMaaS répondra bientôt.", + "MESSAGE": "L'équipe nmaas répondra bientôt.", "CLOSE_BUTTON": "Fermer" }, "SELECT_CATEGORY": "Select category", @@ -1243,8 +1248,9 @@ }, "REMOVE" : { "HEADER" : "Remove bulk deployment", - "APP" : "Do you want to remove all instances created by this bulk ? ", - "REMOVE" : "Remove" + "APP" : "Do you want to remove all instances created by this bulk deployment?", + "REMOVE" : "Remove", + "ERROR": "Error removing bulk deployment:" } }, "SHARED" : { diff --git a/src/test/shell/data/i18n/pl.json b/src/test/shell/data/i18n/pl.json index 304c8ab411dfe2f65ec3e0af8a5d8f143dc50d8f..582f4fc7dbf733607010587d6212b4f59ee9262b 100644 --- a/src/test/shell/data/i18n/pl.json +++ b/src/test/shell/data/i18n/pl.json @@ -32,28 +32,28 @@ "REGISTER": "Rejestracja", "TITLE1": "Network Management as a Service", "TITLE2": "oferuje dostęp do portfolio aplikacji do zarządzania siecią uruchamianych na żądanie użytkownika w chmurze.", - "INTRO_TEXT": "Usługa NMaaS oferowana przez GÉANT obejmuje trzy aspekty: dostarczenie, zarządzanie i utrzymanie Portalu i oprogramowania NMaaS oraz wybranych aplikacji, wsparcie użytkowników w korzystaniu z systemu oraz wybranych przez siebie aplikacji jak również wparcie użytkowników planujących udostępnić swoje aplikacje w ramach NMaaS.", + "INTRO_TEXT": "Usługa nmaas oferowana przez GÉANT obejmuje trzy aspekty: dostarczenie, zarządzanie i utrzymanie Portalu i oprogramowania nmaas oraz wybranych aplikacji, wsparcie użytkowników w korzystaniu z systemu oraz wybranych przez siebie aplikacji jak również wparcie użytkowników planujących udostępnić swoje aplikacje w ramach nmaas.", "TARGET_USERS_HEADER": "Użytkownicy", - "TARGET_USERS_TEXT": "NMaaS jest dogodnym rozwiązaniem dla organizacji, które nie chcą utrzymywać własnej infrastruktury na potrzeby systemu zarządzania siecią lub/oraz planują zlecenie czynności związanych z zarządzaniem siecią firmie zewnętrznej jak również dla użytkowników, którzy szukają wysokiej jakości narzędzi do zarządzania siecią lub chcą udostępnić swoje oprogramowanie innymi.", - "MARKETPLACE_HEADER": "Sklep NMaaS", - "MARKETPLACE_TEXT": "Sklep NMaaS oferuje zestaw narzędzi open source, wpieranych przez społeczność, rozpowszechnianych za darmo i wybranych przez administratorów. W Sklepie jest również miejsce na aplikacje użytkowników - zaproponuj jaką aplikację możemy dodać.", + "TARGET_USERS_TEXT": "nmaas jest dogodnym rozwiązaniem dla organizacji, które nie chcą utrzymywać własnej infrastruktury na potrzeby systemu zarządzania siecią lub/oraz planują zlecenie czynności związanych z zarządzaniem siecią firmie zewnętrznej jak również dla użytkowników, którzy szukają wysokiej jakości narzędzi do zarządzania siecią lub chcą udostępnić swoje oprogramowanie innymi.", + "MARKETPLACE_HEADER": "Sklep nmaas", + "MARKETPLACE_TEXT": "Sklep nmaas oferuje zestaw narzędzi open source, wpieranych przez społeczność, rozpowszechnianych za darmo i wybranych przez administratorów. W Sklepie jest również miejsce na aplikacje użytkowników - zaproponuj jaką aplikację możemy dodać.", "COST_REDUCTION_HEADER": "Redukcja kosztów", - "COST_REDUCTION_TEXT": "Korzystając z NMaaS użytkownicy nie ponoszą kosztów związanych z posiadaniem oraz ryzyka związanego z koniecznością utrzymania i kontrolowania infrastruktury systemu zarządzania siecią.", + "COST_REDUCTION_TEXT": "Korzystając z nmaas użytkownicy nie ponoszą kosztów związanych z posiadaniem oraz ryzyka związanego z koniecznością utrzymania i kontrolowania infrastruktury systemu zarządzania siecią.", "SECURITY_HEADER": "Bezpieczeństwo", - "SECURITY_TEXT": "Użytkownicy korzystający z NMaaS nie muszą się martwić o bezpieczeństwo danych zbieranych z monitorowanych urządzeń. NMaaS zapewnia bezpieczne połączenie między aplikacjami działającymi w chmurze a siecią użytkownika z wykorzystaniem stosownej technologii VPN.", + "SECURITY_TEXT": "Użytkownicy korzystający z nmaas nie muszą się martwić o bezpieczeństwo danych zbieranych z monitorowanych urządzeń. nmaas zapewnia bezpieczne połączenie między aplikacjami działającymi w chmurze a siecią użytkownika z wykorzystaniem stosownej technologii VPN.", "SCALING_HEADER": "Skalowanie", "SCALING_TEXT": "Treść zostanie dodana wkrótce.", - "NMAAS_FEATURES_HEADER": "Możliwości NMaaS", + "NMAAS_FEATURES_HEADER": "Możliwości nmaas", "APP_MARKET_HEADER": "Sklep z aplikacjami", "APP_MARKET_TEXT": "W sklepie znajdziesz wybrane aplikacje do zarządzania i utrzymania Twojej infrastruktury sieciowej - wybrane przez administratorów i społeczność.", "OWN_APPS_HEADER": "Własne aplikacje", - "OWN_APPS_TEXT": "Chcesz się podzielić swoją aplikację ze społecznością? NMaaS jest otwarty na nowe aplikacje.", + "OWN_APPS_TEXT": "Chcesz się podzielić swoją aplikację ze społecznością? nmaas jest otwarty na nowe aplikacje.", "EDUGAIN_SUPPORT_HEADER": "Wsparcie dla eduGAIN", "EDUGAIN_SUPPORT_TEXT": "Nie musisz tworzyć nowego konta. Zaloguj się korzystając z konta u Twojego IdP zrzeszonego w ramach eduGAIN.", "FAST_DEPLOYMENT_HEADER": "Szybkie i proste uruchomienie", "FAST_DEPLOYMENT_TEXT": "Od momentu wysłania żądania uruchomienia aplikacje są dostępne w ciągu kilku minut z podstawową konfiguracją wprowadzoną w prostym kreatorze.", "WEB_PORTAL_HEADER": "Nowoczesny interfejs użytkownika", - "WEB_PORTAL_TEXT": "Dostęp do funkcjonalności NMaaS jest realizowany przez nowoczesny, reaktywny i przyjazny portal webowy.", + "WEB_PORTAL_TEXT": "Dostęp do funkcjonalności nmaas jest realizowany przez nowoczesny, reaktywny i przyjazny portal webowy.", "KUBERNETES_HEADER": "Kubernetes", "KUBERNETES_TEXT": "Aplikacje użytkowników są uruchamiane w klastrze Kubernetesa skonfigurowanym na dedykowanej infrastrukturze fizycznej w celu zapewnienia wysokiej wydajności i niezawodności.", "TECHNOLOGIES_USED_HEADER": "Użyte technologie", @@ -94,8 +94,8 @@ "USER_DISABLED_MESSAGE": "Użytkownik jest nieaktywny" }, "TEST_INSTANCE_MODAL": { - "HEADER": "Instancja testowa NMaaS", - "BODY": "Pamiętaj, że jest to testowa instancja NMaaS. Izolacja użytkowników oraz środki zabezpieczenia danych nie są tak rygorystyczne, jak w przypadku instancji produkcyjnej. Nie używaj tej instancji do monitorowania rzeczywistych urządzeń.", + "HEADER": "Instancja testowa nmaas", + "BODY": "Pamiętaj, że jest to testowa instancja nmaas. Izolacja użytkowników oraz środki zabezpieczenia danych nie są tak rygorystyczne, jak w przypadku instancji produkcyjnej. Nie używaj tej instancji do monitorowania rzeczywistych urządzeń.", "OK_BUTTON": "OK" }, "PROVIDE_SSH_KEY_MODAL": { @@ -248,12 +248,12 @@ }, "ANNOTATIONS" : { "HEADER" : "Adnotacje domeny", - "SUBHEADER" : "Globalne ustawienie adnotacji domeny. Poniższe domeny będą dodane podczas tworzenia domeny.", + "SUBHEADER" : "Globalne ustawienie adnotacji domeny. Poniższy zestaw adnotacji zostanie dodany do obiektów Kubernetes tworzonych dla każdej nowej domeny.", "CREATION" : "Adnotację przestrzeni domeny", - "ADD" : "Dodajadnotacje", - "KEY" : "Klucz", + "ADD" : "Dodaj adnotację", + "KEY" : "Klucz", "VALUE" : "Wartość", - "EDIT" : "Edytuj adnotacje" + "EDIT" : "Edytuj adnotację" } }, "APP_INSTANCES": { @@ -314,7 +314,7 @@ "NOT_FOUND_ERROR": "Nie znaleziono" }, "PORTAL_CONFIGURATION": { - "TITLE": "Konfiguracja portalu", + "TITLE": "Ustawienia platformy", "MAINTENANCE": "Przerwa techniczna", "ALLOW_SSO_LOGIN": "Zezwól na logowanie przez SSO", "SUBMIT_BUTTON": "Prześlij", @@ -323,10 +323,12 @@ "LANGUAGE_SUPPORT": "Aktywowane języki", "LANGUAGE_ENABLED": "Aktywny", "LANGUAGE_DISABLED": "Nieaktywny", - "TEST_INSTANCE": "Oznacz jako instancję testową NMaaS", + "TEST_INSTANCE": "Oznacz jako instancję testową nmaas", "SEND_APP_INSTANCE_FAILURE_EMAILS": "Wyślij email gdy instalacja aplikacji nie powiedzie się", - "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Lista adresów email", - "DOMAIN_SELECTION_ENABLED" : "Wybór domeny podczas rejestracji" + "SEND_APP_INSTANCE_FAILURE_EMAILS_LIST": "Odbiorcy wiadomości email o problemie z instalacją aplikacji", + "DOMAIN_SELECTION_ENABLED" : "Wybór domeny podczas rejestracji", + "BULK_DOMAINS_ALLOW_FOR_SSO_ACCOUNTS" : "Allow for creation or update of a SSO-enabled account in bulk process", + "BULK_DOMAINS_SEND_EMAIL_FOR_NEW_ACCOUNTS" : "Send notification email for new accounts created in bulk process" }, "DOMAIN_DETAILS": { "TITLE": "Szczegóły domeny", @@ -386,7 +388,7 @@ } }, "GIT_INFO": { - "HEADER": "Informacje o wersji NMaaS", + "HEADER": "Informacje o wersji nmaas", "VERSION": "Wersja", "BUILD_TIME": "Ostatnie budowanie", "LAST_COMMIT": "Ostatni commit", @@ -550,7 +552,7 @@ "STATE": "Stan", "DEFAULT_ERROR_STATE": "Coś poszło nie tak", "DETAILS": "Szczegóły", - "DEFAULT_ERROR_MESSAGE": "Aktywacja aplikacji nie powiodła się z powodu nieoczekiwanego błędu. Zespół NMaaS został już powiadomiony.<br>Aby zgłosić problem, skorzystaj z <a href=\"about?type=ISSUE_REPORT\">formularza kontaktowego</a>." + "DEFAULT_ERROR_MESSAGE": "Aktywacja aplikacji nie powiodła się z powodu nieoczekiwanego błędu. Zespół nmaas został już powiadomiony.<br>Aby zgłosić problem, skorzystaj z <a href=\"about?type=ISSUE_REPORT\">formularza kontaktowego</a>." }, "DEPLOYMENT_HISTORY": { "HEADER": "Historia uruchomienia aplikacji", @@ -563,7 +565,7 @@ "ADVANCED_TAB": "Zaawansowana", "ADDITIONAL_TAB": "Rozszerzona", "STORAGE_SPACE": "Przestrzeń dyskowa", - "NMAAS_TOOLS": "NMaaS Tools Page", + "NMAAS_TOOLS": "nmaas Tools Page", "DOCUMENTATION_INFO": "Detailed field descriptions are available at", "PREVIEW": "Podgląd konfiguracji" }, @@ -618,17 +620,17 @@ "APP_UPGRADE_FAILED": "Aktualizacja aplikacji nie powiodła się" }, "USER_FRIENDLY": { - "REQUESTED": "NMaaS przetwarza Twoje żądanie", - "VALIDATION": "NMaaS weryfikuje dostępne zasoby", - "PREPARATION": "NMaaS przygotowuje środowisko wdrażania dla Twojej aplikacji", - "CONNECTING": "NMaaS nawiązuje bezpieczne połączenie", + "REQUESTED": "nmaas przetwarza Twoje żądanie", + "VALIDATION": "nmaas weryfikuje dostępne zasoby", + "PREPARATION": "nmaas przygotowuje środowisko wdrażania dla Twojej aplikacji", + "CONNECTING": "nmaas nawiązuje bezpieczne połączenie", "CONFIGURATION_AWAITING": "Twoja aplikacja została pomyślnie zainstalowana. <br>Teraz możesz wprowadzić pierwszą konfigurację korzystając z akcji <i>Konfiguruj</i>", "DEPLOYING": "Aplikacja jest aktywowana. Ten proces może potrwać do kilku minut. <br>Zostaniesz powiadomiony e-mailem gdy aplikacja będzie gotowa", "RUNNING": "Twoja aplikacja jest aktywna. <br>Możesz teraz uzyskać dostęp do swojej aplikacji korzystając z opcji <i>Dostęp</i> z menu <i>Akcje</i>.", "UNDEPLOYING": "Aplikacja jest deaktywowana. Ten proces może potrwać do kilku minut", "DONE": "Aplikacja została pomyślnie deaktywowana", "FAILURE": "", - "UNKNOWN": "Nieznany stan aplikacji - skontaktuj się z zespołem NMaaS za pomocą formularza kontaktowego dostępnego na podstronie \"O nas\"", + "UNKNOWN": "Nieznany stan aplikacji - skontaktuj się z zespołem nmaas za pomocą formularza kontaktowego dostępnego na podstronie \"O nas\"", "REMOVED": "Aplikacja została pomyślnie usunięta" }, "SHOW_VERSIONS_LABEL": "Pokaż dostępne wersje", @@ -697,7 +699,7 @@ "SUBMIT_BUTTON": "Prześlij", "EMAIL": "Email", "INVALID_TOKEN": "Twój link wygasł. Proszę ponownie wypełnij formularz resetowania hasła.", - "GO_BACK": "Powrót do strony NMaaS", + "GO_BACK": "Powrót do strony nmaas", "MODAL": { "HEADER": "Proszę sprawdź skrzynkę pocztową", "BODY": "Jeśli wprowadziłeś poprawny adres mailowy, link do zresetowania hasła został przesłany. Reset hasła dotyczy jedynie kont lokalnych.", @@ -735,12 +737,13 @@ "VIEW_BUTTON": "Pokaż", "EDIT_BUTTON": "Edytuj", "DELETE_BUTTON": "Usuń", + "SELECT_VERSION" : "Wybierz wersję aplikacji, która ma być podstawą w kreatorze", "CONFIRM_REMOVAL" : { "HEADER": "Potwierdź usunięcie aplikacji", - "DESCRIPTION": "Czy na pewno chcesz całkowicie usunąć tą aplikację z katalogu razem ze wszystkimi wersjami?", + "DESCRIPTION": "Czy na pewno chcesz całkowicie usunąć tą aplikację z katalogu ?", "CANCEL" : "Anuluj", "CONFIRM": "Potwierdź", - "DISABLED": "Nie możesz usunąć tej ponieważ ma aktualnie uruchomione instancje. Odinstaluj te instancje i ponów próbę usunięcia aplikacji." + "DISABLED": "Istnieją aktywne wersję tej aplikacji. Usuń je i spróbuj ponownie." }, "CHANGE_STATE_BUTTON": "Zmień stan", "CHANGE_OWNER_BUTTON": "Zmień właściciela", @@ -766,7 +769,7 @@ "UPDATE_CONFIG_WIZARD_PREVIEW_HEADER": "Podgląd formularza do aktualizacji konfiguracji aplikacji" }, "APPS_WIZARD": { - "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the NMaaS portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in NMaaS.", + "FIRST_PAGE_MESSAGE": "You are about to fill in a request for adding new application to the nmaas portfolio. You will be guided through a few step process of providing all necessary information about the application, its description, deployment and configuration details. Once the request is submitted it will be reviewed by administrator and either approved or rejected with a proper comment send via email. By checking the box below you confirm that you have the right to publish this application in nmaas.", "ACCEPT_RULES_CHECKBOX": "Zapoznałem się z instrukcją powyżej", "NEXT_BUTTON": "Następne", "SUBMIT_BUTTON": "Wyślij", @@ -799,7 +802,7 @@ "UPDATE_CONFIG_WIZARD_TEMPLATE_LABEL": "Formularz do aktualizacji konfiguracji aplikacji", "NEW_APP_MODAL": { "HEADER": "Nowa aplikacja została wysłana poprawnie", - "BODY": "Dziękujemy za przesłanie nowej aplikacji. Twoje zgłoszenie musi zostać teraz sprawdzona przez zespół NMaaS. To może chwile zająć.", + "BODY": "Dziękujemy za przesłanie nowej aplikacji. Twoje zgłoszenie musi zostać teraz sprawdzona przez zespół nmaas. To może chwile zająć.", "BACK_TO_APP_MANAGEMENT_BUTTON": "Powrót" }, "EDIT_APP_MODAL": { @@ -819,23 +822,23 @@ "ACCEPT_RULES_TOOLTIP": "Musisz zaakceptować zasady korzystania!", "NAME_TOOLTIP": "Oficjalna nazwa aplikacji.", "VERSION_TOOLTIP": "Numer bieżącego wydania aplikacji.", - "LICENSE_TOOLTIP": "Podaj nazwę licencji, na której aplikacja została wydana. Upewnij się że licencja ta pozwala na wykorzystanie aplikacji w systemie NMaaS.", + "LICENSE_TOOLTIP": "Podaj nazwę licencji, na której aplikacja została wydana. Upewnij się że licencja ta pozwala na wykorzystanie aplikacji w systemie nmaas.", "LICENSE_URL_TOOLTIP": "Podaj link do opisu licencji, aby użytkownicy mogli uzyskać więcej informacji o niej i prawach do wykorzystania aplikacji.", "PROJECT_WEBSITE_TOOLTIP": "Podaj link do strony projektu, aby użytkownicy mogli uzyskać więcej informacji o całym projekcie.", "SOURCE_CODE_TOOLTIP": "Link do kodu źródłowego na przykład github.com/project.", "PROJECT_ISSUES_TOOLTIP": "Podaj link do issues projektu, aby użytkownicy mogli łatwo znaleźć sposób na zgłoszenie problemu z tym narzędziem.", "TAGS_TOOLTIP": "Wybierz tagi, które najlepiej opisują aplikacje. Pomoże to użytkownikom w bardziej efektywnym wyszukiwaniu aplikacji, których potrzebują.", "NEW_TAGS_TOOLTIP": "Dodaj tagi, jeśli uważasz że obecnie istniejące nie pasują do Twojej aplikacji. Wpisz nazwę tagu i wciśnij enter aby dodać nowy tag.", - "BRIEF_DESCRIPTION_TOOLTIP": "Podaj krótki opis aplikacji. Tekst ten będzie widoczny na stronie marketu NMaaS.", + "BRIEF_DESCRIPTION_TOOLTIP": "Podaj krótki opis aplikacji. Tekst ten będzie widoczny na stronie marketu nmaas.", "FULL_DESCRIPTION_TOOLTIP": "Podaj pełny opis aplikacji. Tekst ten będzie widoczny w widoku szczegółowym aplikacji.", - "CHART_NAME_TOOLTIP": "Podaj nazwę chart, który będzie wykorzystywany w systemie NMaaS.", - "CHART_VERSION_TOOLTIP": "Podaj wersję Helm chart, która będzie wykorzystywana w systemie NMaaS.", + "CHART_NAME_TOOLTIP": "Podaj nazwę chart, który będzie wykorzystywany w systemie nmaas.", + "CHART_VERSION_TOOLTIP": "Podaj wersję Helm chart, która będzie wykorzystywana w systemie nmaas.", "HELM_CHART_REPOSITORY_NAME_TOOLTIP": "Podaj nazwę repozytorium Helm Chart", "HELM_CHART_REPOSITORY_URL_TOOLTIP": "Podaj adres URL repozytorium Helm Chart", "MAIN_DEPLOYMENT_NAME_TOOLTIP": "Podaj nazwę głównego komponentu instalowanego w ramach chartu", "DEFAULT_STORAGE_SPACE_TOOLTIP": "Podaj domyślną przestrzeń dyskową (w gigabajtach).", - "DEPLOY_PARAMETER_TOOLTIP": "Niektóre aplikacje wykorzystują globalne ustawienia systemu NMaaS. Jeśli chcesz wykorzystać jedną z nich podaj klucz, pod którym powinniśmy podać te ustawienia.", - "REPOSITORY_REQUIRED_TOOLTIP": "NMaaS może wykorzystać GitLab aby zachować konfiguracje każdej instancji.", + "DEPLOY_PARAMETER_TOOLTIP": "Niektóre aplikacje wykorzystują globalne ustawienia systemu nmaas. Jeśli chcesz wykorzystać jedną z nich podaj klucz, pod którym powinniśmy podać te ustawienia.", + "REPOSITORY_REQUIRED_TOOLTIP": "nmaas może wykorzystać GitLab aby zachować konfiguracje każdej instancji.", "DISABLED_NEXT_BUTTON_TOOLTIP": "Musisz wypełnić wszystkie wymagane pola!", "DEPLOY_PARAMETERS_DROPDOWN": "Wybierz parametry globalne", "CONFIG_FILENAME_LABEL": "Nazwa pliku konfiguracyjnego", @@ -854,8 +857,8 @@ "BASIC_APP_INFO_STEP_INFO": "Basic set of information about the application. Application can be filtered by tag. Select an existing tag or create a new one if none is suitable.", "LOGO_AND_SCREENSHOTS_STEP_INFO": "Application logo is displayed in various views in the application. A set of screenshots should give a nice overview of the application's UI.", "APP_DESCRIPTIONS_STEP_INFO": "Brief and full descriptions of the application should provide a basic (limited length) and comprehensive information about the nature and purpose of the application. Descriptions should be provided in as many supported languages as possible.", - "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through NMaaS are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", - "CONFIG_TEMPLATES_STEP_INFO": "NMaaS applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", + "APP_DEPLOYMENT_SPEC_STEP_INFO": "Applications offered through nmaas are deployed in Kubernetes as Helm charts. Basic information about the chart is required with additional set of optional parameters to be passed during the installation process.", + "CONFIG_TEMPLATES_STEP_INFO": "nmaas applications are populated with basic configuration parameters provided by users using a wizard. The list of configuration files (with parameterized content) to be used and loaded by the application at startup should be provided. Those need to be complemented with the definition of the wizard component dedicated for particular application allowing user to provide all necessary parameters used to populate configuration files. ", "BASIC_AUTH_LABEL": "Wymaga podstawowego uwierzytelnienia", "BASIC_AUTH_TOOLTIP": "Możesz dodać podstawowe uwierzytelnienie do Twojej aplikacji zaznaczając tą opcję.", "TERMS_ACCEPTANCE_LABEL": "Terms acceptance required", @@ -880,8 +883,8 @@ "CONFIG_UPDATE_ENABLED": "Zezwól na aktualizowanie konfiguracji", "STATIC_GLOBAL_DEPLOY_PARAMETERS": "Static global deploy parameters", "DEPLOY_PARAMETERS": "Global deploy parameters", - "PROJECT_NMAAS_DOCUMENTATION_LABEL": "NMaaS Documentation URL", - "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to NMaaS Documentatnion (NMaaS Tools)", + "PROJECT_NMAAS_DOCUMENTATION_LABEL": "nmaas Documentation URL", + "PROJECT_NMAAS_DOCUMENTATION_TOOLTIP": "Provide URL to nmaas Documentatnion (nmaas Tools)", "RAW_JSON": "Format JSON", "FORM_BUILDER": "Tworzenie formularza", "FORM_DEFINITION": "Definicja formularza", @@ -931,13 +934,14 @@ "REASON": "Powód", "REASON_PLACEHOLDER": "Proszę uzasadnij swoją decyzję", "CANCEL_BUTTON": "Anuluj", - "CHANGE_STATE_BUTTON": "Zmień stan" + "CHANGE_STATE_BUTTON": "Zmień stan", + "ERROR_DELETED" : "Nie można usunąć powyższej wersji, ponieważ nadal są uruchomione aplikacji wykorzystujące ją. Usuń je i spróbuj ponownie." }, "ABOUT": { "CONTACT_TITLE": "Skontaktuj się z nami", "CHANGELOG_TITLE": "Aktualna wersja oprogramowanie oraz wykaz zmian", - "CONTACT_DESC": "Formularz kontaktowy umożliwia łatwy kontakt z zespołem NMaaS. Wybierz typ formularza, który jest najbardziej odpowiedni dla Twojego zgłoszenia.", - "CHANGELOG_DESC": "Poniżej znajdziesz szczegółowe informacje o aktualnej wersji NMaaS oraz podsumowanie zmian wprowadzonych w poprzednich wersjach oprogramowania." + "CONTACT_DESC": "Formularz kontaktowy umożliwia łatwy kontakt z zespołem nmaas. Wybierz typ formularza, który jest najbardziej odpowiedni dla Twojego zgłoszenia.", + "CHANGELOG_DESC": "Poniżej znajdziesz szczegółowe informacje o aktualnej wersji nmaas oraz podsumowanie zmian wprowadzonych w poprzednich wersjach oprogramowania." }, "CHANGELOG": { "CHANGELOG_LAST": "Ostatnia wersja", @@ -967,17 +971,17 @@ "DOMAIN_CODENAME_DESCRIPTION": "Skrócona nazwa domeny (do 12 znaków)", "DOMAIN_CODENAME_ERROR": "Niewłaściwy kod domeny", "JUSTIFICATION": "Uzasadnienie prośby", - "JUSTIFICATION_DESCRIPTION": "Krótkie uzasadnienie prośby zawierajace informację o zamierzonym sposobie wykorzystania usługi NMaaS", + "JUSTIFICATION_DESCRIPTION": "Krótkie uzasadnienie prośby zawierajace informację o zamierzonym sposobie wykorzystania usługi nmaas", "VPN_OPTION": "Rozwiązanie VPN", "VPN_OPTION_DESCRIPTION": "Dwa rozwiązania VPN są aktualnie wpierane. Wybierz preferowaną opcję", "VPN_USER_IP": "Public IP for VPN tunnel setup", "VPN_USER_IP_DESCRIPTION": "Public IP for VPN tunnel termination on user end", "VPN_USER_SUBNETS": "Monitored user subnets", - "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on NMaaS", + "VPN_USER_SUBNETS_DESCRIPTION": "List of monitored subnets that should be reachable from your application deployed on nmaas", "VPN_USER_SUBNETS_ADD": "Nowa podsieć", "VPN_USER_SUBNETS_SUBNET": "Podsieć", "ADDITIONAL_VPN_SUBNETS": "Dodatkowe podsieci", - "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your NMaaS applications, outside those specified above (e.g. some public services)", + "ADDITIONAL_VPN_SUBNETS_DESCRIPTION": "Additional IP ranges that should be reachable from your nmaas applications, outside those specified above (e.g. some public services)", "TECH_CONTACT": "Kontakt techniczny", "TECH_CONTACT_DESCRIPTION": "Person to be contacted to further discuss technical matters related with VPN setup", "TECH_CONTACT_PLACEHOLDER": "Nazwisko oraz adres email", @@ -992,7 +996,7 @@ }, "MODAL": { "TITLE": "Mail został wysłany", - "MESSAGE": "Zespół NMaaS odpowie jak tylko będzie to możliwe.", + "MESSAGE": "Zespół nmaas odpowie jak tylko będzie to możliwe.", "CLOSE_BUTTON": "Zamknij" }, "SELECT_CATEGORY": "Wybierz kategorię", @@ -1245,8 +1249,9 @@ }, "REMOVE" : { "HEADER" : "Remove bulk deployment", - "APP" : "Do you want to remove all instances created by this bulk ? ", - "REMOVE" : "Remove" + "APP" : "Do you want to remove all instances created by this bulk deployment?", + "REMOVE" : "Remove", + "ERROR": "Error removing bulk deployment:" } }, "SHARED" : { diff --git a/src/test/shell/data/mails/activateAccountMail.json b/src/test/shell/data/mails/activateAccountMail.json index a30cf3340e863e45919524510eeac41c0351fc01..46d1592b247256df24834585236d05449ab57af3 100644 --- a/src/test/shell/data/mails/activateAccountMail.json +++ b/src/test/shell/data/mails/activateAccountMail.json @@ -1,52 +1,51 @@ { "mailType": "ACCOUNT_ACTIVATED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Account activated", + "subject": "nmaas: Account activated", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your NMaaS account is now active. You can now login at <a href=\"${portalURL}\">NMaaS portal</a>.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your nmaas account is now active. You can now login at <a href=\"${portalURL}\">nmaas portal</a>.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Account activated", + "subject": "nmaas: Account activated", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your NMaaS account is now active. You can now login at <a href=\"${portalURL}\">NMaaS portal</a>.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your nmaas account is now active. You can now login at <a href=\"${portalURL}\">nmaas portal</a>.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Account activated", + "subject": "nmaas: Account activated", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your NMaaS account is now active. You can now login at <a href=\"${portalURL}\">NMaaS portal</a>.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your nmaas account is now active. You can now login at <a href=\"${portalURL}\">nmaas portal</a>.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoje konto zostało aktywowane", + "subject": "nmaas: Twoje konto zostało aktywowane", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Twoje konto w portalu NMaaS jest już aktywne. Możesz się zalogować w <a href=\"${portalURL}\">portalu NMaaS</a>.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Twoje konto w portalu nmaas jest już aktywne. Możesz się zalogować w <a href=\"${portalURL}\">portalu nmaas</a>.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appActiveMail.json b/src/test/shell/data/mails/appActiveMail.json index 4f95c0735392bbdf753fd4e4066be759cb295757..5ae256912bd4844674012d5133e6bf79cbfa8de2 100644 --- a/src/test/shell/data/mails/appActiveMail.json +++ b/src/test/shell/data/mails/appActiveMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_ACTIVE", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Your application is now active", + "subject": "nmaas: Your application is now active", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} is now available in NMaaS app market.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} is now available in nmaas app market.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Your application is now active", + "subject": "nmaas: Your application is now active", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} is now available in NMaaS app market.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} is now available in nmaas app market.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Your application is now active", + "subject": "nmaas: Your application is now active", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} is now available in NMaaS app market.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} is now available in nmaas app market.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoja aplikacja jest już aktywna", + "subject": "nmaas: Twoja aplikacja jest już aktywna", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Twoja aplikacja ${app_name} w wersji ${app_version} jest już dostępna w systemie NMaaS.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Twoja aplikacja ${app_name} w wersji ${app_version} jest już dostępna w systemie nmaas.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appDeletedMail.json b/src/test/shell/data/mails/appDeletedMail.json index 5177df6462805a2ceffe0bfd5f2051f54a818e03..23667e008f263ae5cdd8423ffb57fae4a956e189 100644 --- a/src/test/shell/data/mails/appDeletedMail.json +++ b/src/test/shell/data/mails/appDeletedMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_DELETED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Your application has been deleted", + "subject": "nmaas: Your application has been deleted", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} has been deleted because of the following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} has been deleted because of the following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Your application has been deleted", + "subject": "nmaas: Your application has been deleted", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} has been deleted because of the following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} has been deleted because of the following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Your application has been deleted", + "subject": "nmaas: Your application has been deleted", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} has been deleted because of the following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} has been deleted because of the following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoja aplikacja została usunięta", + "subject": "nmaas: Twoja aplikacja została usunięta", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Twoja aplikacja ${app_name} w wersji ${app_version} została usunięta z powodu:<br><p class='message-text'>${reason}<p>Możesz skontaktować się z Zespołem NMaaS poprzez formularz kontaktowy.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Twoja aplikacja ${app_name} w wersji ${app_version} została usunięta z powodu:<br><p class='message-text'>${reason}<p>Możesz skontaktować się z Zespołem nmaas poprzez formularz kontaktowy.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appDeployedMail.json b/src/test/shell/data/mails/appDeployedMail.json index 9a35b5bd26d84bc7572fb5276b47ebf7091b80b7..a9b17ace0b00d619f937f12e4a886cf5cf5b982a 100644 --- a/src/test/shell/data/mails/appDeployedMail.json +++ b/src/test/shell/data/mails/appDeployedMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_DEPLOYED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Application instance ready", + "subject": "nmaas: Application instance ready", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} is now ready. <#if accessURL?has_content>You can access your instance by clicking on this <a href=\"${accessURL}\">link.</a></#if>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Application instance ready", + "subject": "nmaas: Application instance ready", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} is now ready. <#if accessURL?has_content>You can access your instance by clicking on this <a href=\"${accessURL}\">link.</a></#if>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Application instance ready", + "subject": "nmaas: Application instance ready", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} is now ready. <#if accessURL?has_content>You can access your instance by clicking on this <a href=\"${accessURL}\">link.</a></#if>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Instancja aplikacji jest już gotowa", + "subject": "nmaas: Instancja aplikacji jest już gotowa", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Instancja aplikacji ${appName} o nazwie ${appInstanceName} w domenie ${domainName} jest już gotowa. <#if accessURL?has_content><a href=\"${accessURL}\">Kliknij tutaj aby przejść do instancji.</a></#if>", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appDeploymentFailedMail.json b/src/test/shell/data/mails/appDeploymentFailedMail.json index ece8a458ad14a2ec688e3dd02c098555988ea529..dd986bbcd04a7ec8549ec56c9ed4aafad33704f5 100644 --- a/src/test/shell/data/mails/appDeploymentFailedMail.json +++ b/src/test/shell/data/mails/appDeploymentFailedMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_DEPLOYMENT_FAILED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Application instance deployment failed", + "subject": "nmaas: Application instance deployment failed", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} deployment failed with error:<br><br> ${error}.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Application instance deployment failed", + "subject": "nmaas: Application instance deployment failed", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} deployment failed with error:<br><br> ${error}.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Application instance deployment failed", + "subject": "nmaas: Application instance deployment failed", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} deployment failed with error:<br><br> ${error}.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Instancja aplikacji nie powiodła się", + "subject": "nmaas: Instancja aplikacji nie powiodła się", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Instancja aplikacji ${appName} o nazwie ${appInstanceName} w domenie ${domainName} nie została uruchomiona w wyniku błędu:<br><br> ${error}.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appNewMail.json b/src/test/shell/data/mails/appNewMail.json index d43665e40d84fee75aad056c4ed4c078503061da..a12c9d1e7ff192d040b5c0e84967a6cb842c10f2 100644 --- a/src/test/shell/data/mails/appNewMail.json +++ b/src/test/shell/data/mails/appNewMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_NEW", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: New application request", + "subject": "nmaas: New application request", "template": { "HEADER": "Dear ${username},", "CONTENT": "${app_name} in version ${app_version} has been submitted through the Portal. You can review this request in application management panel.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: New application request", + "subject": "nmaas: New application request", "template": { "HEADER": "Dear ${username},", "CONTENT": "${app_name} in version ${app_version} has been submitted through the Portal. You can review this request in application management panel.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: New application request", + "subject": "nmaas: New application request", "template": { "HEADER": "Dear ${username},", "CONTENT": "${app_name} in version ${app_version} has been submitted through the Portal. You can review this request in application management panel.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Zgłoszenie nowej aplikacji", + "subject": "nmaas: Zgłoszenie nowej aplikacji", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Aplikacja o nazwie ${app_name} w wersji ${app_version} została wysłana przez Portal. Możesz sprawdzić zgłoszenie w panelu zarządzania aplikacjami.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appNotActiveMail.json b/src/test/shell/data/mails/appNotActiveMail.json index 8edaa2cd0de97e4ce98ec1c16bf9418d1f151437..c37c6a3d4e300130e16415b772a3d1e6d9f60508 100644 --- a/src/test/shell/data/mails/appNotActiveMail.json +++ b/src/test/shell/data/mails/appNotActiveMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_NOT_ACTIVE", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Your application has been disabled", + "subject": "nmaas: Your application has been disabled", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} has been disabled because of following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form or edit your request in NMaaS.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} has been disabled because of following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form or edit your request in nmaas.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Your application has been disabled", + "subject": "nmaas: Your application has been disabled", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} has been disabled because of following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form or edit your request in NMaaS.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} has been disabled because of following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form or edit your request in nmaas.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Your application has been disabled", + "subject": "nmaas: Your application has been disabled", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your application ${app_name} in version ${app_version} has been disabled because of following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form or edit your request in NMaaS.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your application ${app_name} in version ${app_version} has been disabled because of following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form or edit your request in nmaas.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoja aplikacja została zdeaktywowana", + "subject": "nmaas: Twoja aplikacja została zdeaktywowana", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Twoja aplikacja ${app_name} w wersji ${app_version} została zdeaktywowana z powodu:<br><p class='message-text'>${reason}<p>Możesz skontaktować się z Zespołem NMaaS poprzez formularz kontaktowy lub poprawić zgłoszenie aplikacji w systemie NMaaS.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Twoja aplikacja ${app_name} w wersji ${app_version} została zdeaktywowana z powodu:<br><p class='message-text'>${reason}<p>Możesz skontaktować się z Zespołem nmaas poprzez formularz kontaktowy lub poprawić zgłoszenie aplikacji w systemie nmaas.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appRejectedMail.json b/src/test/shell/data/mails/appRejectedMail.json index 342548178a4669be5b16c096431eaf1f5f6f607f..9cd13b53504d302d48c164cb6d7a6082cd782314 100644 --- a/src/test/shell/data/mails/appRejectedMail.json +++ b/src/test/shell/data/mails/appRejectedMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_REJECTED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Your request to add application has been rejected", + "subject": "nmaas: Your request to add application has been rejected", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your request to add application ${app_name} in version ${app_version} has been rejected because of the following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form or edit your request in NMaaS.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your request to add application ${app_name} in version ${app_version} has been rejected because of the following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form or edit your request in nmaas.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Your request to add application has been rejected", + "subject": "nmaas: Your request to add application has been rejected", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your request to add application ${app_name} in version ${app_version} has been rejected because of the following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form or edit your request in NMaaS.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your request to add application ${app_name} in version ${app_version} has been rejected because of the following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form or edit your request in nmaas.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Your request to add application has been rejected", + "subject": "nmaas: Your request to add application has been rejected", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your request to add application ${app_name} in version ${app_version} has been rejected because of the following reason:<br><p class='message-text'>${reason}<p>You can contact NMaaS Team via contact form or edit your request in NMaaS.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your request to add application ${app_name} in version ${app_version} has been rejected because of the following reason:<br><p class='message-text'>${reason}<p>You can contact nmaas Team via contact form or edit your request in nmaas.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoje zgłoszenie dodania nowej aplikacji zostało odrzucone", + "subject": "nmaas: Twoje zgłoszenie dodania nowej aplikacji zostało odrzucone", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Twoje zgłoszenie dodania aplikacji ${app_name} w wersji ${app_version} zostało odrzucone z powodu:<br><p class='message-text'>${reason}<p>Możesz skontaktować się z Zespołem NMaaS poprzez formularz kontaktowy lub ponowić zgłoszenie w systemie NMaaS.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Twoje zgłoszenie dodania aplikacji ${app_name} w wersji ${app_version} zostało odrzucone z powodu:<br><p class='message-text'>${reason}<p>Możesz skontaktować się z Zespołem nmaas poprzez formularz kontaktowy lub ponowić zgłoszenie w systemie nmaas.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appUpgradePossibleMail.json b/src/test/shell/data/mails/appUpgradePossibleMail.json index 7c5cd0f5caceeae604f6835a13a92c361d23448d..196f246da890e09e490e7be0e2fbeb97d9d0ddce 100644 --- a/src/test/shell/data/mails/appUpgradePossibleMail.json +++ b/src/test/shell/data/mails/appUpgradePossibleMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_UPGRADE_POSSIBLE", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Your application instance is ready to be upgraded", + "subject": "nmaas: Your application instance is ready to be upgraded", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} is ready to be upgraded from current version ${appVersion} to version ${appVersionNew} (chart version: ${appVersionNewChart}).", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Your application instance is ready to be upgraded", + "subject": "nmaas: Your application instance is ready to be upgraded", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} is ready to be upgraded from current version ${appVersion} to version ${appVersionNew} (chart version: ${appVersionNewChart}).", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Your application instance is ready to be upgraded", + "subject": "nmaas: Your application instance is ready to be upgraded", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} is ready to be upgraded from current version ${appVersion} to version ${appVersionNew} (chart version: ${appVersionNewChart}).", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoja aplikacja jest gotowa do zaktualizacji", + "subject": "nmaas: Twoja aplikacja jest gotowa do zaktualizacji", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Instancja aplikacji ${appName} o nazwie ${appInstanceName} w domenie ${domainName} jest gotowa to aktualizacji z obecnej wersji ${appVersion} do wersji ${appVersionNew} (wersja chartu: ${appVersionNewChart}).", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appUpgradeSummaryMail.json b/src/test/shell/data/mails/appUpgradeSummaryMail.json index f3d93844c76f0b380a81b26448933bfeec4a5ce4..4e4bed61da91aefc6bdfa9d1a623f8a192a5c2fe 100644 --- a/src/test/shell/data/mails/appUpgradeSummaryMail.json +++ b/src/test/shell/data/mails/appUpgradeSummaryMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_UPGRADE_SUMMARY", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Summary of automatic application upgrades", + "subject": "nmaas: Summary of automatic application upgrades", "template": { "HEADER": "Dear ${username},", "CONTENT": "<#if upgradesExist>The following application upgrades were performed during last ${summaryInternal} hours.<br><table style=\"font-family: sans-serif; font-size: 12px;\"><tr><th>Domain</th><th>Instance name</th><th>New application version</th><th>New helm chart version</th><th>Timestamp</th><th>Status</th></tr><#list appUpgrades as upgrade><tr><td>${upgrade.domainName}</td><td>${upgrade.appInstanceName}</td><td>${upgrade.appVersion}</td><td>${upgrade.appHelmChartVersion}</td><td>${upgrade.timestamp}</td><td>${upgrade.status}</td></tr></#list></table><#else>No application upgrades were performed during last ${summaryInternal} hours.</#if>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Summary of automatic application upgrades", + "subject": "nmaas: Summary of automatic application upgrades", "template": { "HEADER": "Dear ${username},", "CONTENT": "<#if upgradesExist>The following application upgrades were performed during last ${summaryInternal} hours.<br><table style=\"font-family: sans-serif; font-size: 12px;\"><tr><th>Domain</th><th>Instance name</th><th>New application version</th><th>New helm chart version</th><th>Timestamp</th><th>Status</th></tr><#list appUpgrades as upgrade><tr><td>${upgrade.domainName}</td><td>${upgrade.appInstanceName}</td><td>${upgrade.appVersion}</td><td>${upgrade.appHelmChartVersion}</td><td>${upgrade.timestamp}</td><td>${upgrade.status}</td></tr></#list></table><#else>No application upgrades were performed during last ${summaryInternal} hours.</#if>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Summary of automatic application upgrades", + "subject": "nmaas: Summary of automatic application upgrades", "template": { "HEADER": "Dear ${username},", "CONTENT": "<#if upgradesExist>The following application upgrades were performed during last ${summaryInternal} hours.<br><table style=\"font-family: sans-serif; font-size: 12px;\"><tr><th>Domain</th><th>Instance name</th><th>New application version</th><th>New helm chart version</th><th>Timestamp</th><th>Status</th></tr><#list appUpgrades as upgrade><tr><td>${upgrade.domainName}</td><td>${upgrade.appInstanceName}</td><td>${upgrade.appVersion}</td><td>${upgrade.appHelmChartVersion}</td><td>${upgrade.timestamp}</td><td>${upgrade.status}</td></tr></#list></table><#else>No application upgrades were performed during last ${summaryInternal} hours.</#if>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Podsumowanie automatycznych aktualizacji aplikacji", + "subject": "nmaas: Podsumowanie automatycznych aktualizacji aplikacji", "template": { "HEADER": "Drogi ${username},", "CONTENT": "<#if upgradesExist>The following application upgrades were performed during last ${summaryInternal} hours.<br><table style=\"font-family: sans-serif; font-size: 12px;\"><tr><th>Domain</th><th>Instance name</th><th>New application version</th><th>New helm chart version</th><th>Timestamp</th><th>Status</th></tr><#list appUpgrades as upgrade><tr><td>${upgrade.domainName}</td><td>${upgrade.appInstanceName}</td><td>${upgrade.appVersion}</td><td>${upgrade.appHelmChartVersion}</td><td>${upgrade.timestamp}</td><td>${upgrade.status}</td></tr></#list></table><#else>No application upgrades were performed during last ${summaryInternal} hours.</#if>", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/appUpgradedMail.json b/src/test/shell/data/mails/appUpgradedMail.json index 1fad1f8ccfccabdf80292eea20cac00b4ec85edd..9f2f5854a90b6cf69f943d2f2ca5279b37a47777 100644 --- a/src/test/shell/data/mails/appUpgradedMail.json +++ b/src/test/shell/data/mails/appUpgradedMail.json @@ -1,52 +1,51 @@ { "mailType": "APP_UPGRADED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Your application instance was upgraded", + "subject": "nmaas: Your application instance was upgraded", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} was upgraded to version ${appVersion} (previous version was ${appVersionPrevious}).", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Your application instance was upgraded", + "subject": "nmaas: Your application instance was upgraded", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} was upgraded to version ${appVersion} (previous version was ${appVersionPrevious}).", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Your application instance was upgraded", + "subject": "nmaas: Your application instance was upgraded", "template": { "HEADER": "Dear ${username},", "CONTENT": "The ${appName} instance ${appInstanceName} in domain ${domainName} was upgraded to version ${appVersion} (previous version was ${appVersionPrevious}).", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoja aplikacja została zaktualizowana", + "subject": "nmaas: Twoja aplikacja została zaktualizowana", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Instancja aplikacji ${appName} o nazwie ${appInstanceName} w domenie ${domainName} została zaktualizowana do wersji ${appVersion} (poprzednia wersja to ${appVersionPrevious}).", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/blockAccountMail.json b/src/test/shell/data/mails/blockAccountMail.json index bbdebc7f352d2c573463d6cdb792ca053e842ee5..745e9e6fb594b8682855c126a6e38cf9af74f1ca 100644 --- a/src/test/shell/data/mails/blockAccountMail.json +++ b/src/test/shell/data/mails/blockAccountMail.json @@ -1,52 +1,51 @@ { "mailType": "ACCOUNT_BLOCKED", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Account blocked", + "subject": "nmaas: Account blocked", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your NMaaS account has been blocked. Please contact support.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your nmaas account has been blocked. Please contact support.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Account blocked", + "subject": "nmaas: Account blocked", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your NMaaS account has been blocked. Please contact support.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your nmaas account has been blocked. Please contact support.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Account blocked", + "subject": "nmaas: Account blocked", "template": { "HEADER": "Dear ${username},", - "CONTENT": "Your NMaaS account has been blocked. Please contact support.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "Your nmaas account has been blocked. Please contact support.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Twoje konto zostało zablokowane", + "subject": "nmaas: Twoje konto zostało zablokowane", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Twoje konto w portalu NMaaS zostało zablokowane. Skontaktuj się z administratorem w celu uzyskania dodatkowych informacji.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Twoje konto w portalu nmaas zostało zablokowane. Skontaktuj się z administratorem w celu uzyskania dodatkowych informacji.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/broadcast.json b/src/test/shell/data/mails/broadcast.json index ba4ddb58987c63cb9b2e7272d73b22ad9a0bf7ea..fabe28ef08ec95908b624166fc6b9be97b77bb9c 100644 --- a/src/test/shell/data/mails/broadcast.json +++ b/src/test/shell/data/mails/broadcast.json @@ -1,52 +1,51 @@ { "mailType": "BROADCAST", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Broadcast", + "subject": "nmaas: Broadcast", "template": { "HEADER": "Dear ${username},", "CONTENT": "${text}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is a broadcast message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Broadcast", + "subject": "nmaas: Broadcast", "template": { "HEADER": "Dear ${username},", "CONTENT": "${text}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is a broadcast message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Broadcast", + "subject": "nmaas: Broadcast", "template": { "HEADER": "Dear ${username},", "CONTENT": "${text}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is a broadcast message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Broadcast", + "subject": "nmaas: Broadcast", "template": { "HEADER": "Dear ${username},", "CONTENT": "${text}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is a broadcast message, please do not reply.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/bulkRegistrationMail.json b/src/test/shell/data/mails/bulkRegistrationMail.json new file mode 100644 index 0000000000000000000000000000000000000000..ae0e91b04bbf9627cf38a6f8310a7c79b81a8a1d --- /dev/null +++ b/src/test/shell/data/mails/bulkRegistrationMail.json @@ -0,0 +1,54 @@ +{ + "mailType": "NEW_BULK_LOGIN", + "globalInformation": { + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", + "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" + }, + "templates": [ + { + "language": "en", + "subject": "nmaas: Your new account", + "template": { + "HEADER": "Dear user,", + "CONTENT": "New nmaas account was created using your email address. Assigned username is ${username}.<br> Set your password using the following link: <a href=\"${accessURL}\">password set link.</a><br /><br>Note that the link is only valid for the next 24 hours. After that time you can still set it using the standard password reset process.", + "SENDER": "Best regards,<br />nmaas Team", + "NOREPLY": "This is an automatically generated message, please do not reply.", + "SENDER_POLICY": "" + } + }, + { + "language": "fr", + "subject": "nmaas: Your new account", + "template": { + "HEADER": "Dear user,", + "CONTENT": "New nmaas account was created using your email address. Assigned username is ${username}.<br> Set your password using the following link: <a href=\"${accessURL}\">password set link.</a><br /><br>Note that the link is only valid for the next 24 hours. After that time you can still set it using the standard password reset process.", + "SENDER": "Best regards,<br />nmaas Team", + "NOREPLY": "This is an automatically generated message, please do not reply.", + "SENDER_POLICY": "" + } + }, + { + "language": "de", + "subject": "nmaas: Your new account", + "template": { + "HEADER": "Dear user,", + "CONTENT": "New nmaas account was created using your email address. Assigned username is ${username}.<br> Set your password using the following link: <a href=\"${accessURL}\">password set link.</a><br /><br>Note that the link is only valid for the next 24 hours. After that time you can still set it using the standard password reset process.", + "SENDER": "Best regards,<br />nmaas Team", + "NOREPLY": "This is an automatically generated message, please do not reply.", + "SENDER_POLICY": "" + } + }, + { + "language": "pl", + "subject": "nmaas: Twoje nowe konto", + "template": { + "HEADER": "Drogi użytkowniku,", + "CONTENT": "Nowe konto zostało załozone w nmass, używając twojego adresu email. Przypisana nazwa użytkownika to ${username}.<br> Możesz zresetować swoje hasłu używając linku: <a href=\"${accessURL}\">Kliknij tutaj aby zresetować haslo.</a><br />.<br>Link jest ważny przez 24 godziny. Po tym czasie nadal możesz zresetować hasło używając standardowej procedury resetu hasła na stronie.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", + "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", + "SENDER_POLICY": "" + } + } + ] +} \ No newline at end of file diff --git a/src/test/shell/data/mails/bulkSSORegistrationMail.json b/src/test/shell/data/mails/bulkSSORegistrationMail.json new file mode 100644 index 0000000000000000000000000000000000000000..707a1cc430f3cbcd79d65f7536993ff8a1290a7c --- /dev/null +++ b/src/test/shell/data/mails/bulkSSORegistrationMail.json @@ -0,0 +1,54 @@ +{ + "mailType": "NEW_BULK_SSO_LOGIN", + "globalInformation": { + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", + "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" + }, + "templates": [ + { + "language": "en", + "subject": "nmaas: Your new account", + "template": { + "HEADER": "Dear user,", + "CONTENT": "New nmaas account was created using your email address. Assigned username is ${username}.<br>You can now go to the <a href=\"${portal}\">portal</a> and login using the <b>Federated login</b> option with your institutional account credentials.", + "SENDER": "Best regards,<br />nmaas Team", + "NOREPLY": "This is an automatically generated message, please do not reply.", + "SENDER_POLICY": "" + } + }, + { + "language": "fr", + "subject": "nmaas: Your new account", + "template": { + "HEADER": "Dear user,", + "CONTENT": "New nmaas account was created using your email address. Assigned username is ${username}.<br>You can now go to the <a href=\"${portal}\">portal</a> and login using the <b>Federated login</b> option with your institutional account credentials.", + "SENDER": "Best regards,<br />nmaas Team", + "NOREPLY": "This is an automatically generated message, please do not reply.", + "SENDER_POLICY": "" + } + }, + { + "language": "de", + "subject": "nmaas: Your new account", + "template": { + "HEADER": "Dear user,", + "CONTENT": "New nmaas account was created using your email address. Assigned username is ${username}.<br>You can now go to the <a href=\"${portal}\">portal</a> and login using the <b>Federated login</b> option with your institutional account credentials.", + "SENDER": "Best regards,<br />nmaas Team", + "NOREPLY": "This is an automatically generated message, please do not reply.", + "SENDER_POLICY": "" + } + }, + { + "language": "pl", + "subject": "nmaas: Twoje nowe konto", + "template": { + "HEADER": "Drogi użytkowniku,", + "CONTENT": "Nowe konto zostało założone, wykorzystując twój adres email. Przypisana nazwa użytkownika to ${username}.<br>Możesz przejśc do <a href=\"${portal}\">portal</a> i zalogować się przez opcję <b>Federated login</b> wykorzystując dane logowania z Twojej organizacji.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", + "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", + "SENDER_POLICY": "" + } + } + ] +} \ No newline at end of file diff --git a/src/test/shell/data/mails/contactFormMail.json b/src/test/shell/data/mails/contactFormMail.json index d3248e11aa07a55a6069964e20ee1f576cbb8c15..33193674379efa00bfe7067fbbfba0109d99a8a8 100644 --- a/src/test/shell/data/mails/contactFormMail.json +++ b/src/test/shell/data/mails/contactFormMail.json @@ -1,52 +1,51 @@ { "mailType": "CONTACT_FORM", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Message from the contact form", + "subject": "nmaas: Message from the contact form", "template": { "HEADER": "Dear ${username}", "CONTENT": "${name} sent message using the contact form. The content of this message can be found below:<br><p class='message-text'>${message}<p>Please reply to ${email} as soon as possible.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Message from the contact form", + "subject": "nmaas: Message from the contact form", "template": { "HEADER": "Dear ${username}", "CONTENT": "${name} sent message using the contact form. The content of this message can be found below:<br><p class='message-text'>${message}<p>Please reply to ${email} as soon as possible.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Message from the contact form", + "subject": "nmaas: Message from the contact form", "template": { "HEADER": "Dear ${username}", "CONTENT": "${name} sent message using the contact form. The content of this message can be found below:<br><p class='message-text'>${message}<p>Please reply to ${email} as soon as possible.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Wiadomość z formularza kontaktowego", + "subject": "nmaas: Wiadomość z formularza kontaktowego", "template": { "HEADER": "Drogi ${username}", "CONTENT": "${name} wysłał wiadomość korzystając z formularza kontaktowego. Treść możesz znaleźć poniżej:<br><p class='message-text'>${message}<p>Prosimy o jak najszybszą odpowiedź na adres ${email}.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/externalServiceHealthCheckMail.json b/src/test/shell/data/mails/externalServiceHealthCheckMail.json index 7b01c0803d28b5502371ce4cbd0a7544dde6f9dd..daba0b3f7c5f907f1082df0585a6082508ec475b 100644 --- a/src/test/shell/data/mails/externalServiceHealthCheckMail.json +++ b/src/test/shell/data/mails/externalServiceHealthCheckMail.json @@ -1,52 +1,51 @@ { "mailType": "EXTERNAL_SERVICE_HEALTH_CHECK", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: External service health check failed", + "subject": "nmaas: External service health check failed", "template": { "HEADER": "Dear ${username},", "CONTENT": "This is to notify you that the ${serviceName} health check failed.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: External service health check failed", + "subject": "nmaas: External service health check failed", "template": { "HEADER": "Dear ${username},", "CONTENT": "This is to notify you that the ${serviceName} health check failed.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: External service health check failed", + "subject": "nmaas: External service health check failed", "template": { "HEADER": "Dear ${username},", "CONTENT": "This is to notify you that the ${serviceName} health check failed.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Zewnętrzny komponent nie odpowiada", + "subject": "nmaas: Zewnętrzny komponent nie odpowiada", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Okresowe sprawdzenie stanu komponentu ${serviceName} zakończyło się niepowodzeniem.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/html-template/Mail sample.html b/src/test/shell/data/mails/html-template/Mail sample.html index f9ecc150b3f7ad92953e9337305210b16d99f61e..3509693642c26926b06cb043106d008c69d7e8c6 100644 --- a/src/test/shell/data/mails/html-template/Mail sample.html +++ b/src/test/shell/data/mails/html-template/Mail sample.html @@ -3,7 +3,7 @@ <head> <meta name="viewport" content="width=device-width"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - <title>NMaaS Notification</title> + <title>nmaas Notification</title> <style> @media only screen and (max-width: 620px) { table[class=body] h1 { @@ -116,9 +116,9 @@ style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;"> <tr> <td style="font-family: sans-serif; font-size: 14px; vertical-align: top;"> - Your NMaaS account is now active. You can now login at <a href="${accessURL}">NMaaS portal</a>.</p> + Your nmaas account is now active. You can now login at <a href="${accessURL}">nmaas portal</a>.</p> <p style="text-align: right;">Best regards,<br /> - NMaaS Team + nmaas Team </p> <p style="text-align: center; color: lightgray; font-size: 11px;"> <br>This is an automatically generated message, please do not reply. @@ -138,11 +138,11 @@ <span class="apple-link" style="color: gray; font-size: 11px; text-align: center;"> Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands<br> <p> - You're receiving this email because you opted-in to receive communication from NMaaS. + You're receiving this email because you opted-in to receive communication from nmaas. </p> <a href="https://www.geant.org/" target="_blank" rel="nofollow"> - <img src="https://www.geant.org/Style%20Library/Geant/Images/logo.png" - alt="Geant logo" + <img src="https://www.geant.org/Style%20Library/geant/Images/logo.png" + alt="GÉANT logo" style="max-height: 24px;"> </a> </span> diff --git a/src/test/shell/data/mails/html-template/mail-template-tags.txt b/src/test/shell/data/mails/html-template/mail-template-tags.txt index 99c33ec7ad1c22927d13358c5f457532504734e9..ebf8199ea3356d8c72e0a215ef576055502aacbb 100644 --- a/src/test/shell/data/mails/html-template/mail-template-tags.txt +++ b/src/test/shell/data/mails/html-template/mail-template-tags.txt @@ -1,12 +1,11 @@ Placeholders tags: #TITLE# - mail subject -#LOGO_LINK# - link to image, default value: https://www.geant.org/Style%20Library/Geant/Images/logo.png -#LOGO_ALT# -alternative text, default value: Geant Logo +#LOGO_ALT# - alternative text, default value: GÉANT Logo #HEADER# - header content, default value: Dear $username, #CONTENT# - mail content -#SENDER# - regards & NMaaS instance management team name , default: Best regards,<br />NMaaS Team +#SENDER# - regards & nmaas instance management team name , default: Best regards,<br />nmaas Team #NOREPLY# - noreply message, default: This is an automatically generated message, please do not reply. #SENDER_INFO# - information about sending organization, default value: Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands #SENDER_POLICY# - information about sending mail policy/privacy policy, additional this is a place for unsubscribe link, -default value: You're receiving this email because you opted-in to receive communication from NMaaS. \ No newline at end of file +default value: You're receiving this email because you opted-in to receive communication from nmaas. \ No newline at end of file diff --git a/src/test/shell/data/mails/html-template/template.html b/src/test/shell/data/mails/html-template/template.html index 02cdae001070e2ff35a444de0f03db1a5151ebf2..ca5d68b913a3c6e5bfd66bb66eb716ee7bebbbd2 100644 --- a/src/test/shell/data/mails/html-template/template.html +++ b/src/test/shell/data/mails/html-template/template.html @@ -87,13 +87,33 @@ border-color: #34495e !important; } - .message-text{ + .message-text { padding-right: 10px; padding-left: 10px; color: #4a4a4a; } } + + .nmaas { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABRwAAADwCAYAAABi3KgvAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kbtLA0EQh79EQ4JGFLSwSHGIWqn4gBgbiwRfoBZJBKM2lzMPIY/jLkGCrWArKIg2vgr9C7QVrAVBUQSxTq1oo3LOGSEiZpbZ+fa3O8PuLDijGS1r1vdDNlcwwhNBZT62oLjLuPDhYZiAqpn6TGQ8Sk17u8Nhx5teu1btc/9a43LC1MDhER7VdKMgPCk8vVrQbd4WbtPS6rLwqXCPIRcUvrX1eIXLNqcq/GGzEQ2HwNkirKR+cfwXa2kjKywvpzObKWo/97Ff4k3k5iISO8R9mISZIIjCFGOE8DPAiMx+ehmkT1bUyO//zp8lL7mazDolDFZIkaZAj6hFqZ6QmBQ9ISNDye7/376ayaHBSnVvEFxPlvXSBe4t+Ny0rPdDy/o8grpHuMhV8/MHEHgVfbOqde5D8zqcXVa1+A6cb0D7g64a6rdUJ+5MJuH5BJpi0HoNDYuVnv3sc3wP0TX5qivY3YNuOd+89AXmx2ggJelL+gAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeJzs3Xe4HUX9x/F3Qguhk6GIdDIUUURBpEkVHFGU8kNBBRQ7ChZE7BVQUBA7FlBABUQRAXFAmkiRXlSKE6p0xtAkoYTk98dsIFxS7tmzu7N7zuf1POcJ3Nzd+STZc+453535zhhERERERERERER6ZKwbB0wE1gKWAxbr4TEf8HgPj8lAAG6JwT/ayB9QShuTO4CIiIiIiIiIiLSTsW4M8BJSUXEtYO1Z/ntV8tSW7gduGfG4GbgjBv9shjwyggqOIiIiIiIiIiKCsW4s8HJgG2BDUnFxTdKMxC54GphEKkBeD1wAXB6DfyprqiGkgqOIiIiIiIiIyBAqZi+uSSowbgNsBZicmWowFbiYVHw8H7g6Bj8tb6TBp4KjiIiIiIiIiMiQMNatwvMFxm2AFfImatzjwF9JxcfzgX/E4KfnjTR4VHAUERERERERERlQxTLpzYB3AtsBq+dN1Dr/Jc1+PBk4Mwb/ZOY8A0EFRxERERERERGRAWOss8CexWPVvGk64xFS4fEE4NIY/IzMeTpLBUcRERERERERkQFgrFsaeBuwF7BJ5jhddyup8HhCDP623GG6RgVHEREREREREZGOMtYtCDhSkXFHYMG8iQbSxcDxwCkx+Edyh+kCFRxFRERERERERDrGWLcy8AngXQzeztJt9RTwR+CIGPwVucO0mQqOIiIiIiIiIiIdUfRm/AxpRuP8meMMs78AhwAXqdfji6ngKCIiIiIiIiLScsa6dYHPAbsDYzPHkeddAhwMnK3C4/NUcBQRERERERERaSlj3QbA54Gdc2eRubqaNOPxjzH46bnD5KaCo4iIiIiIiIhIyxjrNicVGl3uLNKTfwGHAr+NwU/LHSYXFRxFRERERERERFrCWPda4DBgy9xZpC+3Al8CThzGpdYqOIqIiIiIiIiIZGasWxr4BvB+VK8ZJBcC+8bgb8odpEm6gEVEREREREREMjHWjQX2Bg4HTOY4Uo9pwBHA12PwT+QO0wQVHEVEREREREREMjDWrQf8GNg0dxZpxF3Ax0gbywz0MmsVHEVEREREREREGmSsWxz4CrA/MF/eNJLBWcB+MfjbcgepiwqOIiIiIiIiIiINMNaNAXYDvgOskDmO5PUkaTfrw2PwT+UOUzUVHEVEREREREREamasWwk4BtgudxZplQDsE4O/OHeQKqngKCIiIiIiIiJSI2Pdm4DjgaVzZ5FWehb4Amm24/TcYaqggqOIiIiIiIiISA2MdQsAhwAH5s4ineCBvWLwD+UO0i8VHEVERERERGSOip5zS5P6za0ALJY3kXTUNYO8QcbsFEuoTwY2yZ1FOuVeYPcY/N9yB+nHGGPd+4AFcweRgfMM8ADpiXIv8EAM/tm8kepjrHPA6rlziAyQGcDDwH2k15B7YvBT8kbKx1j3dWDzWb408oZhr/8/8mv9nm+Q/j93luk8//Nz5vU/8vFYDH4GQ8BY9ydg/Cxfyv3v0+tzq43/P/JrTT0/5vW9TzPna/5e4L4Y/FSkNsa65YFtgZV4vrA48/ES9JlR+vehGPxPcodoirHuzcBxaAm1lPMs8EXgsK4usR5jrHuCF76RE6nDs8CDvPiN5FXAeTH4JzNm65ux7nRgx9w5RAbcY4z48AlMAs6Kwd+dM1jd9BojI0wB/gn8sXjcOKgFSL1PlREeBi4jXfenx+Dvz5yn84x1awI7FY+N0Qo4qde+Mfgf5w5RNy2hloqdDezZxSXWY4x1T6G7VZLXE6Qn0WnAmTH4hzPn6Zmx7izgjblziAyxa0ivIafF4P+RO0zVjHVnAm/KnUNaaxLp+v8jcNkgrSgw1k0FxuXOIa00A7ic51/7b8mcpxOMdWOB1/B8kXHtvIlkyHw0Bv/D3CHqZKxbGTgJLaGWat0L7BGDvyh3kF6MMdZNA+bLHUSkMA24iPSh6bQY/F2Z84yKse5sYPvcOUQEgNsoXkOASwah+KKbGtKDh4AzSNf/OTH4pzLn6YtujEsPbqEoPgKXD+qs37KMdSsCBwG7kpZHi+Tw7hj8cblD1MVYtw3wO2Cp3FlkIE0HDozBH5k7yGiNMdY9hpr+SntdB3wf+GWb+xYY6/5AukssIu0Sgd8CB8fg78sdpiy9xkhJ/wG+APy6q4V3vU+Vki4lfSi7NHeQ3Ix1SwKfAT6GZgtLflvH4C/MHaIOxrrdgF+hm2RSvyOAT7e5PjLTWNKdcJG2Wh84BrihaLrbVnoeibSTAfYFJhnrDjbWdbVwoT5lUsZKpGb11xjrXLHLbNfo2pcyNgUuMdb9wVg3lEuGjXULGes+AdxKmtmoYqO0wZ25A9TBWLcvaSdqFRulCQcAvyx6hbbaWNJGHiJtty5whrHuQmPdRrnDzIaeRyLtNh74PHCrsW6/LvyAHkFFF+nHesCfgXONdRvkDtMjXfvSj52AfxrrfmKsG4plxMa6sca6dwI3A0ei3XGlPWYA9+QOUSVj3Rhj3VeBH6INl6RZewKnGesWyR1kbjTDUbpmS+ByY91vjXUTc4eZhZ5HIt2wDPA94CZj3ds7NONLRRepwjbAVca6E411q+cOM0q69qVf8wEfIM10/1qHZ7rPk7FuW+Aq0rLOVfOmEXmR+2LwT+cOURVj3XzAj4Ev5c4iQ2sH0s3k1t5Y0gxH6ardgBuNdT9oyRNMzyORblmDtIPg5ca6zXOHGQUVXaRKuwM3G+u+XOxY22a69qUq44Evkma675g7TJWKWY1fA84FXpU7j8gcdGIz0NEw1o0jLaH+YO4sMvQ2Bi421q2UO8jsqOAoXbYA8BHgCmPdyzJn0QxHkW56DXBh0eeqzVR0kaotAHwFOKXly3E6u9mTtNYywB+NdQd1aJb7HBnrFiXtivvF3FlE5mEgCo7GuiVIbUp2zZ1FpLAOcKmxbp3cQUbSkmoZBGsAlxnrdsiYQYV7ke6aDzjSWHeMsa6tzb5VcJS67EK6M75y7iBzoGtf6jAG+CZwfDFTqZOMdasAlwA7584iMgqdLzga65YHLgS2yptE5EVWJL2f2zh3kFlphqMMisVJm8ocmGl8Fe5Fum8f4Dxj3TK5g8zGA7kDyEBbH7jSWLdp7iCzoYKj1OldpFnundtQxli3GXAlaVMokS64KXeAfhjrlgX+SvqZKdJGS5M+y7Sm6DgWuD13CJGKjAUON9YdZ6xbqOGxHwSmNDymiFRvc1LhpVUf4GLwT6IbhFKvZYELjHXvzh1khM7PiJHWey3pdb8zO7gb6/YBLiAtDxfpivNyByir2GzqT8CaubOIzMN44E9tWV49FrgOeDZ3EJEK7UX60LRcUwPG4J8lPZdEpPtWIfVB2Sl3kBGuzB1ABt6CwC+Mdd8udt9sg5uBJ3KHkIH3UuBvxrq35w4yN8a6Mca6bwPHkPqwinTFpBj8nblDlFG02zkV2DB3FpFRWho4uw0byYyNwU+h49ObRWZjE9Ld6nUbHPOqBscSkXotApxqrPt07iCzuDx3ABkaBwC/bMOGGsUNPf18lSYsDJxkrHtv7iBz8RnS81Okazo5u9FYNxY4Dnh97iwiPVoJ8Ma6pXOGGFv8enXOECI1WQk4s8F+bHoeiQyWMcBhxrp35Q5SuCJ3ABkq7wIOyh2ioGK7NOnHxrrNc4cYyVj3FuCQ3DlESjo3d4BeFTfdvgPsnjuLSEkvI9VDxucKMLPgqDvHMqhWBX5nrGti2YmeRyKD6WfGuo1yh0BLqqV5hxrrdswdAhXbpVkLkGa4r5I7yEzGulcAvybdCBPpmifp5gzHzwD75w4h0qdNgN82VA95kZkFx7/mGFykIVsAP2xgnJvRTrIig2gccJqx7qU5Q8TgJwM35MwgQ2cM8Btj3csz57gYmJE5gwyXZYDTjXWL5g5irDPA6UD2LCIlnRSDfzh3iF4UrRUOzZ0joymkTduuJc1O/R1wFnApcCNwHzA1Wzrp1ZtIEygav2n13IDGugBMbDqASIP2j8F/v84BjHVHAx+scwwRyeYqYIsYfLY3WMa6LwBfzzW+DK3bgY1i8DFXAGPdBcBWucaXoXUqsFsMfnqOwYvNKs4BtswxvkhFNorBd2aVRtG+4A88Pzlr0N0B/L14XA7cUOzzMU/FpiQbFI8Ni1+bamc2O/8BbiMVQ58Gnil+nQYsC6xMars2rDdwDo/BN9ouZ9aC4zdpT68ekTo8C7gYfG09RIx125HeGIrIYDoxBv+OXIMb69YizaYWadqFwPYx+GdyDG6s25dmViuIjPS1GPyXmx60mInyY3QjW7rt6hh8Z3Z3NtZtSlr+PS53lhrNAC4CfgmcFYN/sMqTG+teDexB6n25YpXnnsUM0kSAc0kzLm8CbonB/2+UGZciFR5fDWwDbAusUE/U1vlEDP6opgabteD4GtQjRwbfw8BrY/ChjpMb6+YnLavOuhuUiNTq8zH4bMtsjHXXA+vlGl+G2tEx+A/nGNhYtzxwD8Mz40Ta5W0x+FOaHFBFdhkQ743BH5s7xGgUG41ex+AWnm4DjgeOj8HfXvdgxU2TzYF3AHsB/W5cMpVUDD4dODMGf1+f53sBY93apOLjW4HtGNyeuc8CW8fg/9bEYC/4SzTW3UmaZioyyG4GXjPaOyC9Mtb9Anh3HecWkVaYAbw1Bn9GjsGNdZ8HDs4xtgiwRwz+pBwDG+vOB7bOMbYMvanAOjH4O5sYrCiw30r/H9BFcnoIWHW0y3NzMtaNJfUofEPuLDX4B/BZ0mzGLP2QjXXLkTbh+RC9zx69i7Rb+M/r+vw+krHOAvuSPtMv2cSYDbsHWL+JVjkj7xL/qu4BRVpgbeDAGs9/Qo3nFpH8xgDfN9YtlGn8X5F60Yjk8I2M134nZsnIQFqYZvvnfhkVG6X7PtGFYmPh0wxesfFuYB9SYelPuYqNADH4B2LwnwDWIM3cfnoUh90A7AmsEYM/qqliI0AMPhR5VyS1tbipqbEb8lLg+KLQXquRMxwNqTH4sDbRlOHxBDAxBn9/HSc31l0MbFbHuUWkNT4Vgz8ix8DGup8AH8gxtggN9/+ZyVg3H/AvYK2mxxYhzW5/VQz++joHKXr1/guYr85xRGp2Lqnvb7Yi12gZ6zYn9SkelOfc48A3gKNybnQ4N8Xy5V+TeiiOdD+wXwz+d82mmrOibdp+wFeBxTLHqdJBMfjD6xzgBRXNYkqleoXIMFiEdPe4Ll+t8dwi0g6fM9blWmZxMKO7OyxShy8Y65ZoetAY/LPAV5oeV6QwBjisgXEOZXAKHzKcngI+3JFiowFOZHCec9cCr47Bf6OtxUaAGPzNwMak19Tps/zWsaT2Fa0pNgLE4KfF4L9DuuH5m9x5KnRosVFSbWY3hfJbQGPTVUUyel9xF7lyMfi/AJfUcW4RaY2lST1xGheD/w/w0xxjiwATgIMyjf1b0uwvkRzeYKzbtq6TG+s2AXap6/wiDTk4Bj8pd4h5KZaTHkd9Oyk37cfAJl34uweIwT8Tg/8MaaOWi4DXx+DfG4N/JHO0OYrB3xeDfyewFdCJv+d5mA842Vg3oa4BZrvzjrHuG6SmniKD7tQY/K51nNhYtx1wTh3nFpHWeBJYsygANspYtwJpU4Fem2+LVGEqYGPw9zQ9sLFuV6BVsx9kqFxD2nxw+jy/swfFjq4XkXZ1FemqG4CNYvBP5Q4yL8a6A4Fal5M25DHg/TH43+YOMkyMdUsBJwHb585SgTOBt9QxK3lOTSIPBxr/8CSSwS7F3eTKFbMcs+xiKyKNGQd8LcfAMfh7yTfLTGRh8rUPORU4LdPYIq8G3l7DeXdExUbptlsB15Fi4yakPodd9yCwmYqNzYvBPwzsAByZO0sF3gx8so4Tz3aGI4CxbiPSXbZcOxGKNOXiGPzr6jhx0d/tKtKOXCIymKaTdgD8R9MDFzNiTgDe2fTYIqRr/xUx+BubHthYtzhwBdpARvK4ndRnrJLCSrEhwfXAy6o4n0gG/wFeF4O/M3eQeTHWLQ1cB6yUO0ufHgC2yfEzWF7IWLcnqdVRl1cdTSM9h/9e5UnnuA12DP4KYP8qBxNpqc2NdTvWceKiB8UuwJQ6zi8irTCWTHfJi6UPHyC9cRZp2ljgSzkGjsE/BuyM+o5LHqsBe1V4vi1RsVG66wFg2y4UGwvfZjCKjVur2NgOMfgTSLMEWz+7dy7mB35hrFuwypPOseAIEIP/KWmnIJFB94G6ThyDvwF4f13nF5FW2MFY99IcA8fgp5BubDycY3wZem821i2cY+AY/E1UW/QR6cX/VXiut1Z4LpEm/Ze02UfIHWQ0jHWbAe/JnaNPM4uNNzU1oLFufmPdIsY6rX6dgxj8ecAewLO5s/RhbSpeWj3HJdUzGevGAecDtfS5E2mJJwETg3+irgGMdd8CPlXX+UUku4/E4H+Ua3Bj3ebAHwCTK4MMrR1j8GfmGtxYtx/wHdJuiyJNeQZYJgb/aD8nKVpj3En3Z1zJ8LkR2D1HS5kyitYFVwPr5c7Sh2mkYuPFVZ/YWLcAsCmpT+36xWMiaZnwzIlqM0gFz9uKx3XAmTH4W6rO04/iddUASwGPAw/H4J9saOx9gGOaGKsmU0ktQyqZsTzPgiM8V3T8Ed2/GyAyN7vG4E+tcwBj3YeA7wKVTlUWkVY4Jwb/hpwBjHUrkXbv3ShnDhk6P4/BZ53Jb6zbCjgZWDZnDhk6e8TgT+rnBMa6V5F2vhbpihmkjTK+0FQRpwrGuo+Tbk512adj8N+q8oTGuo2Bd5E2wyp70/rfpM1SfxqD/3dV2UbDWLcYsAWwNfA60s2bZUhLhGf1JKlYegVwSfG4LgY/rYZMB5CW7nfVaTH4nas40agKjjMZ6z4IfA8VS2QwnRCDr31plrHuNaSCwMp1jyUijapktku/iuUu36PGVhEiIzwIrBCDz7qMyFi3InAKsHHOHDJUTo7B797PCYx1XyVTL1SREu4A9o7BX5Q7SC+MdSsANwOL5c7Sh9OBnYr+3X0z1u0OfIVqN1+bDvwWODgG/68Kz/sCxQzGNwIfA7bhxcXF0XoEOA44OgZ/c0XxADDW/Ypub+r45hj8n/o9SU8FR3hu9+rfAyv2O7hIy0wGlqvjLsdIxroJwInAdnWPJSKN6nu2S1WKJR3fB8bnziJDYbMY/KW5QxQF9yOAj+TOIkPhcdKNptIbBRjrrgNeWV0kkdr8HPhkDP7x3EF6Zaw7Eejr5kBmtwOvLjYk7YuxblPSDNXX9p1qzmYAxwP7VXm9GOvmA94LfILUb7BKFwJHVNUixli3BHAD3Z1kdDuwbgx+aj8nmeumMbNT7F79KuAo0rRUkUGxNGkadu1i8P8FHKmxrHYXExkcO+UOMFMM/lhgddKbSv28lrq1YtOLGPxTMfiPknpPnZY7jwy8xYCtyh5srFsNFRul3WaQJhttFIN/f0eLjdvS7WIjwPv7LTYa68Yb644jLSWus9gIaWLb3sC1xYS1vhnrXgZcBvyE6ouNkF7LzzDWnWGsW7XfkxUrnvYmzfrsotWAz/Z7klLNtadMnjRlyuRJZ4+fMPEXpOXV61N+GqtImzwyZfIk38RAUyZPmjFl8qR/jp8w8WjSFP+XkfpNiEh3rTx+wsQjp0ye1Iod6qZMnvTElMmTzhk/YeKxpJ/Tr0I/r6Uey0yZPOkHuUPMNGXypAemTJ508vgJE88AVqDaJWMis3p8yuRJpZadjZ8w8d2kG9AibfM0cCzwjhj8j6dMnnRv7kBlFLPez6DbG+qdEYM/tJ8TFDc3/gI03Wt8aeDd4ydMnDxl8qQry5zAWDdm/ISJnyGtDmxituCawAfGT5g4ffyEiZdNmTyp9BL2KZMn3TF+wsTFSJvxdNEm4ydMPHnK5EmTy56g5yXVs1P0zPks8G60dEu67Y4Y/Go5BjbWjQXeBuwLbE5Fz08RaZyLwZ+dO8TsGOteCnyUdKd/1bxpZACtU3UPpKoU/ZP3BXYGlsgcRwbLvcBKMfieZ7EY6y6gjxmSIjV4EPgF8N0Y/H25w/TLWPc54JDcOfrwDPDyfjZiMda9nrSp2tKVpSpn3xj8j3s5oFhCfSxQ+z4Lc3AW8PYY/P/KnsBYtyBpReMalaVq1jmkzzalCq+VFjSMdYsAbyYVTXYgbaEu0jXrx+CvzxmgaGy8G2m3sI1R8VGkS34cg983d4i5KZptb0h6jXkbaUc/kX59PAb/3dwh5qaY7bId6dp/K93eQEDaY70Y/D96PchY9yiweA15RHpxK/CH4nF57g3AqmKsWwW4CVg4d5Y+fDcG//GyBxfLyc+iHZv+zgDeHYM/fjTfbKybH/gV6ed1TtcBb4rBl57la6zbi7Q5TVftFoP/XZkDaytiFNuTvwXYhTRba9m6xhKp2F4x+BNyh5jJWLcyqS/cFsBmwPJ5E4nIPFwSg988d4jRKmZXbwRsTVrysSn574JLNx0Zgz8gd4jRMtaNA15Pep+6KfAadLNcyul5N89iokbpWTMifXgEuAr4K6nX7b+q2vm4TYx1PwPelztHHx4DVo3BP1zmYGPdBsAFtOvG2rOk4t1cVwIV701/C+zaSKp5uxvYJgYfyhxc/Hn+RT29J5twC2kDmZ5vRjQ2a8pYN5HnP8hsQlobrzd10kaficEfljvEnBjr1iB9ONoMWIc0PXt5NAtSpC1uj8GvnjtEWcXsxzVJP6/XA1Yh9cxZhW73QJL6nRiDf0fuEGUVy57WJ137a/HCa3/RjNGk/d4fg/95LwcUn41KfXgVGaX/AfcB9wDXAlcWj1sHscA4K2PdSqSZmwvkztKH0itmiteXS2jnpK/JwIYx+Nvn9A3Guu8ApWd21uTfwMZ9FIDfDpxUbaRGvS0Gf0qvB2UrUBQfaJYlvYmb3WNF0pu7Nkz/leHS19T1HIx1C5N2o12dVICc+etqpJlKi9Pt5QQiXfJkDH4gn2/FjJyZBZiZvy5Ben0ZR1ou83S2gO00nnRzaG0G/z3NX2PwW+UOUbXiPetSPP8edWVSG4JFeP7af5o0c0OeNwFYl/SeZNBvin45Bv+1Xg4w1m1BmmE2DKaQegM+VPz6X1JvOunfdCCSCov3z/Lr/f30nes6Y913gf1z5+hTqTZfRd/DS0mrV9rqOmDTGPzUkb9hrNsX+GHzkUblPFI/w2m9Hli8l7geeEXlqZpxPfCqXm9WZNupsgj6QPG4Yk7fV0w/HUe6OzHob1babHHSm8aXz/JYF1goZ6iarJA7QK+KF+t/FY/ZKvpgLMJgPY9mXpcjr81BvC4h9dr7S+4QJc0HWF74b7Ue7bzz2q9xxrqlyt4BbbMY/BOkfkg35c7SNcVr8ETStf9a4J3AS7KGql7nfn6ORvGedXLxuDZznM4pblSsQ3r93wb4PwZvk8ky1/5APl+Ap4CLSBsNnAuE4meHSCOMdcsB78+do09X9LGnwCdpd7ER0mqCnwJ7zvpFY90bge9lSTQ62wLfAfbr9cAY/Axj3Q+BoytP1YxXkvZp6al9yCAVHqRhxrolgT2A95D6Hg2KTvVfkxcy1i3B89dl23/Y9upNMfizcoeoSnGnb2vSv9WuDNYs3JfH4Od4A0CkKEBuD+xD6nnd5WVfMz0BLDboS/WkP8a6xUk30N5DWr4+CM6Iwb+llwOMdZ8EjqgpT9MeA35J+iD6t9nNWhJpirHum8BBuXP06X0x+GN6PchYtyZpJlpXWtftH4P/PoCxbj3gYtrVc3J2ZgCbxeAv6/VAY93SpBnIXX3P93fSzNRRv89TwVEqYax7OfAh4INknDlbkU73X5PnGeteRrom96X71yUMWMFxVsUH0N2BzwKr5k1Tie1j8F2djSoNK2ZjfIsRd/o7aokY/GO5Q0g3GOteTZrt0fUb11fF4Hv6Mxjrvg10ZpOlOXiIVDQ9Ogb/aO4wIsa6pYA7aX/Ram6eBpYuMzPYWPdH0k3MrniGNPP9VuByUruSLrgWeE2ZTVSMdWcAb64+UmO2jcGfP9pvHltnEhkeMfh/xuA/SnrDeHXuPH0atCVuQysGf2MM/mPABsyldYPkF4N/LAb/U9Jy0yNIPYm6bFCXykkNYvAPxOD3At4IPJ47T5907cuoxeCvIW0m+fncWfpU5rrv+vvNE4G1Y/CHqdgoLbIf3S42QlpOXabYuBawYw156rQAcAppdnRXio0AryJNtirj11UGyaCnn9cqOEqlYvDXkXZQ7mltf8uMK6Y7y4CIwd8AbAGcnjuLzF0M/okY/KdIM716bsjcIl3/ICkZxOA96U7/5NxZ+qCCo/QkBv9sDP5Q0oqEri7HX77YqKEXXX2uTCHtVvqOGHyXX6tkwBjrFqN9OxuXUXYzqU/QzRWsy5MKeF3z+aI9Tq9OJ7Wg6aptjHWbjPabVXCUysXgnwR2BnzuLH1QsWDAxOCfIvUJPDN3Fpm3GPxvgHfkztGHrn6QlMxi8FcBb8+dow+69qWUYpb7YblzlDSW3jdBW76OIDWbSmrvckruICKz8SFgqdwhKtBzwbGYLLNXDVlkzl5CieXrMfgpwJXVx2nUqGc5quAotYjBP0O6Uz0ld5aSlssdQKoXg59GejPS5btKQ6P4QHNq7hwl6TVESovBn0t3r/0lcgeQTjsEuCd3iJJ6vfa72Ft6lxj8hblDiIxkrFuY7vdEhbS659ISx72Bwdp8sSs+WPK4rhcc32SsW38036iCo9QmBn8X3b1T3cU3gTIKMfh7gENz55BR+yRpRkXX6DVE+nUA8GTuECJNisH/Dzgwdw6ZrR8UbR9E2uidDMbN3n+V6d8IbFt5EhmN7Yx1K5c47qrKkzTvU6P5JhUcpW6HA7fnDiEywhGk3dCk5WLwd5JeR0SGSgz+DuCbuXOIZHAScFHuEPIC9wGfzR1CZC72zh2gIneXPO71laaQ0RoDbFniuEEoOO5S9E2dKxUcpVZFP8dP5s4hMquin+MgNJUeFocBd+YOIZLB4cAduUOINCkGPwPYH5ieO4tiDSJPAAAgAElEQVQ855hi9qlI6xjr1iBtWjoI7u31AGPdS4FVasgio7NxrwfE4G+j2xsEQlrCv+u8vkkFR6ldDP404MLcOURmFYM/Ezg3dw6Ztxj8VOAzuXOINK249o/MnUOkaTH464EzcueQ5/wydwCRuXhX7gAVuq/EMdqsLa9R79g8Qs/F5Rbac17foIKjNEW72Ukb6brsjtOBp3KHEMng7NwBRDJRv8B2+GsMXm1opJWMdWMYRdGjQ8oUoQahd2WXvaK4Dnv1aOVJmrf1vHpYquAoTdEHJmkjXZcdEYOfAlycO4dIBgEtq5bhdE7uAAJodqO02ybAGrlDVOA/wNHAX0ocu2zFWaQ38wOLlDhuEAqOY0gbNs2RCo7SiOLO6G25c4jMqtiQ5N+5c8io6cOnDJ2in52ufRk6RY+rSblzCJfnDiAyF3vlDtCHv5M2Y1ovBr9yDP7DxeterxaqOJf0btESxwxCwRFgz7nN8FTBUZqk2WTSRrouu0P/VjKsdO3LsNK1n98duQOIzI6xbhzw9tw5evQsqaXTa2Pwm8TgvxmD/0ef53ygglzSnzIFxzL9OttoHWCDOf2mCo7SpPNzBxCZDV2X3XED8N/cIUQyuCp3AJFMdO3ndX+xeZVIG70JWDJ3iFGaCvwAWDMG/7YY/BUVnvv+Cs8l5TzT6wEx+AOA1wDfovs3duY403j+OkYz1v2W9k/tfTYGv0vuEEPm9twBmmasez+wZe4co/D9GPywLpkZuuuyq2LwM4x1dwATcmcRadig3AUX6dU9uQMMObVDkjbrynJqD3w4Bn9HTedXwTGvZ0g9OHsWg7+KdGPt08a6jYD3Au8BFqguXiP2MNYdEIN/UeG1loIjsCMwrqZzV2V67gBDaBC2fu/VJsyjkWpLnM7w9ugZxuuyy+5lLtP2RQZRDP4ZY92DqDG8DB/9jM7rztwBRGbHWLcMsEPuHPPwIPDxGPyJNY9zF/AU7Z/wNajuiMH3XVsqZr1eYaw7FPg88G66U3g0gAPOGPkbWlItTXqA1LdCpE0i8HTuEDJq+vApw0ozvWQY6TU/r4VzBxCZg52pb/JUFX4FrN1AsZEY/DTgn3WPI3N0a5Uni8HfGYP/ALAmcCwwo8rz12j32X1RBUdpTFH5V1NbaZViB1gtRegOffiUYaVrX4bRI8CTuUMMsVVzBxCZg21zB5iD6cCBMfg9Y/APNzjutQ2OJS90XR0njcHfEYN/L+lav6uOMSq2zex2q1bBUZqmGRrSRrouu0P/VjKsVHCUoVPcFNTrfj6r5g4gMpKxbiywde4cs/E/YKcY/LczjK2CYz4X13nyGPwFwHrA8XWOU4HlgbVHflEFR2maPjBJG+m67A79W8mw0sYxMqy0CiGfJY11XdkFWIbHusAyuUOM8B9g8xj8i3rYNUQFxzxmAJfUPUgM/tEY/N7ArsCjdY/Xh21GfkEFR2lak1PLRUZL12V36N9KhtVTuQOIZKJrP68tcgcQGeFFRY3M7gO2iMFfnzHDDWhT3Bz+FYN/pKnBYvCnAlvS3htxKjiKiIiIiIjIqLwtdwCREdpUcHwMeGMM/o6cIWLwTwD/zplhSNU+u3GkorC9KTCp6bFHYeui5cFz2ryzk4iIiIiIiOTzVmPdwjH4qbmDiBjr5ge2yp2j8BTw1iZmNhrrxgFLA2NIMxlnjHhMB25iNj30pFa19m+ckxj87ca6zYE/A6/KkWEOlgJeySxL/FVwFBERERERkdlZFNgZ+E3uICKk4sriuUOQCnzvjMFfWOVJi11+XwVsT9qdeBVgOdrxZ5YXy1JwBIjBP2Cs2xq4FHhZrhyzsQ0qOIqIiIiIiMgoHGWsOz8G39a+YTI82rI79VEx+N9XdTJj3YrAAcA7gGWrOq/U6mFgcWOdBabO+ojBz2giQAz+UWPdjsDlgGlizFHYGjhi5v+o4CgiIiIiIiJzsgxwnLHujTF4bUwhObWhf+ONwOerOJGxbiLwGWBPYMEqzimNWQqY7XJ6Y91TwBTgAeA24HYgAD4Gf0uVIWLwtxnrdgXOBRao8twlbWmsWyAG/wyo4CgiIiIiIiJztz3wCWaZuSLSJGPdgsDrMseYBuwdg3+yn5MUG2t8EjgYWKiKYNIqCxWPpRjRV9NYdyNwKnBCDL6SjX5i8BcZ6z4M/LyK8/VpUWAD4O+gXapFRERERERk3r5trPuhsW6R3EFkKG0EjM+c4Rsx+Kv6OYGxbhXgAuBbqNg4jF4GfAG40Vh3rLFu5SpOGoM/Bji2inNV4LmZyCo4ioiIiIiINOuZ3AFK2he4zlj3zmLnXJGmrJ95/AB8vZ8TGOs2Aa4DtqgkkXTZfMB7gGCsO9JYt3AF5zwQeKiC8/TrueeqllSLiIhIz4qdFJcCVgCWJ71xkvqsmTuAJMa6+UhN/VcAJgBj8iYaeBNyB6jJ47kD9GEi8Cvgu8a644Dzgati8A/kjSUDbq3M4x8ysy9dGca6LYEzSUtORWZakNSuYltj3W79LLOOwU821h0AHF9ZunKee66q4CgiIiIvUhQUXwG8klRYGfl4CVoKJAPIWLcAsClgefE1P7PArlVC0q8uFxxnmkDqQ/dJAGPd3cBVxeNaYDLwBGnzhJmPJ2Lw07Kkla7LWXC8Ffh12YONddsBfwSqmMUmg2k94Cpj3ftj8CeXPUkM/gRj3d7AttVF65k11o2NwU9XwVFEREQAMNbND2wG7AS8FVgtbyKRZhjrFgUc6bp/M7Bk3kQyBAah4DjSisVjp7l9k7FuGqDdrst7AniweDww4teZ/30fcHsMfkaukDXIWXA8tGyh3Fhngd8zPMXGGcA+wFuAnTNn6ZrFgBONdYvF4PvZAObDwD/Jt/P5wsBKwJ0qOIqIiAwxY9140u6jO5EKLYO6fFHkBYx1ywM7kq79bdGMXWnWIBYcR0ufQfuzIKmlybwKcPca684BzgHOjcG3obdbKcV7lUo21yjhDkouUS36nJ5CKiQNi/1i8L801p1IWkL++tyBOmYM8BNj3dQYfKlZtTH4UPz9711ttJ6shQqOIiIiw6dYLv0G0h3Q7QE1/pehYKxbEHgvsCewMeq/KPnclTuADLwVgHcXD4x115CKj+cAl8bgn8qWrHc249g/6KMNwPdIrWmGxRdj8D8EiME/ZazbCTiX9PNWRm8s8Etj3f9i8H8seY4jyV9wPEf9Z0RERIaIsW5D4Dzgz6TlLio2ysAz1o0x1r0duAn4EbAJKjZKXrfkDiBD59XAZ0ib/Ew21p1urNuquAnZdjmXU/+uzEHGum2A91ecpc2OjMEfPOsXYvBPADsA/8gTqdPmB44z1q1U5uAY/A2k9/u5rAVqeC0iIjIUjHVrFMsrrgS2zp1HpCnGuq2BK4CTgNUzxxGZ6ebcAWSojSe1lLgA+JuxzrW88Lh2pnGvisHfWfLYb1aapN2OicEfMLvfiME/TFpNc2uzkQbCEqSiY9nn5pFVhunR2qCCo4iIyEAz1i1jrPseaWbX7rnziDTFWPcKY92fSLN5NsydR2QEzXCUttiMtOrhSmPdTsa6NtYIcs1wLDu7cVfgNRVnaavfAR+Y2zfE4O8n9XK8p5FEg2Vr4OMlj/0z+X7WaIajiIjIoDLWjTfWfZ50R3k/YIHMkUQaYaxb0Vj3C+B60lIukdaJwT+G+jhKu2wA/AG43li3u7FuvtyBZtGZgmMxG+3rNWRpo7OBd8bg57nrfAz+DtJMx//WHWoAHWysM70eVOxSf2oNeUZjRWPdIio4ioiIDBhj3SrAZcDBDNfOiDLkjHXbAjeQNklo8/JAEUg7uIq0zcuBE4F/Guuyz9IrCng5Co43xuDLLAPeFFin6jAtdCmwSwz+6dEeEIO/EXDA47WlGkzj6W+WYy5rquAoIiIyQIx1m5H6NK6XO4tIU4pNYT5Cmm2xVO48IqP0+9wBROZibeASY93HMvd3XB5YNMO415c87m2Vpmin64E3xeCn9HpgDP4q0qaFT1aearB91Fi3RInjLgMerTrMKKngKCIiMiiMdfuQGsAvkzuLSFOMdQsAPwZ+ALRpCaDIvFyElhdKuy0AHAWcaqzLdTOn56WkFbmp1wOK/pe71ZClTQKwfQz+kbIniMFfSPp7mlZVqCGwBLBvrwfF4KeRb7dqo4KjiIhIxxnr5jPWHQEcg3o1yhApehr9Bfhg7iwivSo+CP4xdw6RUdgJuMZYt1GGsXO1hum54EhaTv2SqoO0yN3A62PwD/Z7ohj8maT2JzP6PdcQKbv5Y65l1Yup4CgiItJhxfKKM4FP5s4i0iRj3brAFcCWubOI9CFXQ3+RXq0KXGys+3jDS6y7VHDMUZBtykPAdjH4yja7isH/GvhoVecbAusZ61YqcdzfK08yOio4ioiIdJWxbnXSmwiXO4tIk4x1O5Cu/dVyZxHp07nAY7lDiIzSAsB3SEusxzU0Zo7+jdOAf5c47mVVB2mJxwAXg7+56hPH4H8EfKHq8w6wHUocc2flKUZHBUcREZEuKnop/ZnU1F1kaBS7pv6ePB9CRSoVg38K7VYt3bMT8CtjXRN9c3PMcLw1Bv9MieMGseA4FXhzDP6augaIwR8CfLuu8w+YN/V6QAz+caB0z80+qOAoIiLSNca6+YGTgDVzZxFpkrFuBVLPu6Zm1og0QcuqpYt2BY5qYHl1joLj5JLHrVNpivyeAf4vBv+3ugeKwR8I/LzucQbAK0oel2OWowqOIiIiHfQtYPvcIUSaZKxbGDiNwW7IL8PpLOCe3CFESvgo8Omax8hRcCxbJ1my0hR5TQf2isGf1eCYHwROaXC8Llqx5MxiFRxFRERk7ox1+wAfz51DpEnFDJqfA6/JnUWkajH4qdRftBGpyzeNdXvWeP4uFRwHyb4x+JOaHDAGPx14F3B2k+N2zPzAS0scp4KjiIiIzJmxbnPg6Nw5RDI4CHhH7hAiNToRuDR3CJGSjjXWvaGmc6vg2LzPxuB/kmPgGPzTwC7AJTnG74hVSxxzd9UhRkEFRxERkS4w1q1C6vO1QO4sIk0y1u0IHJo7h0idYvAz0Ox16a75gd8b6zao4dwqODbrsBj8N3MGiMFPIW2Ocl3OHC02vsQxOT4/qOAoIiLSdsa6RUgbZSyTO4tIk4x16wK/AerelEAkuxj8lcAvc+cQKWkR4A/GujLFkLnpUsExVpqieT+JwX8mdwiAGPyjwBuAf+fO0kJTShyzaOUp5k0FRxERkQ74NPDK3CFEmlT0bTyaPG+SRXL5HPC/3CFESloJOLDic+b4GbBIyeNuqjRFs04C9s0dYlYx+AeB7YD/5M7SMmUKjjkK94vNn2FQERERGSVj3fLAAblziGSwI7B57hAiTYrB32esOwT4Ru4sIiUdZKw7Ngbf5SLRasa6cTH4J3s87mbgdXUEasCrgOuNdaP53meBacAPY/C/6GUQY93WwJHAfIx+9YLaCb1QV2Y4ooKjiIhIu32J8nfaRTrJWDc/kLWHlEhGRwHvA9bIHUSkhIWBw6huo68cM37nA9YBru3xuC7PcFyrxDHTShyzIbB+iePkefeWOCZHwfFxLakWERFpKWPdmsAHcucQyeDdpA97IkOnmFW1M/BY7iwiJe1hrNusonM9XtF5evXyEsdcWHWIlru9xDFrV55iuNwag3+kxHEqOIqIiMgLHEq6yy4yNIoNB76aO4dITjH4fwA7AU/nziJS0neNdVXUGzpTcIzBXwvcVkOWtvpniWPKzKSU511d8rjVK00xOio4ioiItJGxbmNg19w5RDL4OLBC7hAiucXgLwD2yp1DpKQNgL0rOE9nCo6F31eaor1uLznTTgXH/lzV6wHGuqUAW0OWeVHBUUREpG2K3XkPz51DpGnGOgMclDuHSFvE4E8GPpE7h0hJ3zDW9buUM1fBsWyfwVMqTdFe1/R6gLFuAmBqyDJMzi5xzEaVpxgdFRxFRERa6E10d5dDkX58Hlg8dwiRNonBHwV8O3cOkRKWA3bs8xy5Co4rFKtNehKDvxK4oIY8bdNzwRHNbuzXdTH4G0oc99rKk4yOCo4iIiIttH/uACJNM9YtjDZJEpmTg4Df5A4hUkK/7WFyFRwBdi953BcrTdFOfy9xjAqO/Tmu5HEqOIqIiAgY65YEts6dQySDbYHxuUOItFEMfjrwHuC3ubOI9OiNxWZgZeUsOO5WZuObGPwlgK8hT1s8APy1xHHaobq8pyl/00lLqkVERASANwLz5w4hksFOuQOItFkM/mnSjKuPoN2rpTvGA2/o4/j/VRWkhBWALUoeewAwtcIsbXJyDP7ZEse9svIkw+MHMfgHez3IWLch+fpmquAoIiLSMm/NHUCkaca6+ei/z5fIwIvBz4jB/wjYBLg1dx6RUepnWXXOGY5Qcll1DP5GYL+Ks7TFr3s9wFi3OFrBU1YEvl7y2PdVGaRHKjiKiIi0hbFuIWCH3DlEMtgYWDZ3CJGuiMFfA7waODl3FpFR2NFYt2DJY3MXHHcz1i1W5sAY/DGUKM613PUx+CtKHPcmoOw1MOy+EoN/pNeDilYGe9SQZ7RUcBQREWmRrYBSb2pFOk4ze0V6FIN/jPRh8sPAU5njiMzN4qQ+vWXEKoOUsDTwqT6O/xBwaUVZcptBaulQxi5VBhkifwV+UvLY3UjPvVyiCo4iIiLtoR52MnSMdWPQtS9SSrHE+mjSLOF/5s4jMhdlC073k7ePI8AnjXWlZuHH4P8HbA+cV22kLI4rNsTpibFuHKlHufTmLmC3GPy0ksfnXE4N8G8VHEVERFqg2AXxLblziGSwNmBzhxDpshj8daQNGf4PuC5zHJHZKdWnNwY/A7il4iy9WhT4QtmDY/BPkJYUn15ZouZNBj5d8tjtgUUqzDIMpgI7xeAfKnOwsW4tYPNqI/VMBUcREZGW2JC0G6LIsNHsRpEKxOCnx+B/T+rt+Gbg8syRRGa1nLGu7G65uQuOAB801q1W9uAY/FPAzsD+wBOVpWrGo4ArW/xCy6l79Tip2HhtH+c4pKowJd0dg39CBUcREZF22DB3AJFMdO2LVKhYZv0n0k7WrwcuzJtI5DlrlTyuDQXHBYFD+zlBcVPg+8DLgb9Ukqp+j5OKjVeWOdhYtwAlZ7cOqfuALWLw55Q9gbFuG/rbGb4KtwCo4CgiItIOmt0ow0rXvkgNisLjeTH4rYHXAX8gfy88GW5rlzzu5kpTlLe7sW7Pfk8Sg78jBr89sClwLO2d8TgZ2CEG//c+zvEx0sY7Mm9XAxsXLTJKMdbND3yvukil3QwqOIqIiLSFii4yrHTti9QsBn9xDH4XYAKwJXAwcAVp11mRppQtOLZhhuNMRxvr1q3iRDH4y2Lw7wVeAnyQ1AZhehXn7tN04GfAmjH4i8uexFi3PPClylINroeBfYGNYvB39XmujwCVXJ99ugVg/twpREREBBi+ossjwL3APaTeQPrQO3frkJZgDZRis6SX5M7RoBnAg6Rr/z7aO6ulTbYClskdYlDE4J8GLioeXzTWTQC2IW3q8AZgpYzxZPCVvb5CpSn6Mx74nbHuNcUO1H2LwT8O/BT4qbFuSWAz0qzk15HajixYxTij8DhwFnBkDP6KCs53GLBYBecZVPcCpwAHx+Bjvycz1i0DfKXf81REBUcREZEWGdSC4/3AOcD5wG0UhZYY/JSsqTrGWPc58jcAr8MEYIHcIWpyE3A2cDHwH9K1/0AM/pmsqTrGWHceqSAmNYjB/5f0gfcUY90YUkFoBWBZYLm5/LooulFU1hhSAWlM7iAZlCo+xeCnGOvuAlauOE9Za5NmAO5R9Ylj8I8AfyoeGOvGARuRNoNaDVi9+HU1UvGzrCdIN33vBv4NnAGcV2xu0zdj3cZA38vPB8wM4BrgTNLf9zXFLux9K27gHgssWcX5KqCCo4iISIsM0iyvq4HfkootN1T1ZkoG0iBd9wB/JH2IOCcG/5/cYUR6UbxW31U8pGbGuvlIhcdZH+OAicCrgPWLXy2DU5zsZ7bbLbSn4Aipn+N1MfjD6hwkBv8kz89KfgFj3XKkAuSKpOLjQqRraOSvT5AKi889YvAP15W5KH59n8G5bkfrWdLf9X3A7cAdxWPmf99a3OSpwzeBN9d07l5NJd1oVcFRREQkN2PdQoDJnaMCDwCfBn4Vg29DDyJpv0GZ2Xs1sF8M/rLcQUSkG2Lwz5I+mE8d8Vu3km7YAWCsW4xUfHwHacbYIk1lrEG/BcftqgpSkW8a6xaJwWfpUxiDf4D03qtt9iEtBW+Tp4E7SQXBqfN4TJnL/8/x93KtYDDW7Q0cmGPsOQgzPweo4CgiIpLf8rkD9GkaaUe8r8XgH80dRjql6wXH/wKfA44pigciIpUq+vv9Dfibse4gYH9Sn7b5cuYqqd+CYxt9sei7+DGt6ABj3bak2Y053Q38A7ihePwDuHkQW5oY6zYFfpI7xwjPPVdVcBQREcmvy0WXy4D3xeBvzB1EOqnL1/7PgYNi8JNzBxGR4RCDfww42Fh3IXAy3XsN7Wfzk+sqS1G9/YAljXX7xOCn5Q6Ti7FuC+B00jLuJs0AziNtvHNuncvF28RYtxpwKmnpfJs891xVwVFERCS/rs5wvB5wxQcgkTK6eu3/DPigZrOISA4x+IuNdTsCV9DNmY5lXEFavtrPRil12hNYylj3nip2HO6aYqbdn2j23+dJ0mzKn8Tgb21w3OyMda8lFXeXzZ1lNs6f+R9jc6YQERERoJu79P4H2EHFRulTF6/9PwP7qtgoIjnF4K8BDsmdoykx+KdJS8vb7M3Ajca6ynevbjNj3Uakn42LNjjs+cB6MfhPD2GxcVfgAtpZbHwcuGrm/6jgKCIiIr16ilRsvDd3EJGG3Qi8bZiXzIlIqxxCWm0wLM6f97dktwzwG2Pd6ca6l+YOUzdj3atJmxwt3tCQjwHvicFvG4MPDY3ZGsa6A4FTgIVzZ5mDi2Z9j6SCo4iIiPTqpzH4f+YOIZLB52Pw/8sdQkQEnpv1tzdp87ZhcEHuAD3YEfiXse5Dxrp+ele2krFuPmPdAcBFwJINDTsZ2CYG/8uGxmsNY91ixrqfAYcDY3LnmYsXPEdVcBQREZFePE16syMybG4g9UsSEWmNGPz1pN55w+Ba4NHcIXqwBPBj4B5j3beMdTZ3oCoY6zYg9dT8NrBIQ8M+RCo2Xt3QeK1hrHsXaefn9+XOMgovmIWsgqOIiIj04pgY/N25Q4hk8PUY/PTcIUREZuO03AGaUCzV/GvuHCUY4FPALca684x1bzPWda6HcTHL7kjgcuDVDQ79ELBVUVwfGsa69Y11fwNOAF6SO88oPMyIFg/apVpERER6cWzuACIZPMKQfKAXkU46E5jOcEwoOh94S+4QJY0BtikeDxnrziUtQb0gBj8pa7I5MNaNAbYA3gP8H83NaJzVe2PwN2YYNwtj3SuBDwIfoFu70F8w8sasCo4iIiIyWpNJy5lEhs152ihGRNoqBh+NdZcDm+TO0oAubBwzGssAexQPjHV3AxfyfAHy9nzRwFi3Mqk/6LuB1TNGOT4Gf0bG8WtXFHU3AXYuHmvkTVTai56bKjiKiIjIaJ0bg382dwiRDM7JHUBEZB4eyh2gIf8i/VmXyR2kYisC7yoeGOvuAv4JhBGPO6tu72GsGw9sAGw0y2PVKsco6R7gY7lDVM1YtxywNrAOsD5pg6EVsoaqhgqOIiIiUtqluQOIZKJrX0Ta7oncAZoQg59urLsAeFvuLDVbuXiM9JSx7jaeL0D+F5g6m8eTs/z3s6Q+kssAyxa/zvzvNYB1aefS3ffH4B/JHaJXxrrFSH/fBlie54uLaxePpfKlq839wM0jv6iCo4iIiIyWNouRYaVrX0TabigKjoXzGPyC45wsRCperZM7SM2uisH/uc4BiqXMC8/yGA+Mm81j4dl8bRGeLyrOfEwoHgvVmbulzo/Bzxj5RRUcRUREZLTuzR1AJIMngUdzhxARmYdh+mx/KvBDhuvPPGx+1O8JioLiRsAuwNbAEqSi4qzFxTH9jiMAnDS7L+oJKiIiIqOl/o0yjJ6d3V17EZGWWTV3gKYUm+ScRXd3q5a5e5g5FLBGw1i3NPBlUqFxxapCyRxFwM/uN8Y2HERERES6a9AatIuMxiLGuoVzhxARmYfVcgdo2PG5A0htfhmDn1rmQGPdhsA1wP6o2NiUE2Pwz8zuN1RwFBERkdFaNncAkUxUbBeR1jLWLQCslDtHw84EOrehiIzKH8scZKxbDTgXWKXaODIPcyz+q+AoIiIiozVssydEZtK1LyJtthJD9tk+Bv8UcHLuHFK5p4HLez3IWDc/8BtSn0Zpzk3A1XP6zaF6URIREZG+vD53AJFMdO2LSJttkjtAJlpWPXiujME/WeK4vYCNqw4j83TC3Ppcq+AoIiIio/VaY91SuUOIZPCG3AFERObiPbkDZHIZcGvuEFKpv5U8bq9KU8hozAB+PbdvUMFRRERERmss8MbcIUQy2NBY99LcIURERjLWrQJskztHDsXMqhNy55BK9VxwNNatBGxRQxaZuwti8HfN7RtUcBQREZFefLHokyMyTMYAX8wdQkRkNvYivUYNKxUcB8stJY55B8P9HMhlns89FRxFRESkF2sD++QOIZLB+4x1a+cOISIyk7FuPPC+3DlyisHfBlycO4dU5t4Sx2xZeQqZl6nA7+f1TSo4ioiISK++aqxbOncIkYbNBxxhrNP7ZxFpi68DK+cO0QLH5Q4glXgkBj+1xHEvqzyJzMupMfjH5/VNesMkIiIivVoeOMtYt2juICIN2wE4ylinpVsikpWxbhvg47lztMSvgQdyh5C+3dfrAca6RVDRPYdvj+abVHAUERHJb1ruACW8FjjNWDcudxDptC5e+/sBX8kdQkSGl7Fuc+B0uvd5vpbX/GJW3BF1nFsaVWY59dqof2PT/hSDv24039i1FygREZFBdLOahWoAABCISURBVH/uACVtC5xhrFstdxDprK5e+18y1h2hWb4i0jRj3c7An4FFcmcpoecZbD04Gni4xvNL/coUHNeqPIXMyyGj/UYVHEVERPIr8warLV4P3Gis+4qxbuHcYaRzunztfxK42Vi3h5ZYi0jdjHVLGutOAE4Funqzo7bX/KKf3FF1nV8aUeb6WL7yFDI358fgLxvtN6vgKCIikl9XZ3nNNA74MnCTsW5nFV+kB3XOdmnCS4HfABca69bLHUZEBo+xbnFj3YHAzcC7cufpU92v+d8H5rmRhbRWmetjQuUpZG5GPbsRVHAUERHJLgb/JDA5d44KrEKaeXG+se7DxrrVcweS1uvyDMdZbQFca6w7wVj3dmOdPgCJSGnGuoWNddsZ674D3AUcDiyXOVYVan3Nj8E/DPyozjGkVmWuD/28bc7fgQt6OWD+moKIiIhIb+4Fls4doiJbFQ+MdbcCZwPnAbeT/pwPxeCn5wonrTIoBUdIN/LfVTxmGOuuBM4BLgb+Q/qzPhqDn5Evooi0UbHT7hrAdsD2pJsYg7gpWxOv+UcC+wNq89I9Za6PQXnv3AUH9/oeRgVHERGRdrgXeHnuEDVYA9i3eMw0zVh3H+nPfC+pybuKMHO3fu4ANYmkXUsH7T3pGGCj4jGrKca6mdf9vcATTQfroHVyB6iDsW5TYJ/cOSSL+QEDLFs8lgHGZ03UnNoLjjH4B411PyMVHaVbNMOxva4Dzur1oEF7cyciItJVgzTTa17mB1YqHjLEYvDTi+LzsFwL44GJxUOGmwXemzuESMOaeq/zLeDDwAINjScv9DgQShxXpofjfcA1PR6zLrBQibGG2aFlVmio4CgiItIOXd88Q6SsYSo4iogMs0be68Tg7zbWHQe8r4nx5EUWBr4agz+97oFi8D1tpGT+v717D7qrqs84/gVExiozFXeL2nasyi6dodVaB6ygRWKpG7XIYI2XllScVq0i3hEiBbRUMRBvldLRKaC0BQUqlwRWw63c5KKlFqlcFgWBGIouIgNCQkigf+xNkqYB3vfNOee3zznfz8wZMknevZ/MHJLzPnut9aubg2iHC2nmbqY9o33WHBojSVI/TNMKR2ljvvclafKtBu4b4f2OBlaN8H7a4GnAt6q6mRcdZGNV3RwAfDk6xxg6vOS0bi5faOEoSVI/zHY7iDQpfO9L0uS7bpRDs0pOd9CWjoqxHXB2VTebnmUcoqqbfYETac9Y1swtA86c6xdbOEqS1A/XAD+JDiEFODs6gCRp6CL+rl9Mux1UMZ4FnF/VzS6RIaq62Qv4Fh4pOFtrgIO25EGBhaMkST3QbVUY+lk3Ug/9ALg9OoQkaajOGvUNS04PA+8f9X31f+wALKvq5oURN6/qZlfaz9cOiZm9z5Wc5jL8Zz0LR0mS+mPkH8alaN2Tc9/7kjS5biw53RJx45LTRcBpEffWes8HLqzq5nmjvGm3svJ82pWWmp3bgc9u6UUsHCVJ6o+LgAejQ0gB3FYtSZMr+u/4jwIPBGeYdi8CLqjqZodR3KxbUbkMeM4o7jeBPlBy2uKhSxaOkiT1RMlpNZCic0gBrgTujQ4hSRqK0FXsJacVwBGRGQTALrRnOg51xWG3kvJC2pWVmr2zSk5LB3EhC0dJkvolehWANHIlp7XAkugckqSBuxv4bnQI4CvA9dEhxG6006uHcqZit4JyGe2KSs3eKuBDg7qYhaMkSf2yFFgXHUIK4DmOkjR5zik5PRodonuw9b7oHAJgHnBaVTcDnRrdrZw8D/itQV53yny65HTHoC5m4ShJUo+UnFYCl0XnkAJcAKyODiFJGqje7NwoOV0JnBSdQwDsB5xY1c1Wg7hYt2LybOAVg7jelLoJ+PwgL2jhKElS/xwfHUAatZLTg/iNoCRNkkx7ll6ffAy4MzqEADgA+NKWXqSqm21oJ5HP2+JE02stcGDJac0gL2rhKElS//wLcE10CCnAp3FSuyRNioUlp0eiQ2ys20nyNtqCRfE+UNXNp+b6xd0KyRNpV0xq7g4tOV096ItaOEqS1DMlp8eAQ6JzSKNWcvofYHF0DknSFrsGODM6xOaUnK4CFkbn0HpHVHXz4Tl+7ReBBYMMM4WWMOCt1I+zcJQkqYdKTpfh1F5Np+OAn0SHkCRtkUO6B6h9tZh2wIj6YXFVNwfO5gu6lZEHDynPtLgLeOew/l+1cJQkqb8OA8InO0qjVHJ6gHZrtSRpPC3pHpz2Vjc5+8+A5dFZBMBWwNequnnzTH5zVTcfAo4YbqSJtw54W8np3mHdwMJRkqSeKjndAHw9OocU4KvArdEhJEmz9ihwaHSImSg5FdrzHNdFZxEA2wD/XNXN3k/2m7qVkEPZAjxlFpacvjPMG1g4SpLUb0cAq6NDSKPUDRnwfC1JGj8nl5z+KzrETJWcrgQOj86h9Z4OfLuqm1du7herutkf+BrtikjN3fm0R9gMlYWjJEk9VnJaDnwpOocU4Azg2ugQkqQZWw0cGR1iDhYBKTqE1nsmcF5VNy/Z+Ce7lY+n0q6E1Nz9GFjQHSswVBaOkiT132eAm6NDSKPUHWD+XmBVdBZJ0owc1j0oHStd8bIAWBGdRev9IrCsqpudALoVj9+mXQGpuXv83MYyiptZOEqS1HMlp/uBPwLui84ijVLJ6T+AWU2tlCSFOIkx3pFRcvop8Md4jE2f7AhcWNXNPsBS2pWP2jIfKzldMaqbWThKkjQGSk4ZmI8Hm2vKlJy+CRwdnUOS9IS+A/xltzJ9bJWcrgLeip+1+uQFwHnAs6ODTIBFJacvjvKGFo6SJI2JktMFwIejc0gBjqTdSiVJ6pe7gP1LTg9HBxmEktM5wLujc0gD9nUCpsdbOEqSNF6+QjudT5oaG52vdX10FknSeg8B+5ac7okOMkglpxOBhdE5pAFZCvxFxApkC0dJksZI92HhIOCy6CzSKJWcfg68CRjJQeeSpKe0oOT0/egQQ3IMY3wmpdS5Cphfcnok4uYWjpIkjZmS0xrag81/FBxFGqmS04+A/YGQD86SpPWOKjmdGR1iWLoHvB8BTo3OIs3RD4E3lpweigpg4ShJ0hjqpim+HktHTZmS0+XAO3CSqCRF+TLw19Ehhq07zuOdwAXBUaTZugt4XclpZWQIC0dJksZUyelGYDfcXq0pU3I6A3g1sCI6iyRNkbXAe0pOH+zKuInX7Sp5M/C96CzSDK2kLRuXRwexcJQkaYx1Kx33xkEymjIlp+8BuwLXRmeRpClwL/AHJaevRgcZtZLTA7S7Sm6JziI9hYeAN3SLEsJZOEqSNOa6p+/vAQ4G1gXHkUam5LQCeA3wT8FRJGmS3QDsWnK6NDpIlO4B7+8DkzokR+NvJTCv5HR1dJDHWThKkjQBSk6PlZz+FtgHuC86jzQqJadVwAHAYcBjwXEkadKcC+xecro9Oki0ktM9wJ7AJdFZpE3cBbyq5HRNdJCNWThKkjRBSk4XAK/AbT+aIl3hfgzwJuDn0XkkaUJ8Ftiv21IsoOR0P+326omd0K2x80Ngj75so96YhaMkSROm5HQL7dl2x+AkX02RktO5wMuAM6KzSNIY+0/aoRMLp2U4zGyUnFYDbwX+PjqLpt5VwKtLTndFB9kcC0dJkiZQyen+ktNhQA2cBPgNg6ZCyenWktNbgN/DCe6SNBt3AguA3y05LYsO02clp3XA+4BPRWfR1DqPdpDTyuggT8TCUZKkCVZyWl5yehfwUmBpdB5pVLpzjF4D7Eu73UiStHk/Az4O7FxyOsVVjTPTHedxFG3x6BnCGqVv0B538FB0kCdj4ShJ0hQoOd1QcnojsBfw3eg80ih03wyeS1u4/zmwIjiSJPXJw8CxwItLTsd1W4U1SyWnE4D5wJroLJoKxwEHlpweiQ7yVCwcJUmaIiWnf6MdKjMfuBhYFxpIGoGS09qS0z/QHjHwCeAHwZEkKdI9wAnAb5ScDik5/Sw60LgrOZ0B7AP0dnurxt6jwEdLTh8fl1XIT4sOIEmSRqvk9BhwOnB6VTc7AG+gne7bAM+MzCYNU7f1aBGwqKqbF9G+7/cDXoUP4iVNtpuBs4GzgGvGpbAYJyWni6u6eRlwGvDK6DyaKCuAt5ecxupsagtHSZKmWHfQ9CnAKVXdPAN4LW0Jsy/wy5HZpGEqOd0GfAH4QlU3v0RbvO8H/CHwjMhskjQgV9MWjGeXnG6KDjMNSk53VnWzJ3A0cEh0Hk2EfwUOKDn9NDrIbFk4SpIkAEpOq4AlwJKqbt5LO+X3pcDzu9fzNvpxFZVTGrTuQ/zJwMlV3fwCMI92+/XG7/nHX9sHxZSkTa2hXfl0d/ffx1/LgYtKTncHZpta3dl6n6jq5jLa4R47BEfSeFoHHA4sGtcVycMqHN8BbDOkaw+KU6RiHM94TEn9/oCuczztuPq+uzo6QLATaJ8c9d110QF64BbgLdEhZmB5dIAtVXJaB1zZvf6fqm62A55LW8DsiA8x1RrUv59hum3XS57o16u6eRYbisgK2GpE0dRvsx1IdCnj8e+Z+ucBNhSLK7tjUtRDJaelVd38Du0W692j82is/Jh2C/Xl0UG2hB+QJEmSJEmShqCqm21xi7VmLgELxnEL9aYsHCVJkiRJkoaoqpvX026xfk50FvXSOuCTwLHjuoV6UxaOkiRJkiRJQ1bVza8CJwJ7R2dRr2TgXSWnK6KDDNLW0QEkSZIkSZImXclpOfA6YD6zP/tVk2c18FfAb09a2QiucJQkSZIkSRqpqm62B44CPkj/h+5q8JYCB5ecbosOMiwWjpIkSZIkSQGqunkJ8HfAHtFZNBJ3AgcD50z6lHkLR0mSJEmSpCBV3WwNLACOBargOBqOR4DFwNElpwejw4yChaMkSZIkSVKwqm52AD4DvBv7mklyCfD+ktON0UFGyTewJEmSJElST1R1sxuwCNgzOou2yK3AkcCpk759enMsHCVJkiRJknqmqps9gE8C+0Rn0azcQLtS9fSS09roMFEsHCVJkiRJknqqqpuXAwuB/aOz6En9O3A07UCYR6PDRLNwlCRJkiRJ6rmqbnYBDgPeDmwdHEcbXEFbNC6bxq3TT8TCUZIkSZIkaUxUdbMTcCjtZOttg+NMs2XA35ScLosO0kcWjpIkSZIkSWOmqptfAz4C/ClQBceZFg8DZwGfLzldGx2mzywcJUmSJEmSxlRVN9sCDe2Kx32Bp8cmmkiXA98Azig53RcdZhxYOEqSJEmSJE2Aqm6eDcynLR93D44z7v6btmT8x5LTbdFhxo2FoyRJkiRJ0oTpzno8oHu9MDjOuLgPOA04BbjKITBzZ+EoSZIkSZI0oaq62QrYA/gTYG/gxbGJeqcAlwDfBJaWnFYH55kIFo6SJEmSJElToqqbFwB7AfO616/EJhq5+4FLgYu71w0lp0djI00eC0dJkiRJkqQp1K1+rNlQPu7F5E28XkU79OUS2oLxupLT2thIk8/CUZIkSZIkSVR1szWwC/Ba4OXAbwI7A9tH5pqFNUAGbgaupy0Yry05PRyaagpZOEqSJEmSJGmzulWQz6UtHndmQwm5M/DrwNYBse6mLRU3ft0E3FFyWheQR5uwcJQkSZIkSdKsVXWzHbATbfm4I+1KyJm+tgEemMVrJd3qxZLT/SP5A2rO/heNsoUsWP2SdAAAAABJRU5ErkJggg=="); + height: 30px; + width: 100%; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + margin-bottom: 20px; + } + + .geant { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAAAsCAYAAAB8K3ZrAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAALrklEQVR4Xu1bDZRUVR1/sxUh7M4ssECYmR0pCuNj3psFtHKzUjFpd969bwyEpAi1kxJGmR2pKL/SgwhamJ6kwsiKQ3qC9CCkSOK3R/GIml98rMAKO7O7fCQIstvv/97/fc282Z1h5s3COfzO+Z9593//97777u/e//3f+94ovYG91VPq0lF9VjomH0xHRXM6Jg7hujMTlXsyMfEKZDnkR221+pguRYlwsRMIA+uUhg+DhLmQ9zIx2VWYiB2wn08EcTUnUC50KfOq0MnLcjtddmGmvJ+OymZ0/haQ0AL5IMgO+qczUXHx88plH+FqT6AUZGLGTG8Hg4AOuKuF6Rp9QhdmELupCP12KhM/2hrV69M1YjZsVoIIuDVvWbkVv5e+ATur9hMoGs2KcRI6cafTqVhL9lYbgzm7R3QpqT6YTRLyEM0qp56o2NYWNaYi/0NsegKFIhM1JrqEiFU0MziraLQNSJ1qzjCaaVwn3NrzmWrxBTYJF1oqptTLMxRVnK8k5AxFldcqmpgfUeU9kHsjqvir+avJu2FzM2S2oskmpT75GaXh6J+77IC7udUiRO7qiF08gNUloT3WVNsakzeh7nYm+wjc3JKW/voQNikNw+EaNfFZRdMNRdWvRyevjGhiBzr9A1x3QrqKFCrTToSBzAuUkak+fKfeAUb1Yzyi57CqbOiIGgNR7+24xwG+R6atVnyLAgs2KQzjpkYxqs+hkY/OW43O28sdGdTBpYsqNiuqMVVJ9YLrpYUb7uZtjOQDe2qSg1hdduyKJk/HfR4w9zuWrMkMaPoEZ+eCZoKqq5gNP8EM+A/k/YCOw6wQu0HQa0g/gvR9+F2E9PVwSdeg7BySKiIyLm6E/i7Yr4LNq0yqv74gUcXDytjC19eygMJXuJidGMmPsyo00ADAvc4DMa+bswZRmxUI8KwZP3moEhffRMctQ4e0QXgmiCPonBbIOnTmHZgxl4GwCeb6oZnhd7Eb2IjSML0v3NRZkYS8AfVucu8VICBdqU99jMuGjy6Qgg4iUuazKnSYITXWG9z3AM2cNweKh4aOlhvQOYesThB78PsUZKGiGSkQMCzcRRiDggjSxL9xz2ByVPGMOXsrgeUIV0HItkxMn8mqsBFR4sZwuJQfx8+QWx4dYkVoLw+SXckR8kElnjxTmWCcxLaVRgSDwAABmSBisJ79nO3CB1zKxkwNIo7wEFHG6afAv1+Jh9uIhz4A2QS5rS4uzk7XinmYMQcRBBxqi4q5pYTkZUHCGIFZsz2bFFqHlDFNtWwVLkDKA7tr5Zc4WT7UI3BQxbfxQOtBQCvkYSLGJChrHWiP6SpmzGs0a0DQ6mI2r6EgoX8+KBjATLqcLcIFOuKm3bXibE6WBnP/IL+MkfZnkLANch8esFEZPa0/W+RFy9Bp/Vuxl6E9DQZKMx3lcFbvAAFFNil4nn9ybrhoRQS0u0a/kJNHgwim9Wl4iOvQ6Bcwwn6PTd25R7MwmhGadWSTgTvD3kafyedulQf2KBhcz2WRso1zw0W62hgJlzGDk4WDFuS4FGj4P9DYpSYRFGqWAdhgfhLEPEnRGX4XU8TGWZWFlmzykyIPc0642KJM75uO6VdxsidEFDV5OkigWbEEEclFyshUNeeVFXTQaZ6jkTuLiSfKdkRTDEam+oCId73EcE74aKuV0/kyGLRJS8gL0MBbMCNmVXIz1RoTSawx7ZCtmVpjFKsrBjwzHWDa7usQq8MHhcSBvpsiqIScUaWKqykiYW3FsadGfBqzZRP2VB2ZqDif1ZWBanzfM1PeYW342FqnD3uz7iKVk3BRGJGanIIQ9uvlWidKxa7BqWos/vR9AO1nrmR1+CAP4cwU+ShrK4NLP2WMio2hk1iMRIqmjkHQbMY6c425zkTlgopEZvHkmZ6ZspC1ZQQiJPjFV8D4/6o08TPWHnegF3OWK5Mrmk8J+VhGleNtUhRV11lbFkTgjn4IQuglEG4gtoOYBeZh3HGKPTXGCITMb1BkFuZrB5ByntlntMhPMAaytkRYYd2dkJ2o+HdwT+ccz2R4QW9Kscasgfy3PRaSy9XEd3kgP8KaMoDCV7DdK2/RKgA6wMRsWQxXtiOM789AxnzTdYEcVmUhbgyHG/oeRv1vMOqX0gyA8RzsrBPIzV304nIaynynR6F3FvlAB4he2+6O1ukjBKdOOYm1uaB34Jpxia/eYoReiGWhNSqvgDtrxb4GnqB8ACHrIftzT4hH60PA2HJk5ntDRvqnzFDWRQTE0QujIHufgLyvcpkcgPhbfbaafgln5QD5Gx1b8sFj84xcPCDyDzi2RQoIDzzVpj0MZs27IEewqjRok/qh3/ehrUtYw4g3noyOedvTKBAgNsPwCVy/il9evCEgAR08mktmk7LfvEGA0Mkul/EDO3nU0eKpo9tYHfkuKaatWBe4fvlJoefJapM86NYhD2fn05tCrikHtOsHMW+lY5hRpULVv4L7HcESMJY1JtCxco3TQERNWQt1hM/+XdJAlqnPIsV0UXRcEiSWfS7i4htOvc4sRSPz7GOQ7ycFQoeWnO3CSwpIz22Tcblbh1iWk5+vvYzd/fRhmZh8FgHAnFL2MujXOyBrOclIGA1O4+iEUk1qnOOHf9d52DweQZ0+UrQpdZZx4UC5+916xV1OXfTFSACQl0MK2vNWzqmAjxS5k7UuVGOmp/y9rC0KdAJAL/BAzHVHRQxFrTQJsr2ItyNgsIrVuZhgfBy22/AA75BgF/o5aEsjZawxGPe0Pu2hjh114QBcs1sRW4LcEvI8a4pca18jGJnLJhYqQAqB/kkAUm7HWnMbfY/A6sKQEF/D/dfjyk8oHv4lu3EYnT9gdTAo5LXFqqg0UnA/t6y4kVS4XuHq9HNNOw+gd0iBu1Rx//estOjwnSxXiBQCzZJ0rZiNxf/OYt7/o81/V7TUFznpwtepcX0iq629B6XzifVJTtaaIq8ww9AckVPI1qzXBZV90SlrnxAnhLR16Ky/mToPoHdJsd7R/8Jj73ZuBUmx0VqrN2Ivc09B/wawgqsVnPIDbB2xG+eLODTdcBodIOZnnlmk5BXY5LgihLKujXiJtVaI6HxQIPabH8R5AL2flLMaa2BnfRlCa521n+oVUgjYyySwztzdNWxSP1YFIyGv5SUgF3gg53NNRELuxw30GpY+XvOK/RBkG0QKdSalc2V7NimwX+TUpYmfstoE2vQnT57vCB06PykE86tHjtxUucF0r71ECsH8Z0BM/Ba/vgHlYGSqGvf9JadyQQ22G+cLLemjBPrG1SOwcWL7IFIwqk+lkR4oXjQ09IX9Lrsc2rAG8hdXxNOevGdRwnF90OWSAhJA5JOs70REObk3SSHQvwIQMt+wL+gVMwZRtwePaNDjduOyR2w28OA9kFLgQq9J/8cC3Uun+X8QBtK5pBASej3aYm9yt1o+u/dIIdAnu3Q0QzOHVeYsob0Zp4KBBrlHHPQxWzcoFymwXWmXQXla7Onsxy+qfB2/lg1cHRfNTwoA3R/tPMii3iaFQJEZfV6Vjhrj1p6cHNQ4Qm9MWdFrNzA/PHYah4Uyz+IDlIWU8ZOHoh5ex8Q+Wqg5xw+0Aza8TvCOHEA6LynKGOylzGMSswzWQA5iepEUGzuqJ9W1xJpOK3iTiUZtcBsoXjDXkBzMq0J+6aSo+lW2PcouZW0g0Kn2OkF7EvONHK7zk0JQxdV2viPHACnFAz4bHdDheZBd6LCbzf0FFqUq7JaRfsaTH0gKrv+A38VBgvUqaS7IqnwZabLvtM7YukFCzmBb6rh/kQrX3ZOCoALt2OyUs8oeh6QQrIWy2fcwwUIu5X770M5HSjeCjeUt6OQ4rvnQEYtxT77ViqB4xy4PWq8XeiCFkDAakW/f5zgmhUCRgSpmY9bQ3832O4223NaLaPyCrPcXIEU+BtvnehLs7GfRnsNNF/j/R1X+2ilD+xHzL252HXn2AVaIvMy2Q9tXc44LzFxP/q9YewxAUf4PJVlUXwBKn50AAAAASUVORK5CYII="); + height: 35px; + width: 100%; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + margin-bottom: 20px; + } </style> </head> <body class="" @@ -110,9 +130,7 @@ style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background: #ffffff; border-radius: 3px;"> <tr style="text-align: center;"> <a href="${PORTAL_LINK}" target="_blank"> - <img style="max-height: 50px; display: block; margin-left: auto;margin-right: auto; padding-bottom: 12px;" - src="${PORTAL_LINK}/assets/images/logo-small.png" - alt="${PORTAL_LOGO_ALT}"/> + <div class="nmaas"></div> </a> </tr> <tr> @@ -152,10 +170,8 @@ <p> ${SENDER_POLICY} </p> - <a href="https://www.geant.org/" target="_blank" rel="nofollow"> - <img src="${PORTAL_LINK}/assets/images/geant-logo-small.png" - alt="Geant logo" - style="max-height: 24px;"> + <a href="https://www.geant.org/" target="_blank" rel="nofollow" > + <div class="geant"></div> </a> </span> </td> @@ -168,4 +184,4 @@ </tr> </table> </body> -</html> \ No newline at end of file +</html> diff --git a/src/test/shell/data/mails/issueReport.json b/src/test/shell/data/mails/issueReport.json index 0e4ff9c0c673ba0b2eb86bc6b95e1f9e6ed7cdc2..2930934b676dc1f7169d7a40a80e8531881d8305 100644 --- a/src/test/shell/data/mails/issueReport.json +++ b/src/test/shell/data/mails/issueReport.json @@ -1,52 +1,51 @@ { "mailType": "ISSUE_REPORT", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Issue report", + "subject": "nmaas: Issue report", "template": { "HEADER": "Dear ${username}", "CONTENT": "<p>New issue report was sent from the contact form by ${name}.</p><p>Affected domain: ${issueDomainName}</p><p>Affected application: ${issueApplicationName}</p><p>Description:</p><p>${issueDescription}</p><p>Please reply to ${email} as soon as possible.</p>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Issue report", + "subject": "nmaas: Issue report", "template": { "HEADER": "Dear ${username}", "CONTENT": "<p>New issue report was sent from the contact form by ${name}.</p><p>Affected domain: ${issueDomainName}</p><p>Affected application: ${issueApplicationName}</p><p>Description:</p><p>${issueDescription}</p><p>Please reply to ${email} as soon as possible.</p>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Issue report", + "subject": "nmaas: Issue report", "template": { "HEADER": "Dear ${username}", "CONTENT": "<p>New issue report was sent from the contact form by ${name}.</p><p>Affected domain: ${issueDomainName}</p><p>Affected application: ${issueApplicationName}</p><p>Description:</p><p>${issueDescription}</p><p>Please reply to ${email} as soon as possible.</p>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Zgłoszenie problemu", + "subject": "nmaas: Zgłoszenie problemu", "template": { "HEADER": "Drogi ${username}", "CONTENT": "<p>Zgłoszenie nowego problemu zostało wysłane z formularza kontaktowego przez ${name}.</p><p>Domena: ${issueDomainName}</p><p>Aplikacja: ${issueApplicationName}</p><p>Opis problemu:</p><p>${issueDescription}</p><p>Prosimy o jak najszybszą odpowiedź na adres ${email}.</p>", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/newActiveApp.json b/src/test/shell/data/mails/newActiveApp.json index db10e5344ecb2c5f0e5bd09991d16cabdc92874b..2f585f19398ea0fef9bce7366984e306dd8918a8 100644 --- a/src/test/shell/data/mails/newActiveApp.json +++ b/src/test/shell/data/mails/newActiveApp.json @@ -1,56 +1,55 @@ { "mailType": "NEW_ACTIVE_APP", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: New application version available in the portfolio", + "subject": "nmaas: New application version available in the portfolio", "template": { "HEADER": "Dear ${username},", "CONTENT": "${app_name} application in version ${app_version} was added to the portfolio and is now available for deployment. <br />", "ADDITIONAL": "Additional information: <br /> ${message}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: New application version available in the portfolio", + "subject": "nmaas: New application version available in the portfolio", "template": { "HEADER": "Dear ${username},", "CONTENT": "${app_name} application in version ${app_version} was added to the portfolio and is now available for deployment. <br />", "ADDITIONAL": "Additional information: <br /> ${message}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: New application version available in the portfolio", + "subject": "nmaas: New application version available in the portfolio", "template": { "HEADER": "Dear ${username},", "CONTENT": "${app_name} application in version ${app_version} was added to the portfolio and is now available for deployment. <br />", "ADDITIONAL": "Additional information: <br /> ${message}", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Nowa wersja aplikacji jest dostępna w portfolio", + "subject": "nmaas: Nowa wersja aplikacji jest dostępna w portfolio", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Aplikacja ${app_name} w wersji ${app_version} została dostana do portfolio. <br />", "ADDITIONAL": "Dodatkowe informacje: <br /> ${message}", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/newDomainRequest.json b/src/test/shell/data/mails/newDomainRequest.json index 4cf0599ac3fa5838aed57cd49f09651cc288a6b4..0960ae0a6e36469f9defe247d683fdb35956c77a 100644 --- a/src/test/shell/data/mails/newDomainRequest.json +++ b/src/test/shell/data/mails/newDomainRequest.json @@ -1,52 +1,51 @@ { "mailType": "NEW_DOMAIN_REQUEST", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: New Domain Request", + "subject": "nmaas: New Domain Request", "template": { "HEADER": "Dear ${username}", "CONTENT": "<p>New domain creation request was sent from the contact form.</p><p>Requester name: ${name}</p><p>Requester institution: ${institution}</p><p>Requester email: ${email}</p><p>Proposed domain Name: ${domainName}</p><p>Proposed domain codename: ${domainCodename}</p><p>Request justification:</p><p>${justification}</p><p>Preferred VPN option: ${vpnTechnology}</p><p>Public IP for VPN tunnel setup: ${vpnUserIp}</p><p>Monitored user subnets:</p><#list userSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Additional subnets:</p><#list additionalSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Technical contact: ${techContact}</p>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: New Domain Request", + "subject": "nmaas: New Domain Request", "template": { "HEADER": "Dear ${username}", "CONTENT": "<p>New domain creation request was sent from the contact form.</p><p>Requester name: ${name}</p><p>Requester institution: ${institution}</p><p>Requester email: ${email}</p><p>Proposed domain Name: ${domainName}</p><p>Proposed domain codename: ${domainCodename}</p><p>Request justification:</p><p>${justification}</p><p>Preferred VPN option: ${vpnTechnology}</p><p>Public IP for VPN tunnel setup: ${vpnUserIp}</p><p>Monitored user subnets:</p><#list userSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Additional subnets:</p><#list additionalSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Technical contact: ${techContact}</p>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: New Domain Request", + "subject": "nmaas: New Domain Request", "template": { "HEADER": "Dear ${username}", "CONTENT": "<p>New domain creation request was sent from the contact form.</p><p>Requester name: ${name}</p><p>Requester institution: ${institution}</p><p>Requester email: ${email}</p><p>Proposed domain Name: ${domainName}</p><p>Proposed domain codename: ${domainCodename}</p><p>Request justification:</p><p>${justification}</p><p>Preferred VPN option: ${vpnTechnology}</p><p>Public IP for VPN tunnel setup: ${vpnUserIp}</p><p>Monitored user subnets:</p><#list userSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Additional subnets:</p><#list additionalSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Technical contact: ${techContact}</p>", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Żądanie utworzenia nowej domeny", + "subject": "nmaas: Żądanie utworzenia nowej domeny", "template": { "HEADER": "Drogi ${username}", "CONTENT": "<p>Żądanie utworzenia nowej domeny zostało wysłane przez formularz kontaktowy.</p><p>Imię i Nazwisko: ${name}</p><p>Instytucja: ${institution}</p><p>Adres email: ${email}</p><p>Proponowana nazwa domany: ${domainName}</p><p>Proponowna nazwa kodowa domeny: ${domainCodename}</p><p>Uzasadnienie żądania:</p><p>${justification}</p><p>Preferred VPN option: ${vpnTechnology}</p><p>Public IP for VPN tunnel setup: ${vpnUserIp}</p><p>Monitored user subnets:</p><#list userSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Additional subnets:</p><#list additionalSubnets as subnet><p>${subnet.ipAddressWithMask}</p></#list><p>Technical contact: ${techContact}</p>", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/newSsoLoginMail.json b/src/test/shell/data/mails/newSsoLoginMail.json index 950fddadbcc0d9ae579aa51908dfea9c9b47c102..63274ab190d82fe4aae78d74bf968560af1c44c8 100644 --- a/src/test/shell/data/mails/newSsoLoginMail.json +++ b/src/test/shell/data/mails/newSsoLoginMail.json @@ -1,52 +1,51 @@ { "mailType": "NEW_SSO_LOGIN", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: New sso login", + "subject": "nmaas: New sso login", "template": { "HEADER": "Dear ${username},", "CONTENT": "The person ${newUser} has logged in with SSO for the first time.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: New sso login", + "subject": "nmaas: New sso login", "template": { "HEADER": "Dear ${username},", "CONTENT": "The person ${newUser} has logged in with SSO for the first time.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: New sso login", + "subject": "nmaas: New sso login", "template": { "HEADER": "Dear ${username},", "CONTENT": "The person ${newUser} has logged in with SSO for the first time.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Nowe logowanie SSO", + "subject": "nmaas: Nowe logowanie SSO", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Użytkownik ${newUser} zalogował się przy użyciu SSO po raz pierwszy.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/passwordReset.json b/src/test/shell/data/mails/passwordReset.json index d107b2698d5ad2f14feb7d80d6ce325d8c600691..74c40e0c53b8c145fe0c45c60dcb466054943b64 100644 --- a/src/test/shell/data/mails/passwordReset.json +++ b/src/test/shell/data/mails/passwordReset.json @@ -1,52 +1,51 @@ { "mailType": "PASSWORD_RESET", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: Password reset request", + "subject": "nmaas: Password reset request", "template": { "HEADER": "Dear ${username},", - "CONTENT": "You recently requested to reset your password for your NMaaS account. You can reset your password by clicking the link below:<br /><a href=\"${accessURL}\">Click here to reset your password.</a><br />If you did not request a password reset, please ignore this mail or reply to let us know. The password reset link is only valid for the next 30 minutes.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "You recently requested to reset your password for your nmaas account. You can reset your password by clicking the link below:<br /><a href=\"${accessURL}\">Click here to reset your password.</a><br />If you did not request a password reset, please ignore this mail or reply to let us know. The password reset link is only valid for the next 30 minutes.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: Password reset request", + "subject": "nmaas: Password reset request", "template": { "HEADER": "Dear ${username},", - "CONTENT": "You recently requested to reset your password for your NMaaS account. You can reset your password by clicking the link below:<br /><a href=\"${accessURL}\">Click here to reset your password.</a><br />If you did not request a password reset, please ignore this mail or reply to let us know. The password reset link is only valid for the next 30 minutes.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "You recently requested to reset your password for your nmaas account. You can reset your password by clicking the link below:<br /><a href=\"${accessURL}\">Click here to reset your password.</a><br />If you did not request a password reset, please ignore this mail or reply to let us know. The password reset link is only valid for the next 30 minutes.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: Password reset request", + "subject": "nmaas: Password reset request", "template": { "HEADER": "Dear ${username},", - "CONTENT": "You recently requested to reset your password for your NMaaS account. You can reset your password by clicking the link below:<br /><a href=\"${accessURL}\">Click here to reset your password.</a><br />If you did not request a password reset, please ignore this mail or reply to let us know. The password reset link is only valid for the next 30 minutes.", - "SENDER": "Best regards,<br />NMaaS Team", + "CONTENT": "You recently requested to reset your password for your nmaas account. You can reset your password by clicking the link below:<br /><a href=\"${accessURL}\">Click here to reset your password.</a><br />If you did not request a password reset, please ignore this mail or reply to let us know. The password reset link is only valid for the next 30 minutes.", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Ponowne ustawienie hasła", + "subject": "nmaas: Ponowne ustawienie hasła", "template": { "HEADER": "Drogi ${username},", - "CONTENT": "Niedawno wysłałeś prośbę o ponowne ustawienie swojego hasła do portalu NMaaS. Aby zresetować hasło kliknij poniższy link:<br /><a href=\"${accessURL}\">Kliknij tutaj aby zresetować hasło.</a><br />Jeśli nie próbowałeś ostatnio zmienić hasła prosimy o zignorowanie tej wiadomości lub kontakt z administratorami portalu NMaaS. Link do zmiany hasła jest aktywny jedynie przez następne 30 minut.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "CONTENT": "Niedawno wysłałeś prośbę o ponowne ustawienie swojego hasła do portalu nmaas. Aby zresetować hasło kliknij poniższy link:<br /><a href=\"${accessURL}\">Kliknij tutaj aby zresetować hasło.</a><br />Jeśli nie próbowałeś ostatnio zmienić hasła prosimy o zignorowanie tej wiadomości lub kontakt z administratorami portalu nmaas. Link do zmiany hasła jest aktywny jedynie przez następne 30 minut.", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/data/mails/registrationMail.json b/src/test/shell/data/mails/registrationMail.json index 5ebd3f4bd6ff63952ab4f62db35b751ef1f46a68..c7a0af4f092389af5e2ee6f30b565f0882fd06a0 100644 --- a/src/test/shell/data/mails/registrationMail.json +++ b/src/test/shell/data/mails/registrationMail.json @@ -1,52 +1,51 @@ { "mailType": "REGISTRATION", "globalInformation": { - "LOGO_LINK": "https://www.geant.org/Style%20Library/Geant/Images/logo.png", - "LOGO_ALT": "Geant logo", - "PORTAL_LOGO_ALT": "NMaaS logo", + "LOGO_ALT": "GÉANT logo", + "PORTAL_LOGO_ALT": "nmaas logo", "SENDER_INFO": "Ⓒ GÉANT Association Hoekenrode 3 1102 BR - Amsterdam – Zuidoost- The Netherlands" }, "templates": [ { "language": "en", - "subject": "NMaaS: New account registration request", + "subject": "nmaas: New account registration request", "template": { "HEADER": "Dear ${username},", "CONTENT": "The person ${newUser} has submitted the registration form and is waiting for your approval.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "fr", - "subject": "NMaaS: New account registration request", + "subject": "nmaas: New account registration request", "template": { "HEADER": "Dear ${username},", "CONTENT": "The person ${newUser} has submitted the registration form and is waiting for your approval.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "de", - "subject": "NMaaS: New account registration request", + "subject": "nmaas: New account registration request", "template": { "HEADER": "Dear ${username},", "CONTENT": "The person ${newUser} has submitted the registration form and is waiting for your approval.", - "SENDER": "Best regards,<br />NMaaS Team", + "SENDER": "Best regards,<br />nmaas Team", "NOREPLY": "This is an automatically generated message, please do not reply.", "SENDER_POLICY": "" } }, { "language": "pl", - "subject": "NMaaS: Rejestracja nowego użytkownika", + "subject": "nmaas: Rejestracja nowego użytkownika", "template": { "HEADER": "Drogi ${username},", "CONTENT": "Użytkownik ${newUser} wypełnił formularz rejestracyjny i czeka na aktywację konta.", - "SENDER": "Z pozdrowieniami,<br />Zespół NMaaS", + "SENDER": "Z pozdrowieniami,<br />Zespół nmaas", "NOREPLY": "Ta wiadomość została wygenerowana automatycznie.", "SENDER_POLICY": "" } diff --git a/src/test/shell/init.bat b/src/test/shell/init.bat index cfde699f99e4a1b1bf2495b784e938584084b04f..bf106ed63414d3c2d0c167c115f9db25032ead3c 100644 --- a/src/test/shell/init.bat +++ b/src/test/shell/init.bat @@ -100,526 +100,87 @@ curl -X POST %API_URL%/mail/templates --header "Authorization: Bearer %token%" - echo. curl -X POST %API_URL%/mail/templates --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\mails\newActiveApp.json echo. +curl -X POST %API_URL%/mail/templates --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\mails\bulkRegistrationMail.json +echo. +curl -X POST %API_URL%/mail/templates --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\mails\bulkSSORegistrationMail.json +echo. +echo. echo App1 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app01-librenms.json +curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app01-prometheus.json echo. echo App1 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\librenms.svg;type=image/png" %API_URL%/apps/1/logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\prometheus.svg;type=image/svg+xml" %API_URL%/apps/1/logo echo. echo App1 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\librenms\librenms1.png;type=image/png" %API_URL%/apps/1/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images/screenshots\prometheus\prometheus1.png;type=image/png" %API_URL%/apps/1/screenshots +echo. +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps/images\screenshots\prometheus\prometheus2.png;type=image/png" %API_URL%/apps/1/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\librenms\librenms2.png;type=image/png" %API_URL%/apps/1/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps/images\screenshots\prometheus\prometheus3.png;type=image/png" %API_URL%/apps/1/screenshots echo. echo App2 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app02-oxidized.json +curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app02-grafana.json echo. echo App2 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\oxidized.svg;type=image/svg+xml" %API_URL%/apps/2/logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\grafana.svg;type=image/svg+xml" %API_URL%/apps/2/logo echo. echo App2 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\oxidized\oxidized1.png;type=image/png" %API_URL%/apps/2/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\grafana\grafana1.png;type=image/png" %API_URL%/apps/2/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\oxidized\oxidized2.png;type=image/png" %API_URL%/apps/2/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\grafana\grafana2.png;type=image/png" %API_URL%/apps/2/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\oxidized\oxidized3.png;type=image/png" %API_URL%/apps/2/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\grafana\grafana3.png;type=image/png" %API_URL%/apps/2/screenshots echo. echo App3 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app03-nav.json +curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app03-uptime-kuma.json echo. echo App3 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\nav.svg;type=image/svg+xml" %API_URL%/apps/3/logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\uptime-kuma.png;type=image/png" %API_URL%/apps/3/logo echo. echo App3 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\nav\nav1.png;type=image/jpg" %API_URL%/apps/3/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma1.jpg;type=image/jpg" %API_URL%/apps/3/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\nav\nav2.png;type=image/png" %API_URL%/apps/3/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma2.jpg;type=image/jpg" %API_URL%/apps/3/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\nav\nav3.png;type=image/png" %API_URL%/apps/3/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma3.jpg;type=image/jpg" %API_URL%/apps/3/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\nav\nav4.png;type=image/png" %API_URL%/apps/3/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma4.jpg;type=image/jpg" %API_URL%/apps/3/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\nav\nav5.png;type=image/png" %API_URL%/apps/3/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma5.jpg;type=image/jpg" %API_URL%/apps/3/screenshots +echo. +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma6.jpg;type=image/jpg" %API_URL%/apps/3/screenshots echo. echo App4 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app04-opennti.json +curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app04-healthchecks.json echo. echo App4 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\open-nti.svg;type=image/svg+xml" %API_URL%/apps/4/logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\healthchecks.jpg;type=image/jpg" %API_URL%/apps/4/logo echo. echo App4 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\opennti\opennti1.png;type=image/png" %API_URL%/apps/4/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\opennti\opennti2.png;type=image/png" %API_URL%/apps/4/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\opennti\opennti3.png;type=image/png" %API_URL%/apps/4/screenshots - -echo. -echo App5 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app05-prometheus.json -echo. -echo App5 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\prometheus.svg;type=image/svg+xml" %API_URL%/apps/5/logo -echo. -echo App5 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images/screenshots\prometheus\prometheus1.png;type=image/png" %API_URL%/apps/5/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps/images\screenshots\prometheus\prometheus2.png;type=image/png" %API_URL%/apps/5/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps/images\screenshots\prometheus\prometheus3.png;type=image/png" %API_URL%/apps/5/screenshots - -echo. -echo App6 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app06-grafana.json -echo. -echo App6 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\grafana.svg;type=image/svg+xml" %API_URL%/apps/6/logo -echo. -echo App6 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\grafana\grafana1.png;type=image/png" %API_URL%/apps/6/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\grafana\grafana2.png;type=image/png" %API_URL%/apps/6/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\grafana\grafana3.png;type=image/png" %API_URL%/apps/6/screenshots -echo. -echo App6 v2 -curl -X POST %API_URL%/apps/version --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app06-grafana_v7.2.0.json - -echo. -echo App7 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app07-bastion.json -echo. -echo App7 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\bastion.svg;type=image/svg+xml" %API_URL%/apps/7/logo -echo. -echo App7 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\bastion\bastion1.png;type=image/png" %API_URL%/apps/7/screenshots - -echo. -echo App8 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app08-perfsonar-pwa.json -echo. -echo App8 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\perfsonar.png;type=image/png" %API_URL%/apps/8/logo -echo. -echo App8 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-pwa\perfsonar-pwa1.png;type=image/png" %API_URL%/apps/8/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-pwa\perfsonar-pwa2.png;type=image/png" %API_URL%/apps/8/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-pwa\perfsonar-pwa3.png;type=image/png" %API_URL%/apps/8/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-pwa\perfsonar-pwa4.png;type=image/png" %API_URL%/apps/8/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-pwa\perfsonar-pwa5.png;type=image/png" %API_URL%/apps/8/screenshots - -echo. -echo App9 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app09-librebooking.json -echo. -echo App9 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\librebooking.png;type=image/png" %API_URL%/apps/9/logo -echo. -echo App9 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\librebooking\librebooking1.png;type=image/png" %API_URL%/apps/9/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\librebooking\librebooking2.png;type=image/png" %API_URL%/apps/9/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\librebooking\librebooking3.png;type=image/png" %API_URL%/apps/9/screenshots - -echo. -echo App10 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app10-spa-inventory.json -echo. -echo App10 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\spa.png;type=image/png" %API_URL%/apps/10/logo -echo. -echo App10 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa-inventory\spa-inventory1.png;type=image/png" %API_URL%/apps/10/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa-inventory\spa-inventory2.png;type=image/png" %API_URL%/apps/10/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa-inventory\spa-inventory3.png;type=image/png" %API_URL%/apps/10/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa-inventory\spa-inventory4.png;type=image/png" %API_URL%/apps/10/screenshots - -echo. -echo App11 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app11-statping.json -echo. -echo App11 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\statping.png;type=image/png" %API_URL%/apps/11/logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks1.png;type=image/png" %API_URL%/apps/4/screenshots echo. -echo App11 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\statping\statping1.png;type=image/png" %API_URL%/apps/11/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks2.png;type=image/png" %API_URL%/apps/4/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\statping\statping2.png;type=image/png" %API_URL%/apps/11/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks3.png;type=image/png" %API_URL%/apps/4/screenshots echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\statping\statping3.png;type=image/png" %API_URL%/apps/11/screenshots - -echo. -echo App12 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app12-perfsonar-maddash.json -echo. -echo App12 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\perfsonar.png;type=image/png" %API_URL%/apps/12/logo -echo. -echo App12 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-maddash\perfsonar-maddash1.png;type=image/png" %API_URL%/apps/12/screenshots - -echo. -echo App13 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app13-debian-repository.json -echo. -echo App13 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\debian.svg;type=image/svg+xml" %API_URL%/apps/13/logo -echo. -echo App13 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\debian-repository\debian-repository1.png;type=image/png" %API_URL%/apps/13/screenshots -echo. -echo App13 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\debian-repository\debian-repository2.png;type=image/png" %API_URL%/apps/13/screenshots -echo. -echo App13 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\debian-repository\debian-repository3.png;type=image/png" %API_URL%/apps/13/screenshots -echo. -echo App13 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\debian-repository\debian-repository4.png;type=image/png" %API_URL%/apps/13/screenshots - -echo. -echo App14 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app14-influxdb.json -echo. -echo App14 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\influxdb.png;type=image/png" %API_URL%/apps/14/logo -echo. -echo App14 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\influxdb\influxdb1.png;type=image/png" %API_URL%/apps/14/screenshots -echo. -echo App14 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\influxdb\influxdb2.png;type=image/png" %API_URL%/apps/14/screenshots - -echo. -echo App15 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app15-jenkins.json -echo. -echo App15 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\jenkins.svg;type=image/svg+xml" %API_URL%/apps/15/logo -echo. -echo App15 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\jenkins\jenkins1.png;type=image/png" %API_URL%/apps/15/screenshots - -echo. -echo App16 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app16-elasticstack.json -echo. -echo App16 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\elk.svg;type=image/svg+xml" %API_URL%/apps/16/logo -echo. -echo App16 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\elasticstack\elk1.png;type=image/png" %API_URL%/apps/16/screenshots -echo. -echo App16 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\elasticstack\elk2.png;type=image/png" %API_URL%/apps/16/screenshots - -echo. -echo App17 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app17-perfsonar-esmond.json -echo. -echo App17 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\perfsonar.png;type=image/png" %API_URL%/apps/17/logo -echo. -echo App17 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-esmond\perfsonar-esmond1.png;type=image/png" %API_URL%/apps/17/screenshots - -echo. -echo App18 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app18-wifimon.json -echo. -echo App18 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\wifimon.png;type=image/png" %API_URL%/apps/18/logo -echo. -echo App18 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\wifimon\wifimon1.png;type=image/png" %API_URL%/apps/18/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\wifimon\wifimon2.png;type=image/png" %API_URL%/apps/18/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\wifimon\wifimon3.png;type=image/png" %API_URL%/apps/18/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\wifimon\wifimon4.png;type=image/png" %API_URL%/apps/18/screenshots -echo. -echo App18 v2 -curl -X POST %API_URL%/apps/version --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app18-wifimon_v1.6.0.json - +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks4.png;type=image/png" %API_URL%/apps/4/screenshots echo. -echo App19 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app19-perfsonar-centralmanagement.json +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks5.png;type=image/png" %API_URL%/apps/4/screenshots echo. -echo App19 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\perfsonar.png;type=image/png" %API_URL%/apps/19/logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks6.png;type=image/png" %API_URL%/apps/4/screenshots echo. -echo App19 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\perfsonar-centralmanagement\perfsonar-centralmanagement1.png;type=image/png" %API_URL%/apps/19/screenshots +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks7.png;type=image/png" %API_URL%/apps/4/screenshots echo. -echo App20 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app20-icinga.json -echo. -echo App20 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\icinga.svg;type=image/svg+xml" %API_URL%/apps/20/logo -echo. -echo App20 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\icinga\icinga1.png;type=image/png" %API_URL%/apps/20/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\icinga\icinga2.png;type=image/png" %API_URL%/apps/20/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\icinga\icinga3.png;type=image/png" %API_URL%/apps/20/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\icinga\icinga4.png;type=image/png" %API_URL%/apps/20/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\icinga\icinga5.png;type=image/png" %API_URL%/apps/20/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\icinga\icinga6.png;type=image/png" %API_URL%/apps/20/screenshots - -echo. -echo App21 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app21-victoria-metrics.json -echo. -echo App21 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\victoria-metrics.png;type=image/png" %API_URL%/apps/21/logo -echo. -echo App21 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\victoria-metrics\victoria-metrics1.png;type=image/png" %API_URL%/apps/21/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\victoria-metrics\victoria-metrics2.png;type=image/png" %API_URL%/apps/21/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\victoria-metrics\victoria-metrics3.png;type=image/png" %API_URL%/apps/21/screenshots - -echo. -echo App22 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app22-synapse.json -echo. -echo App22 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\synapse.png;type=image/png" %API_URL%/apps/22/logo -echo. -echo App22 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\synapse\synapse1.png;type=image/png" %API_URL%/apps/22/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\synapse\synapse2.png;type=image/png" %API_URL%/apps/22/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\synapse\synapse3.png;type=image/png" %API_URL%/apps/22/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\synapse\synapse4.png;type=image/png" %API_URL%/apps/22/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\synapse\synapse5.png;type=image/png" %API_URL%/apps/22/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\synapse\synapse6.png;type=image/png" %API_URL%/apps/22/screenshots - -echo. -echo App23 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app23-routinator.json -echo. -echo App23 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\routinator.svg;type=image/svg+xml" %API_URL%/apps/23/logo -echo. -echo App23 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\routinator\routinator1.png;type=image/png" %API_URL%/apps/23/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\routinator\routinator2.png;type=image/png" %API_URL%/apps/23/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\routinator\routinator3.png;type=image/png" %API_URL%/apps/23/screenshots - -echo. -echo App24 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app24-codimd.json -echo. -echo App24 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\codimd.png;type=image/png" %API_URL%/apps/24/logo -echo. -echo App24 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\codimd\codimd1.png;type=image/png" %API_URL%/apps/24/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\codimd\codimd2.png;type=image/png" %API_URL%/apps/24/screenshots - -echo. -echo App25 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app25-webdav.json -echo. -echo App25 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\webdav.svg;type=image/svg+xml" %API_URL%/apps/25/logo -echo. -echo App25 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\webdav\webdav1.png;type=image/png" %API_URL%/apps/25/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\webdav\webdav2.png;type=image/png" %API_URL%/apps/25/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\webdav\webdav3.png;type=image/png" %API_URL%/apps/25/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\webdav\webdav4.png;type=image/png" %API_URL%/apps/25/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\webdav\webdav5.png;type=image/png" %API_URL%/apps/25/screenshots - -echo. -echo App26 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app26-uptime-kuma.json -echo. -echo App26 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\uptime-kuma.png;type=image/png" %API_URL%/apps/26/logo -echo. -echo App26 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma1.jpg;type=image/jpg" %API_URL%/apps/26/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma2.jpg;type=image/jpg" %API_URL%/apps/26/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma3.jpg;type=image/jpg" %API_URL%/apps/26/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma4.jpg;type=image/jpg" %API_URL%/apps/26/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma5.jpg;type=image/jpg" %API_URL%/apps/26/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\uptime-kuma\uptime-kuma6.jpg;type=image/jpg" %API_URL%/apps/26/screenshots - -echo. -echo App27 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app27-netbox.json -echo. -echo App27 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\netbox.svg;type=image/svg+xml" %API_URL%/apps/27/logo -echo. -echo App27 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\netbox\netbox1.png;type=image/png" %API_URL%/apps/27/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\netbox\netbox2.png;type=image/png" %API_URL%/apps/27/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\netbox\netbox3.png;type=image/png" %API_URL%/apps/27/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\netbox\netbox4.png;type=image/png" %API_URL%/apps/27/screenshots - -echo. -echo App28 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app28-zabbix.json -echo. -echo App28 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\zabbix.png;type=image/png" %API_URL%/apps/28/logo -echo. -echo App28 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\zabbix\zabbix1.png;type=image/png" %API_URL%/apps/28/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\zabbix\zabbix2.png;type=image/png" %API_URL%/apps/28/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\zabbix\zabbix3.png;type=image/png" %API_URL%/apps/28/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\zabbix\zabbix4.png;type=image/png" %API_URL%/apps/28/screenshots - -echo. -echo App29 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app29-spa.json -echo. -echo App29 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\spa.png;type=image/png" %API_URL%/apps/29/logo -echo. -echo App29 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa\spa1.png;type=image/png" %API_URL%/apps/29/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa\spa2.png;type=image/png" %API_URL%/apps/29/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa\spa3.png;type=image/png" %API_URL%/apps/29/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\spa\spa4.png;type=image/png" %API_URL%/apps/29/screenshots - -echo. -echo App30 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app30-healthchecks.json -echo. -echo App30 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\healthchecks.jpg;type=image/jpg" %API_URL%/apps/30/logo -echo. -echo App30 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks1.png;type=image/png" %API_URL%/apps/30/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks2.png;type=image/png" %API_URL%/apps/30/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks3.png;type=image/png" %API_URL%/apps/30/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks4.png;type=image/png" %API_URL%/apps/30/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks5.png;type=image/png" %API_URL%/apps/30/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks6.png;type=image/png" %API_URL%/apps/30/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\healthchecks\healthchecks7.png;type=image/png" %API_URL%/apps/30/screenshots - -echo. -echo App31 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app31-ctfd.json -echo. -echo App31 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\ctfd.png;type=image/png" %API_URL%/apps/31/logo -echo. -echo App31 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\ctfd\ctfd1.png;type=image/png" %API_URL%/apps/31/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\ctfd\ctfd2.png;type=image/png" %API_URL%/apps/31/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\ctfd\ctfd3.png;type=image/png" %API_URL%/apps/31/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\ctfd\ctfd4.png;type=image/png" %API_URL%/apps/31/screenshots - -echo. -echo App32 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app32-juiceshop.json -echo. -echo App32 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\juiceshop.png;type=image/png" %API_URL%/apps/32/logo -echo. -echo App32 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\juiceshop\juiceshop1.png;type=image/png" %API_URL%/apps/32/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\juiceshop\juiceshop2.png;type=image/png" %API_URL%/apps/32/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\juiceshop\juiceshop3.png;type=image/png" %API_URL%/apps/32/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\juiceshop\juiceshop4.png;type=image/png" %API_URL%/apps/32/screenshots - -echo. -echo App33 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app33-adminer.json -echo. -echo App33 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\adminer.png;type=image/png" %API_URL%/apps/33/logo -echo. -echo App33 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\adminer\adminer1.png;type=image/png" %API_URL%/apps/33/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\adminer\adminer2.png;type=image/png" %API_URL%/apps/33/screenshots -echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\adminer\adminer3.png;type=image/png" %API_URL%/apps/33/screenshots - -echo. -echo App34 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app34-maildev.json -echo. -echo App34 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\maildev.png;type=image/png" %API_URL%/apps/34/logo -echo. -echo App34 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\maildev\maildev1.png;type=image/png" %API_URL%/apps/34/screenshots - -echo. -echo App35 -curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app35-changedetectionio.json -echo. -echo App35 logo -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\changedetectionio.svg;type=image/svg+xml" %API_URL%/apps/35/logo -echo. -echo App35 screenshots -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\changedetectionio\changedetectionio1.png;type=image/png" %API_URL%/apps/35/screenshots +echo App5 +curl -X POST %API_URL%/apps --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\app05-postgresql.json echo. -curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\screenshots\changedetectionio\changedetectionio2.png;type=image/png" %API_URL%/apps/35/screenshots +echo App5 logo +curl -X POST --header "Authorization: Bearer %token%" -F "file=@data\apps\images\logo\postgresql.svg;type=image/svg+xml" %API_URL%/apps/5/logo echo. echo --------------------- @@ -629,36 +190,6 @@ curl -X PATCH %API_URL%/apps/state/2 --header "Authorization: Bearer %token%" -- curl -X PATCH %API_URL%/apps/state/3 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json curl -X PATCH %API_URL%/apps/state/4 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json curl -X PATCH %API_URL%/apps/state/5 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/6 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/7 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/8 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/9 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/10 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/11 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/12 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/13 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/14 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/15 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/16 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/17 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/18 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/19 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/20 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/21 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/22 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/23 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/24 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/25 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/26 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/27 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/28 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/29 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/30 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/31 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/32 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/33 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/34 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json -curl -X PATCH %API_URL%/apps/state/35 --header "Authorization: Bearer %token%" --header "Content-Type: application/json" --header "Accept: application/json" -d @data\apps\activations\active.json echo. echo --------------------- diff --git a/src/test/shell/init.sh b/src/test/shell/init.sh index 6ea7073a49d2e89b403baefe0f396fe4369dda51..b5e9fca77589def08fc900dc95dcb5da031d1a89 100644 --- a/src/test/shell/init.sh +++ b/src/test/shell/init.sh @@ -73,568 +73,91 @@ curl -X POST $API_URL/mail/templates --header "Authorization: Bearer $TOKEN" --h echo curl -X POST $API_URL/mail/templates --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/mails/newActiveApp.json echo +curl -X POST $API_URL/mail/templates --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/mails/bulkRegistrationMail.json +echo +curl -X POST $API_URL/mail/templates --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/mails/bulkSSORegistrationMail.json +echo echo echo App1 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app01-librenms.json +curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app01-prometheus.json echo echo App1 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/librenms.svg;type=image/svg+xml" $API_URL/apps/1/logo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/prometheus.svg;type=image/svg+xml" $API_URL/apps/1/logo echo echo App1 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/librenms/librenms1.png;type=image/png" $API_URL/apps/1/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/librenms/librenms2.png;type=image/png" $API_URL/apps/1/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/prometheus/prometheus1.png;type=image/png" $API_URL/apps/1/screenshots +echo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/prometheus/prometheus2.png;type=image/png" $API_URL/apps/1/screenshots +echo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/prometheus/prometheus3.png;type=image/png" $API_URL/apps/1/screenshots +echo echo echo App2 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app02-oxidized.json +curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app02-grafana.json echo echo App2 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/oxidized.svg;type=image/svg+xml" $API_URL/apps/2/logo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/grafana.svg;type=image/svg+xml" $API_URL/apps/2/logo echo echo App2 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/oxidized/oxidized1.png;type=image/png" $API_URL/apps/2/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/grafana/grafana1.png;type=image/png" $API_URL/apps/2/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/oxidized/oxidized2.png;type=image/png" $API_URL/apps/2/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/grafana/grafana2.png;type=image/png" $API_URL/apps/2/screenshots +echo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/grafana/grafana3.png;type=image/png" $API_URL/apps/2/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/oxidized/oxidized3.png;type=image/png" $API_URL/apps/2/screenshots -echo +echo echo App3 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app03-nav.json +curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app03-uptime-kuma.json echo echo App3 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/nav.svg;type=image/svg+xml" $API_URL/apps/3/logo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/uptime-kuma.png;type=image/png" $API_URL/apps/3/logo echo echo App3 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/nav/nav1.png;type=image/png" $API_URL/apps/3/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/nav/nav2.png;type=image/png" $API_URL/apps/3/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/nav/nav3.png;type=image/png" $API_URL/apps/3/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/nav/nav4.png;type=image/png" $API_URL/apps/3/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/nav/nav5.png;type=image/png" $API_URL/apps/3/screenshots - -echo -echo App4 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app04-opennti.json -echo -echo App4 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/open-nti.svg;type=image/svg+xml" $API_URL/apps/4/logo -echo -echo App4 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/opennti/opennti1.png;type=image/png" $API_URL/apps/4/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/opennti/opennti2.png;type=image/png" $API_URL/apps/4/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/opennti/opennti3.png;type=image/png" $API_URL/apps/4/screenshots - -echo -echo App5 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app05-prometheus.json -echo -echo App5 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/prometheus.svg;type=image/svg+xml" $API_URL/apps/5/logo -echo -echo App5 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/prometheus/prometheus1.png;type=image/png" $API_URL/apps/5/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/prometheus/prometheus2.png;type=image/png" $API_URL/apps/5/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/prometheus/prometheus3.png;type=image/png" $API_URL/apps/5/screenshots -echo - -echo -echo App6 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app06-grafana.json -echo -echo App6 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/grafana.svg;type=image/svg+xml" $API_URL/apps/6/logo -echo -echo App6 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/grafana/grafana1.png;type=image/png" $API_URL/apps/6/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/grafana/grafana2.png;type=image/png" $API_URL/apps/6/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/grafana/grafana3.png;type=image/png" $API_URL/apps/6/screenshots -echo -echo App6 v2 -curl -X POST $API_URL/apps/version --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app06-grafana_v7.2.0.json -echo - -echo -echo App7 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app07-bastion.json -echo -echo App7 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/bastion.svg;type=image/svg+xml" $API_URL/apps/7/logo -echo -echo App7 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/bastion/bastion1.png;type=image/png" $API_URL/apps/7/screenshots -echo - -echo -echo App8 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app08-perfsonar-pwa.json -echo -echo App8 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/perfsonar.png;type=image/png" $API_URL/apps/8/logo -echo -echo App8 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa1.png;type=image/png" $API_URL/apps/8/screenshots -echo -echo App8 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa2.png;type=image/png" $API_URL/apps/8/screenshots -echo -echo App8 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa3.png;type=image/png" $API_URL/apps/8/screenshots -echo -echo App8 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa4.png;type=image/png" $API_URL/apps/8/screenshots -echo -echo App8 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-pwa/perfsonar-pwa5.png;type=image/png" $API_URL/apps/8/screenshots -echo - -echo -echo App9 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app09-librebooking.json -echo -echo App9 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/librebooking.png;type=image/png" $API_URL/apps/9/logo -echo -echo App9 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/librebooking/librebooking1.png;type=image/png" $API_URL/apps/9/screenshots -echo -echo App9 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/librebooking/librebooking2.png;type=image/png" $API_URL/apps/9/screenshots -echo -echo App9 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/librebooking/librebooking3.png;type=image/png" $API_URL/apps/9/screenshots -echo - -echo -echo App10 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app10-spa-inventory.json -echo -echo App10 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/spa.png;type=image/png" $API_URL/apps/10/logo -echo -echo App10 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa-inventory/spa-inventory1.png;type=image/png" $API_URL/apps/10/screenshots -echo -echo App10 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa-inventory/spa-inventory2.png;type=image/png" $API_URL/apps/10/screenshots -echo -echo App10 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa-inventory/spa-inventory3.png;type=image/png" $API_URL/apps/10/screenshots -echo -echo App10 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa-inventory/spa-inventory4.png;type=image/png" $API_URL/apps/10/screenshots -echo - -echo -echo App11 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app11-statping.json -echo -echo App11 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/statping.png;type=image/png" $API_URL/apps/11/logo -echo -echo App11 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/statping/statping1.png;type=image/png" $API_URL/apps/11/screenshots -echo -echo App11 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/statping/statping2.png;type=image/png" $API_URL/apps/11/screenshots -echo -echo App11 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/statping/statping3.png;type=image/png" $API_URL/apps/11/screenshots -echo - -echo -echo App12 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app12-perfsonar-maddash.json -echo -echo App12 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/perfsonar.png;type=image/png" $API_URL/apps/12/logo -echo -echo App12 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-maddash/perfsonar-maddash1.png;type=image/png" $API_URL/apps/12/screenshots -echo - -echo -echo App13 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app13-debian-repository.json -echo -echo App13 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/debian.svg;type=image/svg+xml" $API_URL/apps/13/logo -echo -echo App13 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/debian-repository/debian-repository1.png;type=image/png" $API_URL/apps/13/screenshots -echo -echo App13 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/debian-repository/debian-repository2.png;type=image/png" $API_URL/apps/13/screenshots -echo -echo App13 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/debian-repository/debian-repository3.png;type=image/png" $API_URL/apps/13/screenshots -echo -echo App13 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/debian-repository/debian-repository4.png;type=image/png" $API_URL/apps/13/screenshots -echo - -echo -echo App14 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app14-influxdb.json -echo -echo App14 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/influxdb.png;type=image/png" $API_URL/apps/14/logo -echo -echo App14 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/influxdb/influxdb1.png;type=image/png" $API_URL/apps/14/screenshots -echo -echo App14 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/influxdb/influxdb2.png;type=image/png" $API_URL/apps/14/screenshots -echo - -echo -echo App15 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app15-jenkins.json -echo -echo App15 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/jenkins.svg;type=image/svg+xml" $API_URL/apps/15/logo -echo -echo App15 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/jenkins/jenkins1.png;type=image/png" $API_URL/apps/15/screenshots -echo - -echo -echo App16 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app16-elasticstack.json -echo -echo App16 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/elk.svg;type=image/svg+xml" $API_URL/apps/16/logo -echo -echo App16 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/elasticstack/elk1.png;type=image/png" $API_URL/apps/16/screenshots -echo -echo App16 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/elasticstack/elk2.png;type=image/png" $API_URL/apps/16/screenshots -echo - -echo -echo App17 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app17-perfsonar-esmond.json -echo -echo App17 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/perfsonar.png;type=image/png" $API_URL/apps/17/logo -echo -echo App17 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-esmond/perfsonar-esmond1.png;type=image/png" $API_URL/apps/17/screenshots -echo - -echo -echo App18 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app18-wifimon.json -echo -echo App18 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/wifimon.png;type=image/png" $API_URL/apps/18/logo -echo -echo App18 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/wifimon/wifimon1.png;type=image/png" $API_URL/apps/18/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/wifimon/wifimon2.png;type=image/png" $API_URL/apps/18/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/wifimon/wifimon3.png;type=image/png" $API_URL/apps/18/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/wifimon/wifimon4.png;type=image/png" $API_URL/apps/18/screenshots -echo -echo App18 v2 -curl -X POST $API_URL/apps/version --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app18-wifimon_v1.6.0.json +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma1.jpg;type=image/jpg" $API_URL/apps/3/screenshots echo - -echo -echo App19 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app19-perfsonar-centralmanagement.json -echo -echo App19 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/perfsonar.png;type=image/png" $API_URL/apps/19/logo -echo -echo App19 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/perfsonar-centralmanagement/perfsonar-centralmanagement1.png;type=image/png" $API_URL/apps/19/screenshots -echo - -echo -echo App20 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app20-icinga.json -echo -echo App20 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/icinga.svg;type=image/svg+xml" $API_URL/apps/20/logo -echo -echo App20 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/icinga/icinga1.png;type=image/png" $API_URL/apps/20/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/icinga/icinga2.png;type=image/png" $API_URL/apps/20/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/icinga/icinga3.png;type=image/png" $API_URL/apps/20/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/icinga/icinga4.png;type=image/png" $API_URL/apps/20/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/icinga/icinga5.png;type=image/png" $API_URL/apps/20/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/icinga/icinga6.png;type=image/png" $API_URL/apps/20/screenshots -echo - -echo -echo App21 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app21-victoria-metrics.json -echo -echo App21 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/victoria-metrics.png;type=image/png" $API_URL/apps/21/logo -echo -echo App21 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/victoria-metrics/victoria-metrics1.png;type=image/png" $API_URL/apps/21/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/victoria-metrics/victoria-metrics2.png;type=image/png" $API_URL/apps/21/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/victoria-metrics/victoria-metrics3.png;type=image/png" $API_URL/apps/21/screenshots -echo - -echo -echo App22 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app22-synapse.json -echo -echo App22 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/synapse.png;type=image/png" $API_URL/apps/22/logo -echo -echo App22 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/synapse/synapse1.png;type=image/png" $API_URL/apps/22/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/synapse/synapse2.png;type=image/png" $API_URL/apps/22/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/synapse/synapse3.png;type=image/png" $API_URL/apps/22/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/synapse/synapse4.png;type=image/png" $API_URL/apps/22/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/synapse/synapse5.png;type=image/png" $API_URL/apps/22/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/synapse/synapse6.png;type=image/png" $API_URL/apps/22/screenshots -echo - -echo -echo App23 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app23-routinator.json -echo -echo App23 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/routinator.svg;type=image/svg+xml" $API_URL/apps/23/logo -echo -echo App23 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/routinator/routinator1.png;type=image/png" $API_URL/apps/23/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/routinator/routinator2.png;type=image/png" $API_URL/apps/23/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/routinator/routinator3.png;type=image/png" $API_URL/apps/23/screenshots -echo - -echo -echo App24 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app24-codimd.json -echo -echo App24 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/codimd.png;type=image/png" $API_URL/apps/24/logo -echo -echo App24 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/codimd/codimd1.png;type=image/png" $API_URL/apps/24/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/codimd/codimd2.png;type=image/png" $API_URL/apps/24/screenshots -echo - -echo -echo App25 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app25-webdav.json -echo -echo App25 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/webdav.svg;type=image/svg+xml" $API_URL/apps/25/logo -echo -echo App25 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/webdav/webdav1.png;type=image/png" $API_URL/apps/25/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/webdav/webdav2.png;type=image/png" $API_URL/apps/25/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/webdav/webdav3.png;type=image/png" $API_URL/apps/25/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/webdav/webdav4.png;type=image/png" $API_URL/apps/25/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/webdav/webdav5.png;type=image/png" $API_URL/apps/25/screenshots -echo - -echo -echo App26 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app26-uptime-kuma.json -echo -echo App26 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/uptime-kuma.png;type=image/png" $API_URL/apps/26/logo -echo -echo App26 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma1.jpg;type=image/jpg" $API_URL/apps/26/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma2.jpg;type=image/jpg" $API_URL/apps/26/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma2.jpg;type=image/jpg" $API_URL/apps/3/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma3.jpg;type=image/jpg" $API_URL/apps/26/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma3.jpg;type=image/jpg" $API_URL/apps/3/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma4.jpg;type=image/jpg" $API_URL/apps/26/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma4.jpg;type=image/jpg" $API_URL/apps/3/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma5.jpg;type=image/jpg" $API_URL/apps/26/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma5.jpg;type=image/jpg" $API_URL/apps/3/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma6.jpg;type=image/jpg" $API_URL/apps/26/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/uptime-kuma/uptime-kuma6.jpg;type=image/jpg" $API_URL/apps/3/screenshots echo echo -echo App27 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app27-netbox.json -echo -echo App27 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/netbox.svg;type=image/svg+xml" $API_URL/apps/27/logo -echo -echo App27 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/netbox/netbox1.png;type=image/png" $API_URL/apps/27/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/netbox/netbox2.png;type=image/png" $API_URL/apps/27/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/netbox/netbox3.png;type=image/png" $API_URL/apps/27/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/netbox/netbox4.png;type=image/png" $API_URL/apps/27/screenshots -echo - -echo -echo App28 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app28-zabbix.json -echo -echo App28 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/zabbix.png;type=image/png" $API_URL/apps/28/logo -echo -echo App28 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/zabbix/zabbix1.png;type=image/png" $API_URL/apps/28/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/zabbix/zabbix2.png;type=image/png" $API_URL/apps/28/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/zabbix/zabbix3.png;type=image/png" $API_URL/apps/28/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/zabbix/zabbix4.png;type=image/png" $API_URL/apps/28/screenshots -echo - -echo -echo App29 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app29-spa.json -echo -echo App29 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/spa.png;type=image/png" $API_URL/apps/29/logo -echo -echo App29 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa/spa1.png;type=image/png" $API_URL/apps/29/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa/spa2.png;type=image/png" $API_URL/apps/29/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa/spa3.png;type=image/png" $API_URL/apps/29/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/spa/spa4.png;type=image/png" $API_URL/apps/29/screenshots -echo - -echo -echo App30 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app30-healthchecks.json -echo -echo App30 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/healthchecks.jpg;type=image/jpg" $API_URL/apps/30/logo -echo -echo App30 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks1.png;type=image/png" $API_URL/apps/30/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks2.png;type=image/png" $API_URL/apps/30/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks3.png;type=image/png" $API_URL/apps/30/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks4.png;type=image/png" $API_URL/apps/30/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks5.png;type=image/png" $API_URL/apps/30/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks6.png;type=image/png" $API_URL/apps/30/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks7.png;type=image/png" $API_URL/apps/30/screenshots -echo - -echo -echo App31 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app31-ctfd.json -echo -echo App31 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/ctfd.png;type=image/png" $API_URL/apps/31/logo -echo -echo App31 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/ctfd/ctfd1.png;type=image/png" $API_URL/apps/31/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/ctfd/ctfd2.png;type=image/png" $API_URL/apps/31/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/ctfd/ctfd3.png;type=image/png" $API_URL/apps/31/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/ctfd/ctfd4.png;type=image/png" $API_URL/apps/31/screenshots -echo - -echo -echo App32 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app32-juiceshop.json -echo -echo App32 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/juiceshop.png;type=image/png" $API_URL/apps/32/logo -echo -echo App32 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/juiceshop/juiceshop1.png;type=image/png" $API_URL/apps/32/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/juiceshop/juiceshop2.png;type=image/png" $API_URL/apps/32/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/juiceshop/juiceshop3.png;type=image/png" $API_URL/apps/32/screenshots -echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/juiceshop/juiceshop4.png;type=image/png" $API_URL/apps/32/screenshots -echo - -echo -echo App33 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app33-adminer.json +echo App4 +curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app04-healthchecks.json echo -echo App33 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/adminer.png;type=image/png" $API_URL/apps/33/logo +echo App4 logo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/healthchecks.jpg;type=image/jpg" $API_URL/apps/4/logo echo -echo App33 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/adminer/adminer1.png;type=image/png" $API_URL/apps/33/screenshots +echo App4 screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks1.png;type=image/png" $API_URL/apps/4/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/adminer/adminer2.png;type=image/png" $API_URL/apps/33/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks2.png;type=image/png" $API_URL/apps/4/screenshots echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/adminer/adminer3.png;type=image/png" $API_URL/apps/33/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks3.png;type=image/png" $API_URL/apps/4/screenshots echo - +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks4.png;type=image/png" $API_URL/apps/4/screenshots echo -echo App34 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app34-maildev.json +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks5.png;type=image/png" $API_URL/apps/4/screenshots echo -echo App34 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/maildev.png;type=image/png" $API_URL/apps/34/logo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks6.png;type=image/png" $API_URL/apps/4/screenshots echo -echo App34 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/maildev/maildev1.png;type=image/png" $API_URL/apps/34/screenshots +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/healthchecks/healthchecks7.png;type=image/png" $API_URL/apps/4/screenshots echo echo -echo App35 -curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app35-changedetectionio.json -echo -echo App35 logo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/changedetectionio.svg;type=image/svg+xml" $API_URL/apps/35/logo -echo -echo App35 screenshots -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/changedetectionio/changedetectionio1.png;type=image/png" $API_URL/apps/35/screenshots +echo App5 +curl -X POST $API_URL/apps --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/app05-postgresql.json echo -curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/screenshots/changedetectionio/changedetectionio2.png;type=image/png" $API_URL/apps/35/screenshots +echo App5 logo +curl -X POST --header "Authorization: Bearer $TOKEN" -F "file=@data/apps/images/logo/postgresql.svg;type=image/svg+xml" $API_URL/apps/5/logo echo echo @@ -645,36 +168,6 @@ curl -X PATCH $API_URL/apps/state/2 --header "Authorization: Bearer $TOKEN" --he curl -X PATCH $API_URL/apps/state/3 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json curl -X PATCH $API_URL/apps/state/4 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json curl -X PATCH $API_URL/apps/state/5 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/6 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/7 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/8 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/9 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/10 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/11 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/12 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/13 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/14 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/15 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/16 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/17 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/18 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/19 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/20 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/21 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/22 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/23 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/24 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/25 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/26 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/27 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/28 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/29 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/30 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/31 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/32 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/33 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/34 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json -curl -X PATCH $API_URL/apps/state/35 --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --header "Accept: application/json" -d @data/apps/activations/active.json echo echo diff --git a/src/test/shell/tmp/README.md b/src/test/shell/tmp/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3df15a6629111a85b4ef5cbf82f0876866e2880f --- /dev/null +++ b/src/test/shell/tmp/README.md @@ -0,0 +1 @@ + ## Directory used to store temporary files during local tests \ No newline at end of file