diff --git a/.gitignore b/.gitignore index 48d318594..99eac4480 100644 --- a/.gitignore +++ b/.gitignore @@ -376,3 +376,18 @@ jdk_8_maven/em/external/rest/spring-batch-rest/target /jdk_8_maven/cs/rest/original/spring-ecommerce/target /jdk_8_maven/em/embedded/rest/spring-ecommerce/target /jdk_8_maven/em/external/rest/spring-ecommerce/target + +/jdk_21_maven/cs/rest-gui/microcks/target +/jdk_21_maven/cs/rest-gui/microcks/commons/model/target +/jdk_21_maven/cs/rest-gui/microcks/commons/util/target +/jdk_21_maven/cs/rest-gui/microcks/commons/util-el/target +/jdk_21_maven/cs/rest-gui/microcks/distro/uber/target +/jdk_21_maven/cs/rest-gui/microcks/distro/uber-async-minion/target +/jdk_21_maven/cs/rest-gui/microcks/webapp/target +/jdk_21_maven/cs/rest-gui/microcks/minions/async/target +/jdk_21_maven/cs/rest-gui/microcks/webapp/src/main/webapp/.angular +/jdk_21_maven/cs/rest-gui/microcks/webapp/src/main/webapp/dist +/jdk_21_maven/cs/rest-gui/microcks/webapp/src/main/webapp/node_modules + +/jdk_21_maven/em/embedded/rest-gui/microcks/target +/jdk_21_maven/em/external/rest-gui/microcks/target \ No newline at end of file diff --git a/README.md b/README.md index c7be7fd51..0f7f25588 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ For simplicity, all schemas are also available as JSON/YML files under the folde > **IMPORTANT**: More details (e.g., #LOCs and used databases) on these APIs can be found [in this table](statistics/table_emb.md). -### REST: Java/Kotlin (35) +### REST: Java/Kotlin (36) * **Bibliothek** (MIT), [jdk_17_gradle/cs/rest/bibliothek](jdk_17_gradle/cs/rest/bibliothek), from [https://github.com/PaperMC/bibliothek](https://github.com/PaperMC/bibliothek) @@ -96,6 +96,8 @@ For simplicity, all schemas are also available as JSON/YML files under the folde * **Market** (MIT), [jdk_11_maven/cs/rest-gui/market](jdk_11_maven/cs/rest-gui/market), from [https://github.com/aleksey-lukyanets/market](https://github.com/aleksey-lukyanets/market) +* **Microcks** (Apache), [jdk_21_maven/cs/rest-gui/microcks](jdk_21_maven/cs/rest-gui/microcks), from [https://github.com/microcks/microcks](https://github.com/microcks/microcks) + * **NCS**, [jdk_8_maven/cs/rest/artificial/ncs](jdk_8_maven/cs/rest/artificial/ncs), (not-known license, artificial numerical examples coming from different sources) * **News** (LGPL), [jdk_8_maven/cs/rest/artificial/news](jdk_8_maven/cs/rest/artificial/news), from [https://github.com/arcuri82/testing_security_development_enterprise_systems](https://github.com/arcuri82/testing_security_development_enterprise_systems) diff --git a/auth/microcks-auth.yaml b/auth/microcks-auth.yaml new file mode 100644 index 000000000..dece86673 --- /dev/null +++ b/auth/microcks-auth.yaml @@ -0,0 +1,17 @@ +auth: + - name: "ADMIN_1" + loginEndpointAuth: + payloadRaw: "username=admin&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54" + - name: "ADMIN_2" + loginEndpointAuth: + payloadRaw: "username=admin2&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54" + +authTemplate: + loginEndpointAuth: + verb: POST + externalEndpointURL: "http://localhost:8081/realms/microcks/protocol/openid-connect/token" + contentType: application/x-www-form-urlencoded + token: + extractFromField: /access_token + httpHeaderName: Authorization + headerPrefix: "Bearer " \ No newline at end of file diff --git a/dockerfiles/microcks.dockerfile b/dockerfiles/microcks.dockerfile new file mode 100644 index 000000000..9572bc8bd --- /dev/null +++ b/dockerfiles/microcks.dockerfile @@ -0,0 +1,17 @@ +FROM amazoncorretto:21-alpine-jdk + +COPY ./dist/microcks-sut.jar . +COPY ./dist/jacocoagent.jar . + + + +#ENV TOOL="undefined" +#ENV RUN="0" + +ENTRYPOINT \ + java \ +# unfortunately dumponexit is completely unreliable in Docker :( +# -javaagent:jacocoagent.jar=destfile=./jacoco/microcks__${TOOL}__${RUN}__jacoco.exec,append=false,dumponexit=true \ + -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \ + -DPOSTMAN_RUNNER_URL=http://postman:3000 -DSERVICES_UPDATE_INTERVAL='0 0 0/2 * * *' -DKEYCLOAK_URL=http://keycloak:8080 -DKEYCLOAK_PUBLIC_URL=http://localhost:${HOST_PORT:-8081} -DENABLE_CORS_POLICY=false -DCORS_REST_ALLOW_CREDENTIALS=true -DTEST_CALLBACK_URL=http://localhost:${HOST_PORT:-8080} -jar microcks-sut.jar \ + --server.port=8080 --spring.profiles.active=prod --grpc.server.port=0 --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:${HOST_PORT:-8081}/realms/microcks --spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://keycloak:${HOST_PORT:-8080}/realms/microcks/protocol/openid-connect/certs \ No newline at end of file diff --git a/dockerfiles/microcks.yaml b/dockerfiles/microcks.yaml new file mode 100644 index 000000000..c2a9e7c15 --- /dev/null +++ b/dockerfiles/microcks.yaml @@ -0,0 +1,80 @@ +services: + sut-microcks: + build: + dockerfile: ./dockerfiles/microcks.dockerfile + context: .. +# environment: +# TOOL: ${TOOL:-undefined} +# RUN: ${RUN:-0} + ports: + - "${HOST_PORT:-8080}:8080" + - "${JACOCO_PORT:-6300}:6300" +# volumes: + # default env does not work on volumes +# - ${JACOCODIR}:/jacoco + + mongodb: + image: mongo:7.0 + tmpfs: + - '/data/db' + + + environment: + MONGODB_REPLICA_SET_MODE: primary + ALLOW_EMPTY_PASSWORD: yes + + + + + + + + + keycloak: + image: quay.io/keycloak/keycloak:26.0.0 + + + environment: + KEYCLOAK_ADMIN: 'admin' + KEYCLOAK_ADMIN_PASSWORD: 'admin' + KC_HEALTH_ENABLED: 'true' + KC_METRICS_ENABLED: 'true' + + + + volumes: + - ../scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json:/opt/keycloak/data/import/microcks-realm.json + + + + healthcheck: + test: ['CMD', 'sh', '-c', "echo -e 'GET /health/live HTTP/1.1\r\nHost: localhost\r\n\r\n' > /dev/tcp/localhost/9000"] + interval: 30s + timeout: 30s + retries: 3 + + + ports: + - '${HOST_PORT:-8081}:8080' + + + + command: ['start-dev', '--hostname=http://localhost:${HOST_PORT:-8081}', '--import-realm', '--health-enabled=true'] + + + postman: + image: quay.io/microcks/microcks-postman-runtime:0.6.0 + + + + + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:3000/health'] + interval: 30s + timeout: 30s + retries: 3 + + + + + diff --git a/jdk_21_maven/cs/rest-gui/microcks/pom.xml b/jdk_21_maven/cs/rest-gui/microcks/pom.xml index 61eddc6ca..3e566bba6 100644 --- a/jdk_21_maven/cs/rest-gui/microcks/pom.xml +++ b/jdk_21_maven/cs/rest-gui/microcks/pom.xml @@ -102,32 +102,34 @@ deploy - - com.diffplug.spotless - spotless-maven-plugin - 2.39.0 - - - - - - ${multi-project.rootdir}/eclipse-formatter.xml - - - true - 3 - - - - - - - check - - compile - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml b/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml index da19e3e00..c7e76477b 100644 --- a/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml +++ b/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml @@ -50,6 +50,13 @@ + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.2.0 + + io.github.microcks microcks-util @@ -408,6 +415,11 @@ prod + + + true + + @@ -510,7 +522,11 @@ --spring.profiles.active=prod - exec + + microcks + sut + + diff --git a/jdk_21_maven/cs/rest-gui/pom.xml b/jdk_21_maven/cs/rest-gui/pom.xml index 1631896b3..7168da37e 100644 --- a/jdk_21_maven/cs/rest-gui/pom.xml +++ b/jdk_21_maven/cs/rest-gui/pom.xml @@ -14,6 +14,7 @@ webgoat + microcks diff --git a/jdk_21_maven/em/embedded/rest-gui/microcks/pom.xml b/jdk_21_maven/em/embedded/rest-gui/microcks/pom.xml new file mode 100644 index 000000000..f6691151e --- /dev/null +++ b/jdk_21_maven/em/embedded/rest-gui/microcks/pom.xml @@ -0,0 +1,64 @@ + + + + 4.0.0 + + + evomaster-benchmark-jdk21-em-embedded-rest-gui-microcks + jar + + + org.evomaster + evomaster-benchmark-jdk21-em-embedded-rest-gui + 3.4.1-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-parent + 3.3.10 + pom + import + + + + + + + io.github.microcks + microcks-app + 1.12.2-SNAPSHOT + + + org.mongodb + mongodb-driver-sync + 5.0.1 + + + org.mongodb + mongodb-driver-core + 5.0.1 + + + com.mongodb + java-spring-boot-mongodb-starter + 1.0.0 + + + org.testcontainers + testcontainers + compile + + + junit + junit + compile + 4.11 + + + + + \ No newline at end of file diff --git a/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/java/em/embedded/microcks/EmbeddedEvoMasterController.java b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/java/em/embedded/microcks/EmbeddedEvoMasterController.java new file mode 100644 index 000000000..7174e6126 --- /dev/null +++ b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/java/em/embedded/microcks/EmbeddedEvoMasterController.java @@ -0,0 +1,216 @@ +package em.embedded.microcks; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import io.github.microcks.MicrocksApplication; +import org.evomaster.client.java.controller.AuthUtils; +import org.evomaster.client.java.controller.EmbeddedSutController; +import org.evomaster.client.java.controller.InstrumentedSutStarter; +import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto; +import org.evomaster.client.java.controller.api.dto.SutInfoDto; +import org.evomaster.client.java.sql.DbSpecification; +import org.evomaster.client.java.controller.problem.ProblemInfo; +import org.evomaster.client.java.controller.problem.RestProblem; +import org.springframework.boot.SpringApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + + +/** + * Class used to start/stop the SUT. This will be controller by the EvoMaster process + */ + + +/** + * Class used to start/stop the SUT. This will be controller by the EvoMaster process + */ +public class EmbeddedEvoMasterController extends EmbeddedSutController { + + public static void main(String[] args) { + + int port = 40100; + if (args.length > 0) { + port = Integer.parseInt(args[0]); + } + + EmbeddedEvoMasterController controller = new EmbeddedEvoMasterController(port); + InstrumentedSutStarter starter = new InstrumentedSutStarter(controller); + + starter.start(); + } + + + private ConfigurableApplicationContext ctx; + + private static final int MONGODB_PORT = 27017; + private static final int KEYCLOAK_PORT = 8080; + private static final String ADMIN_USER = "admin"; + private static final String ADMIN_PASSWORD = "admin"; + private static final String REALM_JSON_PATH = "/opt/keycloak/data/import/microcks-realm.json"; + private static final String POSTMAN_IMAGE = "quay.io/microcks/microcks-postman-runtime:0.6.0"; + private static final int POSTMAN_PORT = 3000; + + private static final String MONGODB_VERSION = "7.0"; + + private static final String MONGODB_DATABASE_NAME = "test"; + + private static final GenericContainer mongodbContainer = new GenericContainer("mongo:" + MONGODB_VERSION) + .withTmpFs(Collections.singletonMap("/data/db", "rw")) + .withExposedPorts(MONGODB_PORT); + + private static final GenericContainer keycloakContainer = new GenericContainer( + DockerImageName.parse("quay.io/keycloak/keycloak:26.0.0") + ) + .withExposedPorts(KEYCLOAK_PORT) + .withEnv("KEYCLOAK_ADMIN", ADMIN_USER) + .withEnv("KEYCLOAK_ADMIN_PASSWORD", ADMIN_PASSWORD) + .withEnv("KC_HEALTH_ENABLED", "true") + .withEnv("KC_METRICS_ENABLED", "true") + .withCommand( + "start-dev", + "--hostname-strict=false", + "--import-realm", + "--health-enabled=true" + ) + .withClasspathResourceMapping("microcks-realm-sample.json", REALM_JSON_PATH, BindMode.READ_ONLY) + .waitingFor(Wait.forListeningPort()); + + private static final GenericContainer postmanContainer = new GenericContainer<>(DockerImageName.parse(POSTMAN_IMAGE)) + .withExposedPorts(POSTMAN_PORT) + .waitingFor(Wait.forHttp("/health") + .forPort(POSTMAN_PORT) + .withStartupTimeout(Duration.ofSeconds(30))) + .withStartupTimeout(Duration.ofSeconds(30)); + + private MongoClient mongoClient; + + public EmbeddedEvoMasterController() { + this(0); + } + + public EmbeddedEvoMasterController(int port) { + setControllerPort(port); + } + + + @Override + public String startSut() { + + mongodbContainer.start(); + keycloakContainer.start(); + postmanContainer.start(); + + mongoClient = MongoClients.create("mongodb://" + mongodbContainer.getContainerIpAddress() + ":" + mongodbContainer.getMappedPort(MONGODB_PORT)); + + System.setProperty("POSTMAN_RUNNER_URL", "http://" + postmanContainer.getContainerIpAddress() + ":" + postmanContainer.getMappedPort(POSTMAN_PORT)); + System.setProperty("SERVICES_UPDATE_INTERVAL", "0 0 0/2 * * *"); + System.setProperty("KEYCLOAK_URL", "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT)); + System.setProperty("KEYCLOAK_PUBLIC_URL", "http://localhost:" + keycloakContainer.getMappedPort(KEYCLOAK_PORT)); + System.setProperty("ENABLE_CORS_POLICY", "false"); + System.setProperty("CORS_REST_ALLOW_CREDENTIALS", "true"); + + ctx = SpringApplication.run(MicrocksApplication.class, + new String[]{"--server.port=0", + "--spring.profiles.active=prod", + "--grpc.server.port=0", + "--spring.data.mongodb.uri=" + "mongodb://" + mongodbContainer.getContainerIpAddress() + ":" + mongodbContainer.getMappedPort(MONGODB_PORT) + "/" + MONGODB_DATABASE_NAME, + "--spring.security.oauth2.resourceserver.jwt.issuer-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks", + "--spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/certs" + }); + + System.setProperty("TEST_CALLBACK_URL", "http://localhost:" + getSutPort()); + + return "http://localhost:" + getSutPort(); + } + + protected int getSutPort() { + return (Integer) ((Map) ctx.getEnvironment() + .getPropertySources().get("server.ports").getSource()) + .get("local.server.port"); + } + + + @Override + public boolean isSutRunning() { + return ctx != null && ctx.isRunning(); + } + + @Override + public void stopSut() { + ctx.stop(); + ctx.close(); + + mongodbContainer.stop(); + keycloakContainer.stop(); + postmanContainer.stop(); + + } + + @Override + public String getPackagePrefixesToCover() { + return "io.github.microcks."; + } + + @Override + public void resetStateOfSUT() { + mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop(); + } + + + @Override + public List getDbSpecifications() { + return null; + } + + + @Override + public List getInfoForAuthentication() { + //http://localhost:{port}/realms/microcks/protocol/openid-connect/token + String postEndpoint = "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/token"; + + String payloadTemplate = "username=%s&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54"; + + return Arrays.asList( + AuthUtils.getForJsonToken("ADMIN", + postEndpoint, + String.format(payloadTemplate, "admin"), + "/access_token", + "Bearer ", + "application/x-www-form-urlencoded"), + AuthUtils.getForJsonToken("ADMIN_2", + postEndpoint, + String.format(payloadTemplate, "admin2"), + "/access_token", + "Bearer ", + "application/x-www-form-urlencoded") + ); + } + + + @Override + public ProblemInfo getProblemInfo() { + return new RestProblem( + "http://localhost:" + getSutPort() + "/v3/api-docs", + null + ); + } + + @Override + public SutInfoDto.OutputFormat getPreferredOutputFormat() { + return SutInfoDto.OutputFormat.JAVA_JUNIT_5; + } + + @Override + public Object getMongoConnection() { + return mongoClient; + } +} diff --git a/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/resources/microcks-realm-sample.json b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/resources/microcks-realm-sample.json new file mode 100644 index 000000000..177a6ba45 --- /dev/null +++ b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/resources/microcks-realm-sample.json @@ -0,0 +1,176 @@ +{ + "id": "microcks", + "realm": "microcks", + "displayName": "Microcks", + "enabled": true, + "sslRequired": "none", + "registrationAllowed": false, + "users" : [ + { + "username" : "admin", + "enabled": true, + "credentials" : [ + { "type" : "password", + "value" : "microcks123" } + ], + "realmRoles": [], + "applicationRoles": { + "realm-management": [ "manage-users", "manage-clients" ], + "account": [ "manage-account" ], + "microcks-app": [ "user", "manager", "admin"] + } + }, + { + "username" : "admin2", + "enabled": true, + "credentials" : [ + { "type" : "password", + "value" : "microcks123" } + ], + "realmRoles": [], + "applicationRoles": { + "realm-management": [ "manage-users", "manage-clients" ], + "account": [ "manage-account" ], + "microcks-app": [ "user", "manager", "admin"] + } + }, + { + "username": "service-account-microcks-serviceaccount", + "enabled": true, + "serviceAccountClientId": "microcks-serviceaccount", + "clientRoles": { + "microcks-app": ["manager"] + } + } + ], + "roles": { + "realm": [], + "client": { + "microcks-app": [ + { + "name": "user", + "composite": false, + "clientRole": true, + "containerId": "microcks" + }, + { + "name": "admin", + "composite": false, + "clientRole": true, + "containerId": "microcks" + }, + { + "name": "manager", + "composite": false, + "clientRole": true, + "containerId": "microcks" + } + ] + } + }, + "groups": [ + { + "name": "microcks", + "path": "/microcks", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [ + { + "name": "manager", + "path": "/microcks/manager", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [] + } + ] + } + ], + "defaultRoles": [], + "requiredCredentials": [ "password" ], + "scopeMappings": [], + "clientScopeMappings": { + "microcks-app": [ + { + "client": "microcks-app-js", + "roles": [ + "manager", + "admin", + "user" + ] + } + ], + "realm-management": [ + { + "client": "microcks-app-js", + "roles": [ + "manage-users", + "manage-clients" + ] + } + ] + }, + "clients": [ + { + "clientId": "microcks-app-js", + "enabled": true, + "publicClient": true, + "redirectUris": [ + "*" + ], + "webOrigins": [ + "*" + ], + "fullScopeAllowed": false, + "protocolMappers": [ + { + "name": "microcks-group-mapper", + "protocol": "openid-connect", + "protocolMapper": "oidc-group-membership-mapper", + "consentRequired": false, + "config": { + "full.path": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "microcks-groups", + "userinfo.token.claim": "true" + } + } + ] + } + ], + "applications": [ + { + "name": "microcks-app", + "enabled": true, + "bearerOnly": true, + "defaultRoles": [ + "user" + ] + }, + { + "name": "microcks-serviceaccount", + "secret": "ab54d329-e435-41ae-a900-ec6b3fe15c54", + "enabled": true, + "bearerOnly": false, + "publicClient": false, + "standardFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": true, + "clientAuthenticatorType": "client-secret" + } + ], + "requiredActions": [ + { + "alias": "VERIFY_PROFILE", + "name": "Verify Profile", + "providerId": "VERIFY_PROFILE", + "enabled": false, + "defaultAction": false, + "priority": 90, + "config": {} + } + ], + "keycloakVersion": "10.0.1" +} diff --git a/jdk_21_maven/em/embedded/rest-gui/pom.xml b/jdk_21_maven/em/embedded/rest-gui/pom.xml index fcb11b60b..720eb346a 100644 --- a/jdk_21_maven/em/embedded/rest-gui/pom.xml +++ b/jdk_21_maven/em/embedded/rest-gui/pom.xml @@ -13,6 +13,7 @@ webgoat + microcks diff --git a/jdk_21_maven/em/external/rest-gui/microcks/pom.xml b/jdk_21_maven/em/external/rest-gui/microcks/pom.xml new file mode 100644 index 000000000..f4190e175 --- /dev/null +++ b/jdk_21_maven/em/external/rest-gui/microcks/pom.xml @@ -0,0 +1,76 @@ + + + + 4.0.0 + + evomaster-benchmark-jdk21-em-external-rest-gui-microcks + jar + + + org.evomaster + evomaster-benchmark-jdk21-em-external-rest-gui + 3.4.1-SNAPSHOT + + + + + + org.testcontainers + testcontainers + compile + + + junit + junit + compile + 4.11 + + + org.mongodb + mongodb-driver-sync + 5.0.1 + + + org.mongodb + mongodb-driver-core + 5.0.1 + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + microcks-evomaster-runner + + + + em.external.microcks.ExternalEvoMasterController + + org.evomaster.client.java.instrumentation.InstrumentingAgent + + org.evomaster.client.java.instrumentation.InstrumentingAgent + + true + true + + + + + + + + + + \ No newline at end of file diff --git a/jdk_21_maven/em/external/rest-gui/microcks/src/main/java/em/external/microcks/ExternalEvoMasterController.java b/jdk_21_maven/em/external/rest-gui/microcks/src/main/java/em/external/microcks/ExternalEvoMasterController.java new file mode 100644 index 000000000..ca7474f6d --- /dev/null +++ b/jdk_21_maven/em/external/rest-gui/microcks/src/main/java/em/external/microcks/ExternalEvoMasterController.java @@ -0,0 +1,301 @@ +package em.external.microcks; + + +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import org.evomaster.client.java.controller.AuthUtils; +import org.evomaster.client.java.controller.ExternalSutController; +import org.evomaster.client.java.controller.InstrumentedSutStarter; +import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto; +import org.evomaster.client.java.controller.api.dto.SutInfoDto; +import org.evomaster.client.java.sql.DbSpecification; +import org.evomaster.client.java.controller.problem.ProblemInfo; +import org.evomaster.client.java.controller.problem.RestProblem; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.sql.Connection; +import java.time.Duration; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class ExternalEvoMasterController extends ExternalSutController { + + private static final int DEFAULT_CONTROLLER_PORT = 40100; + + private static final int DEFAULT_SUT_PORT = 12345; + + private static final String MONGODB_VERSION = "7.0"; + + private static final int KEYCLOAK_PORT = 8080; + private static final String ADMIN_USER = "admin"; + private static final String ADMIN_PASSWORD = "admin"; + private static final String REALM_JSON_PATH = "/opt/keycloak/data/import/microcks-realm.json"; + private static final String POSTMAN_IMAGE = "quay.io/microcks/microcks-postman-runtime:0.6.0"; + private static final int POSTMAN_PORT = 3000; + private static final int MONGODB_PORT = 27017; + + private static final String MONGODB_DATABASE_NAME = "test"; + + + public static void main(String[] args) { + + int controllerPort = DEFAULT_CONTROLLER_PORT; + if (args.length > 0) { + controllerPort = Integer.parseInt(args[0]); + } + int sutPort = DEFAULT_SUT_PORT; + if (args.length > 1) { + sutPort = Integer.parseInt(args[1]); + } + String jarLocation = "cs/rest-gui/microcks/webapp/target"; + if (args.length > 2) { + jarLocation = args[2]; + } + if (!jarLocation.endsWith(".jar")) { + jarLocation += "/microcks-sut.jar"; + } + + int timeoutSeconds = 120; + if (args.length > 3) { + timeoutSeconds = Integer.parseInt(args[3]); + } + + String command = "java"; + if (args.length > 4) { + command = args[4]; + } + + ExternalEvoMasterController controller = + new ExternalEvoMasterController(controllerPort, jarLocation, sutPort, timeoutSeconds, command); + InstrumentedSutStarter starter = new InstrumentedSutStarter(controller); + + starter.start(); + } + + + private final int timeoutSeconds; + + private final int sutPort; + + + private String jarLocation; + private Connection sqlConnection; + private List dbSpecification; + + private MongoClient mongoClient; + + private final GenericContainer mongodb; + private final GenericContainer keycloakContainer; + private final GenericContainer postmanContainer; + + public ExternalEvoMasterController() { + this(DEFAULT_CONTROLLER_PORT, "cs/rest-gui/microcks/webapp/target/microcks-sut.jar", DEFAULT_SUT_PORT, 120, "java"); + } + + public ExternalEvoMasterController(String jarLocation) { + this(); + this.jarLocation = jarLocation; + } + + public ExternalEvoMasterController(int controllerPort, String jarLocation, int sutPort, int timeoutSeconds, String command) { + this.sutPort = sutPort; + this.jarLocation = jarLocation; + this.timeoutSeconds = timeoutSeconds; + setControllerPort(controllerPort); + + this.mongodb = new GenericContainer<>("mongo:" + MONGODB_VERSION) + .withTmpFs(Collections.singletonMap("/data/db", "rw")) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig( + new HostConfig() + .withPortBindings(new PortBinding( + Ports.Binding.bindPort(sutPort + 3), + new ExposedPort(MONGODB_PORT) + )) + )) + .withExposedPorts(MONGODB_PORT); + + this.keycloakContainer = new GenericContainer<>( + DockerImageName.parse("quay.io/keycloak/keycloak:26.0.0") + ) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig( + new HostConfig() + .withPortBindings(new PortBinding( + Ports.Binding.bindPort(sutPort + 2), + new ExposedPort(KEYCLOAK_PORT) + )) + )) + .withExposedPorts(KEYCLOAK_PORT) + .withEnv("KEYCLOAK_ADMIN", ADMIN_USER) + .withEnv("KEYCLOAK_ADMIN_PASSWORD", ADMIN_PASSWORD) + .withEnv("KC_HEALTH_ENABLED", "true") + .withEnv("KC_METRICS_ENABLED", "true") + .withCommand( + "start-dev", + "--hostname-strict=false", + "--import-realm", + "--health-enabled=true" + ) + .withClasspathResourceMapping("microcks-realm-sample.json", REALM_JSON_PATH, BindMode.READ_ONLY) + .waitingFor(Wait.forListeningPort()); + + this.postmanContainer = new GenericContainer<>(DockerImageName.parse(POSTMAN_IMAGE)) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig( + new HostConfig() + .withPortBindings(new PortBinding( + Ports.Binding.bindPort(sutPort + 1), + new ExposedPort(POSTMAN_PORT) + )) + )) + .withExposedPorts(POSTMAN_PORT) + .waitingFor(Wait.forHttp("/health") + .forPort(POSTMAN_PORT) + .withStartupTimeout(Duration.ofSeconds(30))) + .withStartupTimeout(Duration.ofSeconds(30)); + this.setNeedsJdk17Options(true); + setJavaCommand(command); + } + + @Override + public String[] getInputParameters() { + return new String[]{"--server.port="+sutPort, + "--spring.profiles.active=prod", + "--grpc.server.port=0", + "--spring.data.mongodb.uri=" + "mongodb://" + mongodb.getContainerIpAddress() + ":" + mongodb.getMappedPort(MONGODB_PORT) + "/" + MONGODB_DATABASE_NAME, + "--spring.security.oauth2.resourceserver.jwt.issuer-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks", + "--spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/certs" + }; + } + + @Override + public String[] getJVMParameters() { + return new String[]{ + "-DPOSTMAN_RUNNER_URL="+"http://" + postmanContainer.getContainerIpAddress() + ":" + postmanContainer.getMappedPort(POSTMAN_PORT), + "-DSERVICES_UPDATE_INTERVAL='0 0 0/2 * * *'", + "-DKEYCLOAK_URL=" + "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT), + "-DKEYCLOAK_PUBLIC_URL=" + "http://localhost:" + keycloakContainer.getMappedPort(KEYCLOAK_PORT), + "-DENABLE_CORS_POLICY=false", + "-DCORS_REST_ALLOW_CREDENTIALS=true", + "-DTEST_CALLBACK_URL=" + "http://localhost:" + sutPort + }; + } + + + @Override + public String getBaseURL() { + return "http://localhost:" + sutPort; + } + + @Override + public String getPathToExecutableJar() { + return jarLocation; + } + + @Override + public String getLogMessageOfInitializedServer() { + return "Started MicrocksApplication in "; + } + + @Override + public long getMaxAwaitForInitializationInSeconds() { + return timeoutSeconds; + } + + @Override + public void preStart() { + + mongodb.start(); + postmanContainer.start(); + keycloakContainer.start(); + + try { + mongoClient = MongoClients.create("mongodb://" + mongodb.getContainerIpAddress() + ":" + mongodb.getMappedPort(MONGODB_PORT)); + } catch (Exception e) { + System.out.println("ERROR: " + e.getMessage()); + throw new RuntimeException(e); + } + + } + + @Override + public void postStart() { + + } + + @Override + public void preStop() { + + } + + @Override + public void postStop() { + mongodb.stop(); + keycloakContainer.stop(); + postmanContainer.stop(); + } + + @Override + public String getPackagePrefixesToCover() { + return "io.github.microcks."; + } + + public void resetStateOfSUT() { + mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop(); + } + + @Override + public ProblemInfo getProblemInfo() { + return new RestProblem( + getBaseURL() + "/v3/api-docs", + null + ); + } + + @Override + public SutInfoDto.OutputFormat getPreferredOutputFormat() { + return SutInfoDto.OutputFormat.JAVA_JUNIT_5; + } + + @Override + public List getInfoForAuthentication() { + //http://localhost:{port}/realms/microcks/protocol/openid-connect/token + String postEndpoint = "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/token"; + + String payloadTemplate = "username=%s&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54"; + + return Arrays.asList( + AuthUtils.getForJsonToken("ADMIN", + postEndpoint, + String.format(payloadTemplate, "admin"), + "/access_token", + "Bearer ", + "application/x-www-form-urlencoded"), + AuthUtils.getForJsonToken("ADMIN_2", + postEndpoint, + String.format(payloadTemplate, "admin2"), + "/access_token", + "Bearer ", + "application/x-www-form-urlencoded") + ); + } + + + @Override + public List getDbSpecifications() { + return dbSpecification; + } + + @Override + public Object getMongoConnection() { + return mongoClient; + } + + +} diff --git a/jdk_21_maven/em/external/rest-gui/microcks/src/main/resources/microcks-realm-sample.json b/jdk_21_maven/em/external/rest-gui/microcks/src/main/resources/microcks-realm-sample.json new file mode 100644 index 000000000..177a6ba45 --- /dev/null +++ b/jdk_21_maven/em/external/rest-gui/microcks/src/main/resources/microcks-realm-sample.json @@ -0,0 +1,176 @@ +{ + "id": "microcks", + "realm": "microcks", + "displayName": "Microcks", + "enabled": true, + "sslRequired": "none", + "registrationAllowed": false, + "users" : [ + { + "username" : "admin", + "enabled": true, + "credentials" : [ + { "type" : "password", + "value" : "microcks123" } + ], + "realmRoles": [], + "applicationRoles": { + "realm-management": [ "manage-users", "manage-clients" ], + "account": [ "manage-account" ], + "microcks-app": [ "user", "manager", "admin"] + } + }, + { + "username" : "admin2", + "enabled": true, + "credentials" : [ + { "type" : "password", + "value" : "microcks123" } + ], + "realmRoles": [], + "applicationRoles": { + "realm-management": [ "manage-users", "manage-clients" ], + "account": [ "manage-account" ], + "microcks-app": [ "user", "manager", "admin"] + } + }, + { + "username": "service-account-microcks-serviceaccount", + "enabled": true, + "serviceAccountClientId": "microcks-serviceaccount", + "clientRoles": { + "microcks-app": ["manager"] + } + } + ], + "roles": { + "realm": [], + "client": { + "microcks-app": [ + { + "name": "user", + "composite": false, + "clientRole": true, + "containerId": "microcks" + }, + { + "name": "admin", + "composite": false, + "clientRole": true, + "containerId": "microcks" + }, + { + "name": "manager", + "composite": false, + "clientRole": true, + "containerId": "microcks" + } + ] + } + }, + "groups": [ + { + "name": "microcks", + "path": "/microcks", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [ + { + "name": "manager", + "path": "/microcks/manager", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [] + } + ] + } + ], + "defaultRoles": [], + "requiredCredentials": [ "password" ], + "scopeMappings": [], + "clientScopeMappings": { + "microcks-app": [ + { + "client": "microcks-app-js", + "roles": [ + "manager", + "admin", + "user" + ] + } + ], + "realm-management": [ + { + "client": "microcks-app-js", + "roles": [ + "manage-users", + "manage-clients" + ] + } + ] + }, + "clients": [ + { + "clientId": "microcks-app-js", + "enabled": true, + "publicClient": true, + "redirectUris": [ + "*" + ], + "webOrigins": [ + "*" + ], + "fullScopeAllowed": false, + "protocolMappers": [ + { + "name": "microcks-group-mapper", + "protocol": "openid-connect", + "protocolMapper": "oidc-group-membership-mapper", + "consentRequired": false, + "config": { + "full.path": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "microcks-groups", + "userinfo.token.claim": "true" + } + } + ] + } + ], + "applications": [ + { + "name": "microcks-app", + "enabled": true, + "bearerOnly": true, + "defaultRoles": [ + "user" + ] + }, + { + "name": "microcks-serviceaccount", + "secret": "ab54d329-e435-41ae-a900-ec6b3fe15c54", + "enabled": true, + "bearerOnly": false, + "publicClient": false, + "standardFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": true, + "clientAuthenticatorType": "client-secret" + } + ], + "requiredActions": [ + { + "alias": "VERIFY_PROFILE", + "name": "Verify Profile", + "providerId": "VERIFY_PROFILE", + "enabled": false, + "defaultAction": false, + "priority": 90, + "config": {} + } + ], + "keycloakVersion": "10.0.1" +} diff --git a/jdk_21_maven/em/external/rest-gui/pom.xml b/jdk_21_maven/em/external/rest-gui/pom.xml index a8d17d62e..c4028bd67 100644 --- a/jdk_21_maven/em/external/rest-gui/pom.xml +++ b/jdk_21_maven/em/external/rest-gui/pom.xml @@ -14,6 +14,7 @@ webgoat + microcks \ No newline at end of file diff --git a/scripts/dist.py b/scripts/dist.py index 7171c03d8..6b0314ec9 100755 --- a/scripts/dist.py +++ b/scripts/dist.py @@ -292,6 +292,9 @@ def build_jdk_21_maven(): copy(folder + "/cs/rest-gui/webgoat/target/webgoat-sut.jar", DIST) copy(folder + "/em/external/rest-gui/webgoat/target/webgoat-evomaster-runner.jar", DIST) + copy(folder + "/cs/rest-gui/microcks/webapp/target/microcks-sut.jar", DIST) + copy(folder + "/em/external/rest-gui/microcks/target/microcks-evomaster-runner.jar", DIST) + #################### def call_gradle(java_home, folder): env_vars = os.environ.copy() diff --git a/scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json b/scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json new file mode 100644 index 000000000..177a6ba45 --- /dev/null +++ b/scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json @@ -0,0 +1,176 @@ +{ + "id": "microcks", + "realm": "microcks", + "displayName": "Microcks", + "enabled": true, + "sslRequired": "none", + "registrationAllowed": false, + "users" : [ + { + "username" : "admin", + "enabled": true, + "credentials" : [ + { "type" : "password", + "value" : "microcks123" } + ], + "realmRoles": [], + "applicationRoles": { + "realm-management": [ "manage-users", "manage-clients" ], + "account": [ "manage-account" ], + "microcks-app": [ "user", "manager", "admin"] + } + }, + { + "username" : "admin2", + "enabled": true, + "credentials" : [ + { "type" : "password", + "value" : "microcks123" } + ], + "realmRoles": [], + "applicationRoles": { + "realm-management": [ "manage-users", "manage-clients" ], + "account": [ "manage-account" ], + "microcks-app": [ "user", "manager", "admin"] + } + }, + { + "username": "service-account-microcks-serviceaccount", + "enabled": true, + "serviceAccountClientId": "microcks-serviceaccount", + "clientRoles": { + "microcks-app": ["manager"] + } + } + ], + "roles": { + "realm": [], + "client": { + "microcks-app": [ + { + "name": "user", + "composite": false, + "clientRole": true, + "containerId": "microcks" + }, + { + "name": "admin", + "composite": false, + "clientRole": true, + "containerId": "microcks" + }, + { + "name": "manager", + "composite": false, + "clientRole": true, + "containerId": "microcks" + } + ] + } + }, + "groups": [ + { + "name": "microcks", + "path": "/microcks", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [ + { + "name": "manager", + "path": "/microcks/manager", + "attributes": {}, + "realmRoles": [], + "clientRoles": {}, + "subGroups": [] + } + ] + } + ], + "defaultRoles": [], + "requiredCredentials": [ "password" ], + "scopeMappings": [], + "clientScopeMappings": { + "microcks-app": [ + { + "client": "microcks-app-js", + "roles": [ + "manager", + "admin", + "user" + ] + } + ], + "realm-management": [ + { + "client": "microcks-app-js", + "roles": [ + "manage-users", + "manage-clients" + ] + } + ] + }, + "clients": [ + { + "clientId": "microcks-app-js", + "enabled": true, + "publicClient": true, + "redirectUris": [ + "*" + ], + "webOrigins": [ + "*" + ], + "fullScopeAllowed": false, + "protocolMappers": [ + { + "name": "microcks-group-mapper", + "protocol": "openid-connect", + "protocolMapper": "oidc-group-membership-mapper", + "consentRequired": false, + "config": { + "full.path": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "microcks-groups", + "userinfo.token.claim": "true" + } + } + ] + } + ], + "applications": [ + { + "name": "microcks-app", + "enabled": true, + "bearerOnly": true, + "defaultRoles": [ + "user" + ] + }, + { + "name": "microcks-serviceaccount", + "secret": "ab54d329-e435-41ae-a900-ec6b3fe15c54", + "enabled": true, + "bearerOnly": false, + "publicClient": false, + "standardFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": true, + "clientAuthenticatorType": "client-secret" + } + ], + "requiredActions": [ + { + "alias": "VERIFY_PROFILE", + "name": "Verify Profile", + "providerId": "VERIFY_PROFILE", + "enabled": false, + "defaultAction": false, + "priority": 90, + "config": {} + } + ], + "keycloakVersion": "10.0.1" +} diff --git a/scripts/dockerize/data/sut.csv b/scripts/dockerize/data/sut.csv index eaf6dc3ce..40b4e1d75 100644 --- a/scripts/dockerize/data/sut.csv +++ b/scripts/dockerize/data/sut.csv @@ -34,3 +34,4 @@ swagger-petstore,TRUE,"",8080,http://localhost:8080/api/v3/openapi.json,http://l http-patch-spring,TRUE,"",--server.port=8080,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,FALSE,"", spring-ecommerce,TRUE,-Dfile.encoding=ISO-8859-1,--server.port=8080 --spring.datasource.host=mongodb --spring.datasource.port=27017 --spring.datasource.database=test --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.redis.host=redis --spring.redis.port=6379 --spring.data.elasticsearch.cluster-name=elasticsearch --spring.data.elasticsearch.cluster-nodes=elasticsearch:9300 --spring.elasticsearch.rest.uris=elasticsearch:9200 --spring.data.elasticsearch.host=elasticsearch --spring.data.elasticsearch.port=9300 --spring.cache.type=NONE,http://localhost:8080/v2/api-docs,http://localhost:8080,FALSE,FALSE,"","[{""name"": ""mongodb"", ""image_name"": ""mongo:7.0"", ""port"": 27017.0, ""tmp_fs"": ""/data/db"", ""environment"": ""MONGODB_REPLICA_SET_MODE: primary;ALLOW_EMPTY_PASSWORD: yes"", ""volume"": ""../scripts/dockerize/data/additional_files/spring-ecommerce/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh;../scripts/dockerize/data/additional_files/spring-ecommerce/init.json:/fixtures/init.json"", ""health_check_command"": """"}, {""name"": ""redis"", ""image_name"": ""redis:7.0.11"", ""port"": 6379, ""tmp_fs"": """", ""environment"": """", ""volume"": """", ""health_check_command"": """"}, {""name"": ""elasticsearch"",""image_name"": ""docker.elastic.co/elasticsearch/elasticsearch:6.8.23"", ""port"": 9300, ""tmp_fs"": ""/usr/share/elasticsearch/data"", ""environment"": ""- discovery.type=single-node;- cluster.name=elasticsearch;- ES_JAVA_OPTS=-Xms512m -Xmx512m;- xpack.security.enabled=false"", ""volume"": """", ""health_check_command"": """"}]" quartz-manager,TRUE,,--server.port=8080 --quartz-manager.security.accounts.in-memory.users[0].username=foo --quartz-manager.security.accounts.in-memory.users[0].password=bar --quartz-manager.security.accounts.in-memory.users[0].roles[0]=admin --quartz-manager.security.accounts.in-memory.users[1].username=foo2 --quartz-manager.security.accounts.in-memory.users[1].password=bar --quartz-manager.security.accounts.in-memory.users[1].roles[0]=admin,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,FALSE,"", +microcks,TRUE,-DPOSTMAN_RUNNER_URL=http://postman:3000 -DSERVICES_UPDATE_INTERVAL='0 0 0/2 * * *' -DKEYCLOAK_URL=http://keycloak:8080 -DKEYCLOAK_PUBLIC_URL=http://localhost:${HOST_PORT:-8081} -DENABLE_CORS_POLICY=false -DCORS_REST_ALLOW_CREDENTIALS=true -DTEST_CALLBACK_URL=http://localhost:${HOST_PORT:-8080},--server.port=8080 --spring.profiles.active=prod --grpc.server.port=0 --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:${HOST_PORT:-8081}/realms/microcks --spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://keycloak:${HOST_PORT:-8080}/realms/microcks/protocol/openid-connect/certs,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,FALSE,"","[{""name"": ""mongodb"", ""image_name"": ""mongo:7.0"", ""tmp_fs"": ""/data/db"", ""environment"": ""MONGODB_REPLICA_SET_MODE: primary;ALLOW_EMPTY_PASSWORD: yes"", ""volume"": """", ""health_check_command"": """"},{""name"": ""keycloak"",""image_name"": ""quay.io/keycloak/keycloak:26.0.0"", ""command"":[""start-dev"", ""--hostname=http://localhost:${HOST_PORT:-8081}"", ""--import-realm"", ""--health-enabled=true""], ""port"": ""${HOST_PORT:-8081}:8080"", ""tmp_fs"": """", ""environment"": ""KEYCLOAK_ADMIN: 'admin';KEYCLOAK_ADMIN_PASSWORD: 'admin';KC_HEALTH_ENABLED: 'true';KC_METRICS_ENABLED: 'true'"", ""volume"": ""../scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json:/opt/keycloak/data/import/microcks-realm.json"", ""health_check_command"": [""CMD"", ""sh"", ""-c"", ""echo -e 'GET /health/live HTTP/1.1\r\nHost: localhost\r\n\r\n' > /dev/tcp/localhost/9000""]},{""name"": ""postman"", ""image_name"": ""quay.io/microcks/microcks-postman-runtime:0.6.0"", ""tmp_fs"": """", ""environment"": """", ""volume"": """", ""health_check_command"": [""CMD"", ""curl"", ""-f"", ""http://localhost:3000/health""]}]" diff --git a/scripts/dockerize/docker_generator.py b/scripts/dockerize/docker_generator.py index 072975609..967587d87 100644 --- a/scripts/dockerize/docker_generator.py +++ b/scripts/dockerize/docker_generator.py @@ -136,12 +136,13 @@ def generate_docker_compose(self): database_params = { 'name': db['name'] if 'name' in db else 'db', 'DATABASE_IMAGE_NAME': db['image_name'], - 'DATABASE_PORT': db['port'], + 'DATABASE_PORT': db['port'] if 'port' in db else None, 'TMP_FS': db['tmp_fs'], 'DATABASE_ENVIRONMENT': str(db['environment']).split(';') if str(db['environment']) != '' else None, 'DATABASE_VOLUME': str(db['volume']).split(';') if str(db['volume']) != '' else None, 'HEALTH_CHECK': health_check_command != "", - 'HEALTH_CHECK_COMMAND': health_check_command + 'HEALTH_CHECK_COMMAND': health_check_command, + 'COMMAND': db['command'] if 'command' in db else None, } database_image = database_template.render(database_params) db_images.append(database_image) diff --git a/scripts/dockerize/templates/db.template b/scripts/dockerize/templates/db.template index cb03dadb0..f6ec48114 100644 --- a/scripts/dockerize/templates/db.template +++ b/scripts/dockerize/templates/db.template @@ -23,4 +23,11 @@ timeout: 30s retries: 3 {% endif %} +{% if DATABASE_PORT %} + ports: + - '{{DATABASE_PORT}}' +{% endif %} +{% if COMMAND %} + command: {{COMMAND}} +{% endif %} \ No newline at end of file diff --git a/statistics/data.csv b/statistics/data.csv index 79194b98b..fda7d2a02 100644 --- a/statistics/data.csv +++ b/statistics/data.csv @@ -33,6 +33,7 @@ TRUE,spring-rest-example,REST,Java,JDK 17,Maven,32,1426,MySQL,MIT,9,FALSE,https: TRUE,swagger-petstore,REST,Java,JDK 8,Maven,23,1631,,Apache,19,FALSE,https://github.com/swagger-api/swagger-petstore TRUE,genome-nexus,REST,Java,JDK 8,Maven,405,30004,MongoDB,MIT,23,FALSE,https://github.com/genome-nexus/genome-nexus TRUE,market,REST,Java,JDK 11,Maven,124,9861,H2,MIT,13,TRUE,https://github.com/aleksey-lukyanets/market +TRUE,microcks,REST,Java,JDK 21,Maven,471,66186,MongoDB,Apache,88,TRUE,https://github.com/microcks/microcks TRUE,petclinic-graphql,GraphQL,Java,JDK 8,Maven,89,5212,PostgreSQL,Apache,15,FALSE,https://github.com/spring-petclinic/spring-petclinic-graphql TRUE,patio-api,GraphQL,Java,JDK 11,Gradle,178,18048,PostgreSQL,GPL,20,TRUE,https://github.com/patio-team/patio-api TRUE,timbuctoo,GraphQL,Java,JDK 11,Maven,1113,107729,Neo4j,GPL,18,TRUE,https://github.com/HuygensING/timbuctoo diff --git a/statistics/table_emb.md b/statistics/table_emb.md index 126979555..e1deed99e 100644 --- a/statistics/table_emb.md +++ b/statistics/table_emb.md @@ -6,6 +6,7 @@ |__graphql-scs__|GraphQL|577|13|11|Kotlin|JDK 8|Maven||| |__graphql-ncs__|GraphQL|548|8|6|Kotlin|JDK 8|Maven||| |__languagetool__|REST|174781|1385|2|Java|JDK 8|Maven||| +|__microcks__|REST|66186|471|88|Java|JDK 21|Maven|MongoDB|✓| |__ocvn__|REST|45521|526|258|Java|JDK 8|Maven|H2, MongoDB|✓| |__pay-publicapi__|REST|34576|377|10|Java|JDK 11|Maven|Redis|✓| |__genome-nexus__|REST|30004|405|23|Java|JDK 8|Maven|MongoDB||